From a3a946f670718d0dee5a7425ad5ac0a29fb46ea1 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Wed, 7 Apr 2021 17:29:59 -0700 Subject: [PATCH] utimens: fix confusing arg type in internal func MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Although the old code was technically correct, this was accidental and it understandably confused Coverity. Reported by Ondrej Dubaj in: https://lists.gnu.org/r/bug-tar/2021-04/msg00000.html * lib/utimens.c (update_timespec): Change arg type from ‘struct timespec *[2]’ (pointer to array of 2 pointers to timespecs) to ‘struct timespec **’ (pointer to pointer to the first timespec in an array of 2 timespecs). Although the old code happened to be technically correct, it was misleading and confused Coverity. And though the type ‘struct timespec (**)[2]’ (pointer to pointer to array of 2 timespecs) would perhaps be more technically correct, it would be almost as confusing and would require changes elsewhere in this file; let’s quit while we’re ahead. --- ChangeLog | 14 ++++++++++++++ lib/utimens.c | 6 +++--- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 8d8725be2a..5d91c7acc4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -9,6 +9,20 @@ 2021-04-07 Paul Eggert + utimens: fix confusing arg type in internal func + Although the old code was technically correct, this was accidental + and it understandably confused Coverity. Reported by Ondrej Dubaj in: + https://lists.gnu.org/r/bug-tar/2021-04/msg00000.html + * lib/utimens.c (update_timespec): Change arg type from ‘struct + timespec *[2]’ (pointer to array of 2 pointers to timespecs) to + ‘struct timespec **’ (pointer to pointer to the first timespec in + an array of 2 timespecs). Although the old code happened to be + technically correct, it was misleading and confused Coverity. + And though the type ‘struct timespec (**)[2]’ (pointer to pointer + to array of 2 timespecs) would perhaps be more technically + correct, it would be almost as confusing and would require changes + elsewhere in this file; let’s quit while we’re ahead. + xalloc: simplify integer overflow test * lib/xalloc.h (x2nrealloc): Simplify integer overflow detection. This is easier to maintain, and (unlike the old code) exact. diff --git a/lib/utimens.c b/lib/utimens.c index 44d1ea003e..06d1aa36ff 100644 --- a/lib/utimens.c +++ b/lib/utimens.c @@ -126,14 +126,14 @@ validate_timespec (struct timespec timespec[2]) return result + (utime_omit_count == 1); } -/* Normalize any UTIME_NOW or UTIME_OMIT values in *TS, using stat - buffer STATBUF to obtain the current timestamps of the file. If +/* Normalize any UTIME_NOW or UTIME_OMIT values in (*TS)[0] and (*TS)[1], + using STATBUF to obtain the current timestamps of the file. If both times are UTIME_NOW, set *TS to NULL (as this can avoid some permissions issues). If both times are UTIME_OMIT, return true (nothing further beyond the prior collection of STATBUF is necessary); otherwise return false. */ static bool -update_timespec (struct stat const *statbuf, struct timespec *ts[2]) +update_timespec (struct stat const *statbuf, struct timespec **ts) { struct timespec *timespec = *ts; if (timespec[0].tv_nsec == UTIME_OMIT -- 2.39.5