pkgsrc-Users archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

bug in git or NetBSD with --date near DST boundary



bup (in sysutils) has a test that generates 2000 commits with random
times in order to test pruning of of old backups.  While running this, I
found bad timezone values.  So far, the failure has only been observed
on NetBSD.  I have been able to reproduce this with just git, and not
any bup code.

Basically, times between 2100 and 21:59:00 EST on March 8, 2014 are bad.
Times after 22:00:00 do not cause real problems, but are wrongly
reported as DST (which doesn't start until one second after 01:59:59
EST, which is 03:00:00 EDT).

I tested localtime_r, which git uses, and it seems fine.  git has code
(see date.c:local_tzoffset()) to determine the timezone, and it seems
overly complicated.  I have not yet traced this code with the
problematic inputs.

I am curious if the following script produces any errors on systems
other than NetBSD, or if it produces errors on NetBSD.  I am also
curious where the actual bug is :-)

A good and then bad git commit looks like:

commit 5bde17741fc18459dd9f3a1ef751411309107c63
Author: Greg Troxel <gdt%lexort.com@localhost>
Date:   Sat Apr 8 21:31:44 1922 +38731400

    date 1394330400

commit bfa5eefdc60184b9f801a5872f5683697958b548
Author: Greg Troxel <gdt%lexort.com@localhost>
Date:   Sat Mar 8 20:59:59 2014 -0500

    date 1394330399

#!/bin/sh

# This program tests git's handling of --date with timeval arguments
# near the transition to DST in March of 2014, in the EST5EDT timezone.
# Somehow, a timezone offset of 44 years is computed.
# This script generates bad commits on:
#   NetBSD-7, git 2.11.0
#   NetBSD-6, git 2.11.0
#   NetBSD-5, git 2.10.0
# This script runs with fsck errors on:
#   MacOS 10.12.2, git 2,11.0

set -e
#set -x

uname -a
git --version

rm -rf test-repo.git
git init test-repo.git
cd test-repo.git

# detailed notes are from netbsd-7 amd64, git 2.11.0

#TZ=UTC
#all ok

TZ=EST5EDT
# 1394330399:
#   date -r: Sat Mar  8 20:59:59 EST 2014
#   UTC:     Sun Mar  9 01:59:59 UTC 2014
#   git:     Sat Mar 8 20:59:59 2014 -0500
# 1394330400:
#   date -r: Sat Mar  8 21:00:00 EST 2014
#   UTC:     Sun Mar  9 02:00:00 UTC 2014
#   git:     Wed May 15 04:00:00 2058 +38731400
# 1394334000:
#   date -r: Sat Mar  8 22:00:00 EST 2014
#   UTC:     Sun Mar  9 03:00:00 UTC 2014
#   git:     Sat Mar 8 23:00:00 2014 -0400

#TZ=CST4CDT
# 1394333999:
#   date -r: Sat Mar  8 22:59:59 CST 2014
#   UTC:     Sun Mar  9 02:59:59 UTC 2014
#   git:     Sat Mar 8 22:59:59 2014 -0400
# 1394334000:
#   date -r: Sat Mar  8 23:00:00 CST 2014
#   UTC:     Sun Mar  9 03:00:00 UTC 2014
#   git:     Wed May 15 06:00:00 2058 +38731500
# 1394337599:
#   git:     Wed May 15 07:59:59 2058 +38731600

export TZ

timeval=1394330340
steps=0
stepsmax=10000

while [ $steps -lt $stepsmax ]; do
    echo $timeval > when
    git add when
    git commit --date $timeval -m "date $timeval"

    timeval=`expr $timeval + 1`
    steps=`expr $steps + 1`
done

git log > ../LOG
git fsck > ../LOG.fsck 2>&1

Attachment: signature.asc
Description: PGP signature



Home | Main Index | Thread Index | Old Index