tests: avoid a false positive due to overflow on Linux/HPPA
authorPádraig Brady <P@draigBrady.com>
Wed, 4 Jan 2012 23:33:20 +0000 (23:33 +0000)
committerPádraig Brady <P@draigBrady.com>
Thu, 5 Jan 2012 15:12:16 +0000 (15:12 +0000)
* tests/misc/timeout-parameters: Verify that the timer doesn't
fire immediately in the problematic range, and avoid overflow
checks in that case.
* man/timeout.x: Mention the possible bug.

Reported by Bruno Haible

man/timeout.x
tests/misc/timeout-parameters

index 19ebed3..41b4295 100644 (file)
@@ -4,3 +4,5 @@ timeout \- run a command with a time limit
 .\" Add any additional description here
 [SEE ALSO]
 kill(1)
+[BUGS]
+Some platforms don't curently support timeouts beyond 2038
index fa380d7..c7d6630 100755 (executable)
@@ -35,26 +35,33 @@ test $? = 125 || fail=1
 timeout 42D sleep 0
 test $? = 125 || fail=1
 
-# timeout overflow
-timeout $UINT_OFLOW sleep 0
-test $? = 0 || fail=1
-
-# timeout overflow
-timeout $(expr $UINT_MAX / 86400 + 1)d sleep 0
-test $? = 0 || fail=1
-
-# timeout overflow
-timeout 999999999999999999999999999999999999999999999999999999999999d sleep 0
-test $? = 0 || fail=1
+# It was seen on 32 bit Linux/HPPA that a kernel time_t overflowed,
+# thus causing the timer to fire immediately.
+# So verify that doesn't happen before checking large timeouts
+KERNEL_OVERFLOW_LIMIT=$(expr $TIME_T_MAX - $(date +%s) + 100)
+timeout $KERNEL_OVERFLOW_LIMIT sleep 0
+if test $? != 124; then
+  # timeout overflow
+  timeout $UINT_OFLOW sleep 0
+  test $? = 0 || fail=1
+
+  # timeout overflow
+  timeout $(expr $UINT_MAX / 86400 + 1)d sleep 0
+  test $? = 0 || fail=1
+
+  # timeout overflow
+  timeout 999999999999999999999999999999999999999999999999999999999999d sleep 0
+  test $? = 0 || fail=1
+
+  # floating point notation
+  timeout 2.34e+5d sleep 0
+  test $? = 0 || fail=1
+fi
 
 # floating point notation
 timeout 2.34 sleep 0
 test $? = 0 || fail=1
 
-# floating point notation
-timeout 2.34e+5d sleep 0
-test $? = 0 || fail=1
-
 # nanoseconds potentially supported
 timeout .999999999 sleep 0 || fail=1