)]}'
{
  "commit": "30a33513ff6dc70af58e35680e54167d239ce419",
  "tree": "6cb2bc43600fdb97c565c8ab51c83d0814a7e46d",
  "parents": [
    "16804593e8b00c730415e838741a00ce8260c302"
  ],
  "author": {
    "name": "Ville Vesilehto",
    "email": "ville@vesilehto.fi",
    "time": "Sun Oct 11 20:55:16 2026 +0000"
  },
  "committer": {
    "name": "Nicola Murino",
    "email": "nicola.murino@gmail.com",
    "time": "Fri Oct 30 08:31:54 2026 -0700"
  },
  "message": "ssh: allocate name lists in one piece when unmarshaling\n\nparseNameList split a comma-separated name list with bytes.Split and\nthen converted each part to a string, allocating the [][]byte from\nSplit and a separate string for every name. A kexinit message has ten\nname lists. For example, the one sent by the OpenSSH 10.3 client holds\n68 names in 1594 bytes.\n\nInstead, convert the list to a string once and split that with\nstrings.Split. The client already does for the server-sig-algs\nextension, so a name list takes two allocations no matter how many\nnames it has.\n\nThe names are now substrings of the list they came from. findCommon\nreturned the agreed name from the client\u0027s list, which on a server is\nthe peer\u0027s, and the negotiated algorithms are kept for the lifetime of\nthe connection. They would have kept the peer\u0027s key exchange, host\nkey, cipher and compression lists alive. This is over 1 KB per\nconnection for an OpenSSH client. Return the name from a local list\ninstead, so that nothing from the peer\u0027s kexinit outlives the key\nexchange.\n\ngoos: darwin\ngoarch: arm64\npkg: golang.org/x/crypto/ssh\ncpu: Apple M1 Max\n                         │  base.txt   │               new.txt                │\n                         │   sec/op    │    sec/op     vs base                │\nUnmarshalKexInitMsg-10     3.809µ ± 2%   2.383µ ± 11%  -37.44% (p\u003d0.001 n\u003d20)\n\n                         │   base.txt   │                new.txt                 │\n                         │     B/op     │     B/op      vs base                  │\nUnmarshalKexInitMsg-10     5.188Ki ± 0%   2.789Ki ± 0%  -46.23% (p\u003d0.000 n\u003d20)\n\n                         │  base.txt  │              new.txt               │\n                         │ allocs/op  │ allocs/op   vs base                │\nUnmarshalKexInitMsg-10     126.00 ± 0%   30.00 ± 0%  -76.19% (p\u003d0.000 n\u003d20)\n\nThe other benchmarks in the package are unchanged.\n\nFixes golang/go#82099\n\nChange-Id: Id75e931af48632ffb2a107cbd8a6fd622c29f93e\nGitHub-Last-Rev: 271b8ad174aca8dc5b59ba3044d0cc882161d2fe\nGitHub-Pull-Request: golang/crypto#377\nReviewed-on: https://go-review.googlesource.com/c/crypto/+/848045\nReviewed-by: Nicola Murino \u003cnicola.murino@gmail.com\u003e\nReviewed-by: Junyang Shao \u003cshaojunyang@google.com\u003e\nReviewed-by: David Chase \u003cdrchase@google.com\u003e\nLUCI-TryBot-Result: golang-scoped@luci-project-accounts.iam.gserviceaccount.com \u003cgolang-scoped@luci-project-accounts.iam.gserviceaccount.com\u003e\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "544eb93d789b00b2ff4630c6cdee51ac0ae161fe",
      "old_mode": 33188,
      "old_path": "ssh/common.go",
      "new_id": "62d1b47b327e086470b0623c189e87944f8e6deb",
      "new_mode": 33188,
      "new_path": "ssh/common.go"
    },
    {
      "type": "modify",
      "old_id": "b5c4edc5bb148a53a174642225a6769a19b8c85d",
      "old_mode": 33188,
      "old_path": "ssh/messages.go",
      "new_id": "8c753be2d4ff13d9974953b5e42152789589738b",
      "new_mode": 33188,
      "new_path": "ssh/messages.go"
    }
  ]
}
