<feed xmlns='http://www.w3.org/2005/Atom'>
<title>git/pack.h, branch main</title>
<subtitle>Fork of git SCM with my patches.</subtitle>
<id>http://git.kilabit.info/git/atom?h=main</id>
<link rel='self' href='http://git.kilabit.info/git/atom?h=main'/>
<link rel='alternate' type='text/html' href='http://git.kilabit.info/git/'/>
<updated>2026-03-23T15:33:11Z</updated>
<entry>
<title>builtin/fsck: stop using `the_repository` when checking packed objects</title>
<updated>2026-03-23T15:33:11Z</updated>
<author>
<name>Patrick Steinhardt</name>
<email>ps@pks.im</email>
</author>
<published>2026-03-23T15:03:01Z</published>
<link rel='alternate' type='text/html' href='http://git.kilabit.info/git/commit/?id=1c5f77b6103adae5d45ae9ff24e9945b8f8b76c8'/>
<id>urn:sha1:1c5f77b6103adae5d45ae9ff24e9945b8f8b76c8</id>
<content type='text'>
We implicitly rely on `the_repository` when checking objects part of a
packfile. These objects are iterated over via `verify_pack()`, which is
provided by the packfile subsystem, and a callback function is then
invoked for each of the objects in that specific pack.

Unfortunately, it is not possible to provide a payload to the callback
function. Refactor `verify_pack()` to accept a payload that is passed
through to the callback so that we can inject the repository and get rid
of the use of `the_repository`.

Signed-off-by: Patrick Steinhardt &lt;ps@pks.im&gt;
Signed-off-by: Junio C Hamano &lt;gitster@pobox.com&gt;
</content>
</entry>
<entry>
<title>object-file: get rid of `the_repository` in `finalize_object_file()`</title>
<updated>2025-07-17T05:16:14Z</updated>
<author>
<name>Patrick Steinhardt</name>
<email>ps@pks.im</email>
</author>
<published>2025-07-17T04:56:33Z</published>
<link rel='alternate' type='text/html' href='http://git.kilabit.info/git/commit/?id=cbb388f3e53660c88220c40a8dddb976672ae03d'/>
<id>urn:sha1:cbb388f3e53660c88220c40a8dddb976672ae03d</id>
<content type='text'>
We implicitly depend on `the_repository` when moving an object file into
place in `finalize_object_file()`. Get rid of this global dependency by
passing in a repository.

Note that one might be pressed to inject an object database instead of a
repository. But the function doesn't really care about the ODB at all.
All it does is to move a file into place while checking whether there is
any collision. As such, the functionality it provides is independent of
the object database and only needs the repository as parameter so that
it can adjust permissions of the file we are about to finalize.

Signed-off-by: Patrick Steinhardt &lt;ps@pks.im&gt;
Signed-off-by: Junio C Hamano &lt;gitster@pobox.com&gt;
</content>
</entry>
<entry>
<title>pack-write: stop depending on `the_repository` and `the_hash_algo`</title>
<updated>2025-03-10T20:16:18Z</updated>
<author>
<name>Patrick Steinhardt</name>
<email>ps@pks.im</email>
</author>
<published>2025-03-10T07:13:22Z</published>
<link rel='alternate' type='text/html' href='http://git.kilabit.info/git/commit/?id=2582846f2fe21b23fe7c567e030510960f135160'/>
<id>urn:sha1:2582846f2fe21b23fe7c567e030510960f135160</id>
<content type='text'>
There are a couple of functions in "pack-write.c" that implicitly depend
on `the_repository` or `the_hash_algo`. Remove this dependency by
injecting the repository via a parameter and adapt callers accordingly.

Signed-off-by: Patrick Steinhardt &lt;ps@pks.im&gt;
Signed-off-by: Junio C Hamano &lt;gitster@pobox.com&gt;
</content>
</entry>
<entry>
<title>Merge branch 'kn/pack-write-with-reduced-globals'</title>
<updated>2025-02-03T18:23:34Z</updated>
<author>
<name>Junio C Hamano</name>
<email>gitster@pobox.com</email>
</author>
<published>2025-02-03T18:23:34Z</published>
<link rel='alternate' type='text/html' href='http://git.kilabit.info/git/commit/?id=b83a2f9006cdf5293370b1254f4f4cb2770c1b9f'/>
<id>urn:sha1:b83a2f9006cdf5293370b1254f4f4cb2770c1b9f</id>
<content type='text'>
Code clean-up.

* kn/pack-write-with-reduced-globals:
  pack-write: pass hash_algo to internal functions
  pack-write: pass hash_algo to `write_rev_file()`
  pack-write: pass hash_algo to `write_idx_file()`
  pack-write: pass repository to `index_pack_lockfile()`
  pack-write: pass hash_algo to `fixup_pack_header_footer()`
</content>
</entry>
<entry>
<title>Merge branch 'jk/pack-header-parse-alignment-fix'</title>
<updated>2025-01-28T21:02:23Z</updated>
<author>
<name>Junio C Hamano</name>
<email>gitster@pobox.com</email>
</author>
<published>2025-01-28T21:02:23Z</published>
<link rel='alternate' type='text/html' href='http://git.kilabit.info/git/commit/?id=f8b9821f7d4f5239911794d03ac74edf27d711e6'/>
<id>urn:sha1:f8b9821f7d4f5239911794d03ac74edf27d711e6</id>
<content type='text'>
It was possible for "git unpack-objects" and "git index-pack" to
make an unaligned access, which has been corrected.

* jk/pack-header-parse-alignment-fix:
  index-pack, unpack-objects: use skip_prefix to avoid magic number
  index-pack, unpack-objects: use get_be32() for reading pack header
  parse_pack_header_option(): avoid unaligned memory writes
  packfile: factor out --pack_header argument parsing
  bswap.h: squelch potential sparse -Wcast-truncate warnings
</content>
</entry>
<entry>
<title>pack-write: pass hash_algo to `write_rev_file()`</title>
<updated>2025-01-21T20:36:34Z</updated>
<author>
<name>Karthik Nayak</name>
<email>karthik.188@gmail.com</email>
</author>
<published>2025-01-19T11:19:29Z</published>
<link rel='alternate' type='text/html' href='http://git.kilabit.info/git/commit/?id=6b2aa7fd371c93df44cebff072bef193104f43f8'/>
<id>urn:sha1:6b2aa7fd371c93df44cebff072bef193104f43f8</id>
<content type='text'>
The `write_rev_file()` function uses the global `the_hash_algo` variable
to access the repository's hash_algo. To avoid global variable usage,
pass a hash_algo from the layers above. Also modify children functions
`write_rev_file_order()` and `write_rev_header()` to accept
'the_hash_algo'.

Altough the layers above could have access to the hash_algo internally,
simply pass in `the_hash_algo`. This avoids any compatibility issues and
bubbles up global variable usage to upper layers which can be eventually
resolved.

However, in `midx-write.c`, since all usage of global variables is
removed, don't reintroduce them and instead use the `repo` available in
the context.

Signed-off-by: Karthik Nayak &lt;karthik.188@gmail.com&gt;
Signed-off-by: Junio C Hamano &lt;gitster@pobox.com&gt;
</content>
</entry>
<entry>
<title>pack-write: pass hash_algo to `write_idx_file()`</title>
<updated>2025-01-21T20:36:34Z</updated>
<author>
<name>Karthik Nayak</name>
<email>karthik.188@gmail.com</email>
</author>
<published>2025-01-19T11:19:28Z</published>
<link rel='alternate' type='text/html' href='http://git.kilabit.info/git/commit/?id=7653e9af9b9ddfc465df50203c78f5c8569d8c79'/>
<id>urn:sha1:7653e9af9b9ddfc465df50203c78f5c8569d8c79</id>
<content type='text'>
The `write_idx_file()` function uses the global `the_hash_algo` variable
to access the repository's hash_algo. To avoid global variable usage,
pass a hash_algo from the layers above.

Since `stage_tmp_packfiles()` also resides in 'pack-write.c' and calls
`write_idx_file()`, update it to accept a `struct git_hash_algo` as a
parameter and pass it through to the callee.

Altough the layers above could have access to the hash_algo internally,
simply pass in `the_hash_algo`. This avoids any compatibility issues and
bubbles up global variable usage to upper layers which can be eventually
resolved.

Signed-off-by: Karthik Nayak &lt;karthik.188@gmail.com&gt;
Signed-off-by: Junio C Hamano &lt;gitster@pobox.com&gt;
</content>
</entry>
<entry>
<title>pack-write: pass repository to `index_pack_lockfile()`</title>
<updated>2025-01-21T20:36:34Z</updated>
<author>
<name>Karthik Nayak</name>
<email>karthik.188@gmail.com</email>
</author>
<published>2025-01-19T11:19:27Z</published>
<link rel='alternate' type='text/html' href='http://git.kilabit.info/git/commit/?id=e2f6f7658559246ea03015fc7b999af2cd20c122'/>
<id>urn:sha1:e2f6f7658559246ea03015fc7b999af2cd20c122</id>
<content type='text'>
The `index_pack_lockfile()` function uses the global `the_repository`
variable to access the repository. To avoid global variable usage, pass
the repository from the layers above.

Altough the layers above could have access to the repository internally,
simply pass in `the_repository`. This avoids any compatibility issues
and bubbles up global variable usage to upper layers which can be
eventually resolved.

Signed-off-by: Karthik Nayak &lt;karthik.188@gmail.com&gt;
Signed-off-by: Junio C Hamano &lt;gitster@pobox.com&gt;
</content>
</entry>
<entry>
<title>pack-write: pass hash_algo to `fixup_pack_header_footer()`</title>
<updated>2025-01-21T20:36:34Z</updated>
<author>
<name>Karthik Nayak</name>
<email>karthik.188@gmail.com</email>
</author>
<published>2025-01-19T11:19:26Z</published>
<link rel='alternate' type='text/html' href='http://git.kilabit.info/git/commit/?id=8244d01de6402606c9fb588ce2143aa629aa7d0e'/>
<id>urn:sha1:8244d01de6402606c9fb588ce2143aa629aa7d0e</id>
<content type='text'>
The `fixup_pack_header_footer()` function uses the global
`the_hash_algo` variable to access the repository's hash function. To
avoid global variable usage, pass a hash_algo from the layers above.

Altough the layers above could have access to the hash_algo internally,
simply pass in `the_hash_algo`. This avoids any compatibility issues and
bubbles up global variable usage to upper layers which can be eventually
resolved.

Signed-off-by: Karthik Nayak &lt;karthik.188@gmail.com&gt;
Signed-off-by: Junio C Hamano &lt;gitster@pobox.com&gt;
</content>
</entry>
<entry>
<title>index-pack, unpack-objects: use get_be32() for reading pack header</title>
<updated>2025-01-21T16:42:56Z</updated>
<author>
<name>Jeff King</name>
<email>peff@peff.net</email>
</author>
<published>2025-01-19T13:25:47Z</published>
<link rel='alternate' type='text/html' href='http://git.kilabit.info/git/commit/?id=f1299bff26a20b70bb5b8440526a2bd3c6de298a'/>
<id>urn:sha1:f1299bff26a20b70bb5b8440526a2bd3c6de298a</id>
<content type='text'>
Both of these commands read the incoming pack into a static unsigned
char buffer in BSS, and then parse it by casting the start of the buffer
to a struct pack_header. This can result in SIGBUS on some platforms if
the compiler doesn't place the buffer in a position that is properly
aligned for 4-byte integers.

This reportedly happens with unpack-objects (but not index-pack) on
sparc64 when compiled with clang (but not gcc). But we are definitely in
the wrong in both spots; since the buffer's type is unsigned char, we
can't depend on larger alignment. When it works it is only because we
are lucky.

We'll fix this by switching to get_be32() to read the headers (just like
the last few commits similarly switched us to put_be32() for writing
into the same buffer).

It would be nice to factor this out into a common helper function, but
the interface ends up quite awkward. Either the caller needs to hardcode
how many bytes we'll need, or it needs to pass us its fill()/use()
functions as pointers. So I've just fixed both spots in the same way;
this is not code that is likely to be repeated a third time (most of the
pack reading code uses an mmap'd buffer, which should be properly
aligned).

I did make one tweak to the shared code: our pack_version_ok() macro
expects us to pass the big-endian value we'd get by casting. We can
introduce a "native" variant which uses the host integer ordering.

Reported-by: Koakuma &lt;koachan@protonmail.com&gt;
Signed-off-by: Jeff King &lt;peff@peff.net&gt;
Signed-off-by: Junio C Hamano &lt;gitster@pobox.com&gt;
</content>
</entry>
</feed>
