]> git.ipfire.org Git - thirdparty/git.git/commit
name-rev: avoid cutoff timestamp underflow
authorSZEDER Gábor <szeder.dev@gmail.com>
Tue, 24 Sep 2019 07:32:13 +0000 (09:32 +0200)
committerJunio C Hamano <gitster@pobox.com>
Sat, 28 Sep 2019 04:36:04 +0000 (13:36 +0900)
commit2e09c01232b1e1f5f383e62865b6049ff76270b3
tree6f5b57576597e432ef4f501e7048ef435d5b6a49
parent5fa0f5238b0cd46cfe7f6fa76c3f526ea98148d9
name-rev: avoid cutoff timestamp underflow

When 'git name-rev' is invoked with commit-ish parameters, it tries to
save some work, and doesn't visit commits older than the committer
date of the oldest given commit minus a one day worth of slop.  Since
our 'timestamp_t' is an unsigned type, this leads to a timestamp
underflow when the committer date of the oldest given commit is within
a day of the UNIX epoch.  As a result the cutoff timestamp ends up
far-far in the future, and 'git name-rev' doesn't visit any commits,
and names each given commit as 'undefined'.

Check whether subtracting the slop from the oldest committer date
would lead to an underflow, and use no cutoff in that case.  We don't
have a TIME_MIN constant, dddbad728c (timestamp_t: a new data type for
timestamps, 2017-04-26) didn't add one, so do it now.

Note that the type of the cutoff timestamp variable used to be signed
before 5589e87fd8 (name-rev: change a "long" variable to timestamp_t,
2017-05-20).  The behavior was still the same even back then, but the
underflow didn't happen when substracting the slop from the oldest
committer date, but when comparing the signed cutoff timestamp with
unsigned committer dates in name_rev().  IOW, this underflow bug is as
old as 'git name-rev' itself.

Helped-by: Johannes Sixt <j6t@kdbg.org>
Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/name-rev.c
git-compat-util.h
t/t6120-describe.sh