)]}'
{
  "commit": "a083cee009c57f61ecbc110250fba58c65cbcb38",
  "tree": "9654b99d482633f129aa24a0fe33e5d5ea4402df",
  "parents": [
    "984e522f6d819d835dee4bedd49f99eb555dbe48",
    "303dafdc110da965b9b4b376dfd91f34d95b82da"
  ],
  "author": {
    "name": "Guillaume Gomez",
    "email": "contact@guillaume-gomez.fr",
    "time": "Sat Aug 29 22:46:00 2026 +0200"
  },
  "committer": {
    "name": "GitHub",
    "email": "noreply@github.com",
    "time": "Sat Aug 29 22:46:00 2026 +0200"
  },
  "message": "Rollup merge of #161975 - matthew-demidoff:btree-split-off-panic-safety, r\u003dnia-e\n\nAbort instead of unwinding out of an inconsistent BTreeMap::split_off\n\nFixes rust-lang/rust#158165. Supersedes rust-lang/rust#161784, which I had to abandon after a bad force-push from a shallow clone left its head detached.\n\n`BTreeMap::split_off` runs the caller\u0027s `Ord`/`Borrow` impl via `search_node` inside `Root::split_off`\u0027s descent. After the first `move_suffix`, the two roots alias the same values through structurally invalid trees until the borders are fixed; a comparator panic there unwinds with a stale length and double-frees on later iteration or drop. It is reachable from `#![forbid(unsafe_code)]` on stable (reproducer on the issue).\n\nGuard the descent loop with an abort-on-panic `PanicGuard`, as `btree::mem::replace` already does. `catch_unwind` isnt available in `alloc` (no_std), and I kept an inline guard rather than the unstable `DropGuard`. It is armed once before the loop; the first `search_node` stays outside it, since a panic there can still unwind safely (nothing has moved yet).\n\nVerified with Miri: the reproducer goes from a double-free to a clean abort, and normal multi-level splits are unaffected. Adds a happy-path regression test.\n\nCredit to @ostrowr for the report and to rust-lang/rust#158710 for the original approach.\n\nr? @nia-e\n",
  "tree_diff": []
}
