From: Paul Eggert Date: Fri, 1 Nov 2024 16:40:36 +0000 (-0700) Subject: Remove major, minor signedness assumption X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=0aa69501d3d41b009ffa1be36fa718849b8a7a6e;p=thirdparty%2Ftar.git Remove major, minor signedness assumption * src/common.h (uintmax): Remove; no longer used. * src/list.c (simple_print_header): Don’t assume major and minor agree in signedness. --- 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: