]> git.ipfire.org Git - thirdparty/git.git/commit
pack-bitmap: reject pseudo-merge "sampleRate" of 0
authorTaylor Blau <me@ttaylorr.com>
Tue, 12 May 2026 00:47:06 +0000 (20:47 -0400)
committerJunio C Hamano <gitster@pobox.com>
Tue, 12 May 2026 01:36:18 +0000 (10:36 +0900)
commit03c7a30ceeaee8d70ff2e2cbd9b4bce896841bfa
tree90e9b5c2eec7221e3329c491966f8de24050e0b0
parent78e85e05f3341c70d1b9a147eef8c61478cc15f9
pack-bitmap: reject pseudo-merge "sampleRate" of 0

The "bitmapPseudoMerge.*.sampleRate" configuration controls what
fraction of unstable commits are included in each pseudo-merge group.
The config validation accepts values in the range `[0, 1]`, but a value
of exactly 0 causes a division by zero in `select_pseudo_merges_1()`:

    if (j % (uint32_t)(1.0 / group->sample_rate))

When `sample_rate` is 0, `1.0 / 0.0` produces `+inf`, and casting
infinity to `uint32_t` is undefined behavior in C. On most platforms
this yields 0, making the subsequent modulo operation (`j % 0`) a
fatal arithmetic trap.

This path was not previously reachable because an earlier bug caused
all pseudo-merge candidates to be classified as "stable" (where the
sampling rate is not used), regardless of their actual commit date. Now
that the date classification is fixed, the unstable path is exercised
and the division by zero can fire.

Fix this by changing the validation to require a strict lower bound and
thus reject 0.

Signed-off-by: Taylor Blau <me@ttaylorr.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/config/bitmap-pseudo-merge.adoc
pseudo-merge.c
t/t5333-pseudo-merge-bitmaps.sh