reftable/stack: fix use of unseeded randomness

When writing a new reftable stack, Git will first create the stack with a random suffix so that concurrent updates will not try to write to the same file. This random suffix is computed via a call to rand(3P). But we never seed the function via srand(3P), which means that the suffix is in fact always the same. Fix this bug by using `git_rand()` instead, which does not need to be initialized. While this function is likely going to be slower depending on the platform, this slowness should not matter in practice as we only use it when writing a new reftable stack. Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Patrick Steinhardt committed Dec 11, 2023 at 10:07 UTC 9abda98149e0f164ac0532fc6ca89b337049b9c3
2 files changed +4 -4
reftable/readwrite_test.c
+3 -3
@@ -141,8 +141,8 @@ static void test_log_buffer_size(void)
141 */
142 uint8_t hash1[GIT_SHA1_RAWSZ], hash2[GIT_SHA1_RAWSZ];
143 for (i = 0; i < GIT_SHA1_RAWSZ; i++) {
144 - hash1[i] = (uint8_t)(rand() % 256);
145 - hash2[i] = (uint8_t)(rand() % 256);
144 + hash1[i] = (uint8_t)(git_rand() % 256);
145 + hash2[i] = (uint8_t)(git_rand() % 256);
146 }
147 log.value.update.old_hash = hash1;
148 log.value.update.new_hash = hash2;
@@ -320,7 +320,7 @@ static void test_log_zlib_corruption(void)
320 };
321
322 for (i = 0; i < sizeof(message) - 1; i++)
323 - message[i] = (uint8_t)(rand() % 64 + ' ');
323 + message[i] = (uint8_t)(git_rand() % 64 + ' ');
324
325 reftable_writer_set_limits(w, 1, 1);
326
reftable/stack.c
+1 -1
@@ -434,7 +434,7 @@ int reftable_stack_add(struct reftable_stack *st,
434 static void format_name(struct strbuf *dest, uint64_t min, uint64_t max)
435 {
436 char buf[100];
437 - uint32_t rnd = (uint32_t)rand();
437 + uint32_t rnd = (uint32_t)git_rand();
438 snprintf(buf, sizeof(buf), "0x%012" PRIx64 "-0x%012" PRIx64 "-%08x",
439 min, max, rnd);
440 strbuf_reset(dest);