• Show log

    Commit

  • Hash : 322c15ee
    Author : lhchavez
    Date : 2020-08-01T18:24:41

    Make the pack and mwindow implementations data-race-free
    
    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