git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH 2/9] bulk-checkin.c: store checksum directly

From
Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Date
Sep 9, 2021, 07:38 UTC
Message-ID
<87lf46faz9.fsf@evledraar.gmail.com>
In-Reply-To
<20b35ce0505d7bcc84b6fd68a33e0b6b1afa31e6.1631157880.git.me@ttaylorr.com>
On Wed, Sep 08 2021, Taylor Blau wrote:
Show 52 quoted lines
> finish_bulk_checkin() stores the checksum from finalize_hashfile() by
> writing to the `hash` member of `struct object_id`, but that hash has
> nothing to do with an object id (it's just a convenient location that
> happens to be sized correctly).
>
> Store the hash directly in an unsigned char array. This behaves the same
> as writing to the `hash` member, but makes the intent clearer (and
> avoids allocating an extra four bytes for the `algo` member of `struct
> object_id`).
>
> Signed-off-by: Taylor Blau <me@ttaylorr.com>
> ---
>  bulk-checkin.c | 12 ++++++------
>  1 file changed, 6 insertions(+), 6 deletions(-)
>
> diff --git a/bulk-checkin.c b/bulk-checkin.c
> index b023d9959a..6283bc8bd9 100644
> --- a/bulk-checkin.c
> +++ b/bulk-checkin.c
> @@ -25,7 +25,7 @@ static struct bulk_checkin_state {
>  
>  static void finish_bulk_checkin(struct bulk_checkin_state *state)
>  {
> -	struct object_id oid;
> +	unsigned char hash[GIT_MAX_RAWSZ];
>  	struct strbuf packname = STRBUF_INIT;
>  	int i;
>  
> @@ -37,11 +37,11 @@ static void finish_bulk_checkin(struct bulk_checkin_state *state)
>  		unlink(state->pack_tmp_name);
>  		goto clear_exit;
>  	} else if (state->nr_written == 1) {
> -		finalize_hashfile(state->f, oid.hash, CSUM_HASH_IN_STREAM | CSUM_FSYNC | CSUM_CLOSE);
> +		finalize_hashfile(state->f, hash, CSUM_HASH_IN_STREAM | CSUM_FSYNC | CSUM_CLOSE);
>  	} else {
> -		int fd = finalize_hashfile(state->f, oid.hash, 0);
> -		fixup_pack_header_footer(fd, oid.hash, state->pack_tmp_name,
> -					 state->nr_written, oid.hash,
> +		int fd = finalize_hashfile(state->f, hash, 0);
> +		fixup_pack_header_footer(fd, hash, state->pack_tmp_name,
> +					 state->nr_written, hash,
>  					 state->offset);
>  		close(fd);
>  	}
> @@ -49,7 +49,7 @@ static void finish_bulk_checkin(struct bulk_checkin_state *state)
>  	strbuf_addf(&packname, "%s/pack/pack-", get_object_directory());
>  	finish_tmp_packfile(&packname, state->pack_tmp_name,
>  			    state->written, state->nr_written,
> -			    &state->pack_idx_opts, oid.hash);
> +			    &state->pack_idx_opts, hash);
>  	for (i = 0; i < state->nr_written; i++)
>  		free(state->written[i]);

[This commit looks good, nothing needs to be fixed here, just a digression]:

This is a good change, FWIW I came up with in my version, and then ended up ejecting it to resist the urge to go on some general cleanup spree, I guess we can just fix *this* one :)

Anyway, I agree that this should be in & having it is good.

The code pattern being fixed here is more insidious than your commit message describes though, since fa33c3aae23 (bulk-checkin.c: convert to use struct object_id, 2015-03-13) when this was converted from "unsigned char sha1[20]" to "struct object_id" we've had a landmine waiting to be stepped on here.

The "oid" automatic variable will get initialized to some garbage, we then write to just the "hash" member, but leave the "algo" member in some undefined state.

Thus when you e.g. call oid_to_hex(&oid) here you might get a segfault, e.g. on my box because in hex.c we'll try to access &hash_algos[oid->algo], where oid->algo happens to be set to the garbage -9872.

If somebody's interested in some follow-up cleanup renaming the "hash" member to say "hash2" in hash.h, and compiling with "make -k" will find all the sites that are using it directly,

I looked in detail at a few, and many can either be converted to just use "struct object_id" without playing around with "oid.hash", and some share the bug/landmine being fixed here.

Previous: Taylor BlauNext: Taylor Blau
Message 43 of 81 in “pack-write,repack: prevent opening packs too early”
  1. 0/2 pack-write,repack: prevent opening packs too earlyTaylor Blau, Sep 1, 2021
  2. 1/2 pack-write.c: rename `.idx` file into place lastTaylor Blau, Sep 1, 2021
  3. 2/2 builtin/repack.c: move `.idx` files into place lastTaylor Blau, Sep 1, 2021
  4. Jeff KingSep 1, 2021
  5. Taylor BlauSep 1, 2021
  6. Jeff KingSep 1, 2021
  7. Taylor BlauSep 1, 2021
  8. Jeff KingSep 1, 2021
  9. Taylor BlauSep 1, 2021
  10. Jeff KingSep 7, 2021
  11. 0/3 rename *.idx file into place last (also after *.bitmap)Ævar Arnfjörð Bjarmason, Sep 7, 2021
  12. 1/3 pack-write: use more idiomatic strbuf usage for packname constructionÆvar Arnfjörð Bjarmason, Sep 7, 2021
  13. Taylor BlauSep 7, 2021
  14. Ævar Arnfjörð BjarmasonSep 7, 2021
  15. 2/3 pack-write: split up finish_tmp_packfile() functionÆvar Arnfjörð Bjarmason, Sep 7, 2021
  16. Taylor BlauSep 7, 2021
  17. 3/3 pack-write: rename *.idx file into place last (really!)Ævar Arnfjörð Bjarmason, Sep 7, 2021
  18. Taylor BlauSep 7, 2021
  19. Taylor BlauSep 7, 2021
  20. Ævar Arnfjörð BjarmasonSep 7, 2021
  21. 0/4 rename *.idx file into place last (also after *.bitmap)Ævar Arnfjörð Bjarmason, Sep 8, 2021
  22. 1/4 pack.h: line-wrap the definition of finish_tmp_packfile()Ævar Arnfjörð Bjarmason, Sep 8, 2021
  23. 2/4 pack-write: refactor renaming in finish_tmp_packfile()Ævar Arnfjörð Bjarmason, Sep 8, 2021
  24. Taylor BlauSep 8, 2021
  25. 3/4 pack-write: split up finish_tmp_packfile() functionÆvar Arnfjörð Bjarmason, Sep 8, 2021
  26. 4/4 pack-write: rename *.idx file into place last (really!)Ævar Arnfjörð Bjarmason, Sep 8, 2021
  27. Ævar Arnfjörð BjarmasonSep 8, 2021
  28. Ævar Arnfjörð BjarmasonSep 8, 2021
  29. Taylor BlauSep 8, 2021
  30. 0/3 prevent opening packs too earlyTaylor Blau, Sep 8, 2021
  31. 1/3 pack-write.c: rename `.idx` files into place lastTaylor Blau, Sep 8, 2021
  32. 2/3 builtin/repack.c: move `.idx` files into place lastTaylor Blau, Sep 8, 2021
  33. 3/3 builtin/index-pack.c: move `.idx` files into place lastTaylor Blau, Sep 8, 2021
  34. Ævar Arnfjörð BjarmasonSep 8, 2021
  35. Ævar Arnfjörð BjarmasonSep 9, 2021
  36. Taylor BlauSep 9, 2021
  37. Ævar Arnfjörð BjarmasonSep 9, 2021
  38. Ævar Arnfjörð BjarmasonSep 9, 2021
  39. Taylor BlauSep 9, 2021
  40. 0/9 packfile: avoid .idx rename racesTaylor Blau, Sep 9, 2021
  41. 1/9 pack.h: line-wrap the definition of finish_tmp_packfile()Taylor Blau, Sep 9, 2021
  42. 2/9 bulk-checkin.c: store checksum directlyTaylor Blau, Sep 9, 2021
  43. Ævar Arnfjörð BjarmasonSep 9, 2021
  44. 3/9 pack-write: refactor renaming in finish_tmp_packfile()Taylor Blau, Sep 9, 2021
  45. Junio C HamanoSep 9, 2021
  46. Taylor BlauSep 9, 2021
  47. Junio C HamanoSep 9, 2021
  48. Taylor BlauSep 9, 2021
  49. Junio C HamanoSep 10, 2021
  50. 4/9 pack-write.c: rename `.idx` files after `*.rev`Taylor Blau, Sep 9, 2021
  51. Ævar Arnfjörð BjarmasonSep 9, 2021
  52. Taylor BlauSep 9, 2021
  53. Junio C HamanoSep 9, 2021
  54. 5/9 builtin/repack.c: move `.idx` files into place lastTaylor Blau, Sep 9, 2021
  55. Junio C HamanoSep 9, 2021
  56. Taylor BlauSep 9, 2021
  57. 6/9 index-pack: refactor renaming in final()Taylor Blau, Sep 9, 2021
  58. Junio C HamanoSep 9, 2021
  59. Taylor BlauSep 9, 2021
  60. 8/9 pack-write: split up finish_tmp_packfile() functionTaylor Blau, Sep 9, 2021
  61. 7/9 builtin/index-pack.c: move `.idx` files into place lastTaylor Blau, Sep 9, 2021
  62. Ævar Arnfjörð BjarmasonSep 9, 2021
  63. Junio C HamanoSep 9, 2021
  64. 9/9 pack-objects: rename .idx files into place after .bitmap filesTaylor Blau, Sep 9, 2021
  65. Ævar Arnfjörð BjarmasonSep 9, 2021
  66. Junio C HamanoSep 9, 2021
  67. Taylor BlauSep 9, 2021
  68. Ævar Arnfjörð BjarmasonSep 9, 2021
  69. Taylor BlauSep 9, 2021
  70. Junio C HamanoSep 9, 2021
  71. 0/9 packfile: avoid .idx rename racesTaylor Blau, Sep 9, 2021
  72. 1/9 pack.h: line-wrap the definition of finish_tmp_packfile()Taylor Blau, Sep 9, 2021
  73. 2/9 bulk-checkin.c: store checksum directlyTaylor Blau, Sep 9, 2021
  74. 3/9 pack-write: refactor renaming in finish_tmp_packfile()Taylor Blau, Sep 9, 2021
  75. 4/9 pack-write.c: rename `.idx` files after `*.rev`Taylor Blau, Sep 9, 2021
  76. 5/9 builtin/repack.c: move `.idx` files into place lastTaylor Blau, Sep 9, 2021
  77. 6/9 index-pack: refactor renaming in final()Taylor Blau, Sep 9, 2021
  78. 8/9 pack-write: split up finish_tmp_packfile() functionTaylor Blau, Sep 9, 2021
  79. 7/9 builtin/index-pack.c: move `.idx` files into place lastTaylor Blau, Sep 9, 2021
  80. 9/9 pack-objects: rename .idx files into place after .bitmap filesTaylor Blau, Sep 9, 2021
  81. Junio C HamanoSep 10, 2021

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.