From 2197ea89bf5afabc4c52a6499b13e92ae6621554 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Mon, 19 Aug 2019 18:02:59 -0700 Subject: [PATCH] Fix time-add/time-sub validity checking * src/timefns.c (time_arith): Check the first arg for validity even if the second arg is not finite. * test/src/timefns-tests.el (time-arith-tests): Test this. --- src/timefns.c | 6 +++--- test/src/timefns-tests.el | 4 ++++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/timefns.c b/src/timefns.c index 3948f873354..2d545a4f905 100644 --- a/src/timefns.c +++ b/src/timefns.c @@ -1035,12 +1035,12 @@ time_arith (Lisp_Object a, Lisp_Object b, bool subtract) double db = XFLOAT_DATA (Ffloat_time (b)); return make_float (subtract ? da - db : da + db); } - if (FLOATP (b) && !isfinite (XFLOAT_DATA (b))) - return subtract ? make_float (-XFLOAT_DATA (b)) : b; - enum timeform aform, bform; struct lisp_time ta = lisp_time_struct (a, &aform); + if (FLOATP (b) && !isfinite (XFLOAT_DATA (b))) + return subtract ? make_float (-XFLOAT_DATA (b)) : b; + /* Subtract nil from nil correctly, and handle other eq values quicker while we're at it. Compare here rather than earlier, to handle NaNs and check formats. */ diff --git a/test/src/timefns-tests.el b/test/src/timefns-tests.el index 13ab7d83c3e..a30b2de3a5b 100644 --- a/test/src/timefns-tests.el +++ b/test/src/timefns-tests.el @@ -136,6 +136,10 @@ (cons (1+ most-positive-fixnum) 1000000000000) (cons 1000000000000 (1+ most-positive-fixnum))))) (dolist (a time-values) + (should-error (time-add a 'ouch)) + (should-error (time-add 'ouch a)) + (should-error (time-subtract a 'ouch)) + (should-error (time-subtract 'ouch a)) (dolist (b time-values) (let ((aa (time-subtract (time-add a b) b))) (should (or (time-equal-p a aa) (and (floatp aa) (isnan aa))))) -- 2.39.2