summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2010-10-23 17:20:01 -0700
committerPaul Eggert <eggert@cs.ucla.edu>2010-10-23 17:24:38 -0700
commit7d93a082b6e3ece0b120a5150d2020c7fa11b2f5 (patch)
treebf963fe6dfed9a7451f2a6e73d972f16ec14c4c4
parentd5d82ecf3b0f370216c12e0f8163f0a5249da91e (diff)
downloadcoreutils-7d93a082b6e3ece0b120a5150d2020c7fa11b2f5.tar.xz
du: don't print junk when diagnosing out-of-range time stamps
* src/du.c (show_date): Fix call to fputs with a buffer that contains some uninitialized data. * tests/Makefile.am (TESTS): Add du/big-timestamp. * tests/du/bigtime: New file, which checks for the bug.
-rw-r--r--src/du.c5
-rw-r--r--tests/Makefile.am1
-rwxr-xr-xtests/du/bigtime45
3 files changed, 49 insertions, 2 deletions
diff --git a/src/du.c b/src/du.c
index 3d9257934..4951826ea 100644
--- a/src/du.c
+++ b/src/du.c
@@ -351,8 +351,9 @@ show_date (const char *format, struct timespec when)
if (! tm)
{
char buf[INT_BUFSIZE_BOUND (intmax_t)];
- error (0, 0, _("time %s is out of range"), timetostr (when.tv_sec, buf));
- fputs (buf, stdout);
+ char *when_str = timetostr (when.tv_sec, buf);
+ error (0, 0, _("time %s is out of range"), when_str);
+ fputs (when_str, stdout);
return;
}
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 41e0cbce7..84db367b1 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -346,6 +346,7 @@ TESTS = \
du/2g \
du/8gb \
du/basic \
+ du/bigtime \
du/deref \
du/deref-args \
du/exclude \
diff --git a/tests/du/bigtime b/tests/du/bigtime
new file mode 100755
index 000000000..0a7f32b6b
--- /dev/null
+++ b/tests/du/bigtime
@@ -0,0 +1,45 @@
+#!/bin/sh
+# Exercise du on a file with a big time stamp.
+
+# Copyright (C) 2010 Free Software Foundation, Inc.
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+. "${srcdir=.}/init.sh"; path_prepend_ ../src
+
+export LC_ALL=C
+export TZ=UTC0
+
+# 2**63 - 1
+bignum=9223372036854775807
+
+touch -d @$bignum future 2>/dev/null &&
+future_time=$(ls -l future) &&
+case "$future_time" in
+*" $bignum "*)
+ : ;;
+*' Dec 4 300627798676 '*)
+ skip_ "file system and localtime both handle big timestamps" ;;
+*)
+ skip_ "file system or localtime mishandles big time stamps: $future_time" ;;
+esac || skip_ "file system cannot represent big time stamps"
+
+printf "0\t$bignum\tfuture\n" > exp || framework_failure_
+printf "du: time $bignum is out of range\n" > err_ok || framework_failure_
+
+du --time future >out 2>err || fail=1
+compare out exp || fail=1
+compare err err_ok || fail=1
+
+Exit $fail