From 0aa69501d3d41b009ffa1be36fa718849b8a7a6e Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Fri, 1 Nov 2024 09:40:36 -0700 Subject: [PATCH] Remove major, minor signedness assumption MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit * src/common.h (uintmax): Remove; no longer used. * src/list.c (simple_print_header): Don’t assume major and minor agree in signedness. --- src/common.h | 10 ++-------- src/list.c | 28 ++++++++++++++++++++-------- 2 files changed, 22 insertions(+), 16 deletions(-) diff --git a/src/common.h b/src/common.h index 15755b7b..4b25e089 100644 --- a/src/common.h +++ b/src/common.h @@ -650,21 +650,15 @@ char *namebuf_name (namebuf_t buf, const char *name); const char *tar_dirname (void); /* intmax (N) is like ((intmax_t) (N)) except without a cast so - that it is an error if N is a pointer. Similarly for uintmax. */ + that it is an error if N is a pointer. */ COMMON_INLINE intmax_t intmax (intmax_t n) { return n; } -COMMON_INLINE uintmax_t -uintmax (uintmax_t n) -{ - return n; -} -/* intmax should be used only with signed types, and uintmax for unsigned. +/* intmax should be used only with signed types. To bypass this check parenthesize the function, e.g., (intmax) (n). */ #define intmax(n) verify_expr (EXPR_SIGNED (n), (intmax) (n)) -#define uintmax(n) verify_expr (!EXPR_SIGNED (n), (uintmax) (n)) /* Represent N using a signed integer I such that (uintmax_t) I == N. With a good optimizing compiler, this is equivalent to (intmax_t) i diff --git a/src/list.c b/src/list.c index f3ab4dd4..4eecd293 100644 --- a/src/list.c +++ b/src/list.c @@ -1228,14 +1228,26 @@ simple_print_header (struct tar_stat_info *st, union block *blk, { case CHRTYPE: case BLKTYPE: - sizelen = ((EXPR_SIGNED (major (st->stat.st_rdev)) - && EXPR_SIGNED (minor (st->stat.st_rdev))) - ? sprintf (size, "%jd,%jd", - (intmax) (major (st->stat.st_rdev)), - (intmax) (minor (st->stat.st_rdev))) - : sprintf (size, "%ju,%ju", - (uintmax) (major (st->stat.st_rdev)), - (uintmax) (minor (st->stat.st_rdev)))); + if (EXPR_SIGNED (major (st->stat.st_rdev))) + { + intmax_t m = major (st->stat.st_rdev); + sizelen = sprintf (size, "%jd", m); + } + else + { + uintmax_t m = major (st->stat.st_rdev); + sizelen = sprintf (size, "%ju", m); + } + if (EXPR_SIGNED (minor (st->stat.st_rdev))) + { + intmax_t m = minor (st->stat.st_rdev); + sizelen += sprintf (size + sizelen, ",%jd", m); + } + else + { + uintmax_t m = minor (st->stat.st_rdev); + sizelen += sprintf (size + sizelen, ",%ju", m); + } break; default: -- 2.47.3