diff options
-rw-r--r-- | NEWS | 6 | ||||
-rw-r--r-- | src/context.c | 2 | ||||
-rw-r--r-- | src/diff.c | 3 | ||||
-rw-r--r-- | src/diff.h | 7 | ||||
-rw-r--r-- | tests/Makefile.am | 1 | ||||
-rwxr-xr-x | tests/timezone | 14 |
6 files changed, 32 insertions, 1 deletions
@@ -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] diff --git a/src/context.c b/src/context.c index b3cfa7d..adcfdb3 100644 --- a/src/context.c +++ b/src/context.c @@ -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) @@ -729,6 +729,9 @@ main (int argc, char **argv) #else time_format = "%Y-%m-%d %H:%M:%S %z"; #endif +#if !HAVE_TM_GMTOFF + localtz = tzalloc (getenv ("TZ")); +#endif } else { @@ -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]; diff --git a/tests/Makefile.am b/tests/Makefile.am index 83a7c9d..d98df82 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -22,6 +22,7 @@ TESTS = \ strcoll-0-names \ filename-quoting \ strip-trailing-cr \ + timezone \ colors XFAIL_TESTS = large-subopt diff --git a/tests/timezone b/tests/timezone new file mode 100755 index 0000000..52b9e18 --- /dev/null +++ b/tests/timezone @@ -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 |