diff: fix timezone bug on Solaris

Problem reported by Vladimir Marek (bug#51228).
* NEWS: Mention this.
* src/context.c (print_context_label): Pass localtz to nstrftime,
instead of always passing 0.
* src/diff.c (main) [!HAVE_TM_GMTOFF]:
Initialize localtz if time_format uses %z.
* src/diff.h (localtz): New decl.
* tests/Makefile.am (TESTS): Add timezone.
* tests/timezone: New test.
This commit is contained in:
Paul Eggert 2021-10-15 18:53:55 -07:00
parent 08b103ff4d
commit 074cbe590b
6 changed files with 32 additions and 1 deletions

6
NEWS
View File

@ -2,6 +2,12 @@ GNU diffutils NEWS -*- outline -*-
* Noteworthy changes in release ?.? (????-??-??) [?]
** Bug fixes
diff -c and -u no longer output incorrect timezones in headers
on platforms like Solaris where struct tm lacks tm_gmtoff.
[bug#51228 introduced in 3.4]
* Noteworthy changes in release 3.8 (2021-08-01) [stable]

View File

@ -52,7 +52,7 @@ print_context_label (char const *mark,
INT_STRLEN_BOUND (time_t) + 11)];
struct tm const *tm = localtime (&inf->stat.st_mtime);
int nsec = get_stat_mtime_ns (&inf->stat);
if (! (tm && nstrftime (buf, sizeof buf, time_format, tm, 0, nsec)))
if (! (tm && nstrftime (buf, sizeof buf, time_format, tm, localtz, nsec)))
{
verify (TYPE_IS_INTEGER (time_t));
if (LONG_MIN <= TYPE_MINIMUM (time_t)

View File

@ -728,6 +728,9 @@ main (int argc, char **argv)
time_format = "%Y-%m-%d %H:%M:%S.%N %z";
#else
time_format = "%Y-%m-%d %H:%M:%S %z";
#endif
#if !HAVE_TM_GMTOFF
localtz = tzalloc (getenv ("TZ"));
#endif
}
else

View File

@ -155,6 +155,13 @@ XTERN bool ignore_file_name_case;
(--no-dereference). */
XTERN bool no_dereference_symlinks;
/* Local timezone for 'c' output headers, if needed. */
#if HAVE_TM_GMTOFF
# define localtz 0 /* Placeholder since localtz is never needed. */
#else
XTERN timezone_t localtz;
#endif
/* File labels for '-c' output headers (--label). */
XTERN char *file_label[2];

View File

@ -22,6 +22,7 @@ TESTS = \
strcoll-0-names \
filename-quoting \
strip-trailing-cr \
timezone \
colors
XFAIL_TESTS = large-subopt

14
tests/timezone Executable file
View File

@ -0,0 +1,14 @@
#!/bin/sh
# In diff 3.4 through 3.8, this would output the wrong timezone on Solaris.
. "${srcdir=.}/init.sh"; path_prepend_ ../src
fail=0
echo a >a || fail=1
case $(LC_ALL=C TZ=EST5 diff -u /dev/null a) in
*' -0500'*) ;;
*) fail=1 ;;
esac
Exit $fail