]> git.ipfire.org Git - thirdparty/coreutils.git/commitdiff
du: don't print junk when diagnosing out-of-range time stamps
authorPaul Eggert <eggert@cs.ucla.edu>
Sun, 24 Oct 2010 00:20:01 +0000 (17:20 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Sun, 24 Oct 2010 00:24:38 +0000 (17:24 -0700)
* 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.

src/du.c
tests/Makefile.am
tests/du/bigtime [new file with mode: 0755]

index 3d9257934b90adbe905cb61ead3584486851061b..4951826eae209e022cb8990379bfd7e58efb4860 100644 (file)
--- 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;
     }
 
index 41e0cbce762aa8418fe7dbaa70380f1f40f573e2..84db367b15ad6e2a9a4978867cdc9a869addcb3a 100644 (file)
@@ -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 (executable)
index 0000000..0a7f32b
--- /dev/null
@@ -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