This change fixes a packfile heap corruption that can happen when interacting with multiple packfiles concurrently across multiple threads. This is exacerbated by setting a lower mwindow open file limit. This change: * Renames most of the internal methods in pack.c to clearly indicate that they expect to be called with a certain lock held, making reasoning about the state of locks a bit easier. * Splits the `git_pack_file` lock in two: the one in `git_pack_file` only protects the `index_map`. The protection to `git_mwindow_file` is now in that struct. * Explicitly checks for freshness of the `git_pack_file` in `git_packfile_unpack_header`: this allows the mwindow implementation to close files whenever there is enough cache pressure, and `git_packfile_unpack_header` will reopen the packfile if needed. * After a call to `p_munmap()`, the `data` and `len` fields are poisoned with `NULL` to make use-after-frees more evident and crash rather than being open to the possibility of heap corruption. * Adds a test case to prevent this from regressing in the future. Fixes: #5591
| Name |
Last commit
|
Last update |
|---|---|---|
| .. | ||
| apply | Loading commit data... | |
| attr | Loading commit data... | |
| blame | Loading commit data... | |
| buf | Loading commit data... | |
| checkout | Loading commit data... | |
| cherrypick | Loading commit data... | |
| clar | Loading commit data... | |
| clone | Loading commit data... | |
| commit | Loading commit data... | |
| config | Loading commit data... | |
| core | Loading commit data... | |
| date | Loading commit data... | |
| delta | Loading commit data... | |
| describe | Loading commit data... | |
| diff | Loading commit data... | |
| fetchhead | Loading commit data... | |
| filter | Loading commit data... | |
| graph | Loading commit data... | |
| ignore | Loading commit data... | |
| index | Loading commit data... | |
| iterator | Loading commit data... | |
| mailmap | Loading commit data... | |
| merge | Loading commit data... | |
| message | Loading commit data... | |
| network | Loading commit data... | |
| notes | Loading commit data... | |
| object | Loading commit data... | |
| odb | Loading commit data... | |
| online | Loading commit data... | |
| pack | Loading commit data... | |
| patch | Loading commit data... | |
| path | Loading commit data... | |
| perf | Loading commit data... | |
| rebase | Loading commit data... | |
| refs | Loading commit data... | |
| remote | Loading commit data... | |
| repo | Loading commit data... | |
| reset | Loading commit data... | |
| resources | Loading commit data... | |
| revert | Loading commit data... | |
| revwalk | Loading commit data... | |
| stash | Loading commit data... | |
| status | Loading commit data... | |
| stream | Loading commit data... | |
| stress | Loading commit data... | |
| submodule | Loading commit data... | |
| threads | Loading commit data... | |
| trace | Loading commit data... | |
| transport | Loading commit data... | |
| transports/smart | Loading commit data... | |
| win32 | Loading commit data... | |
| worktree | Loading commit data... | |
| CMakeLists.txt | Loading commit data... | |
| README.md | Loading commit data... | |
| clar.c | Loading commit data... | |
| clar.h | Loading commit data... | |
| clar_libgit2.c | Loading commit data... | |
| clar_libgit2.h | Loading commit data... | |
| clar_libgit2_timer.c | Loading commit data... | |
| clar_libgit2_timer.h | Loading commit data... | |
| clar_libgit2_trace.c | Loading commit data... | |
| clar_libgit2_trace.h | Loading commit data... | |
| generate.py | Loading commit data... | |
| main.c | Loading commit data... | |
| precompiled.c | Loading commit data... | |
| precompiled.h | Loading commit data... | |
| valgrind-supp-mac.txt | Loading commit data... |