From 8fca2a2eea43e2667b01c541ac3eeae624f19e1c Mon Sep 17 00:00:00 2001 From: Florian Festi Date: Mon, 18 Nov 2024 13:05:56 +0100 Subject: [PATCH] Make macros::expand_numeric return int64_t While we can't change the C API there is really no reason to add a new 32 bit API. Changing now while it is still internal. Emit a warning if value doesn't fit into an int for the old API and clip at INT_MIN and INT_MAX. --- rpmio/macro.cc | 21 ++++++++++++++++----- rpmio/rpmmacro_internal.hh | 4 ++-- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/rpmio/macro.cc b/rpmio/macro.cc index 6063b85f95..ddb93f5afa 100644 --- a/rpmio/macro.cc +++ b/rpmio/macro.cc @@ -9,6 +9,7 @@ #include #include #include +#include #include #include @@ -1992,10 +1993,20 @@ rpmExpand(const char *arg, ...) int rpmExpandNumeric(const char *arg) { + int res; if (arg == NULL) return 0; auto [ ign, val ] = macros().expand_numeric(arg); - return val; + if (val > INT_MAX) { + rpmlog(RPMLOG_WARNING, _("Macro value too big for int: %" PRIu64 " Using %i instead.\n"), val, INT_MAX); + res = INT_MAX; + } else if (val < INT_MIN) { + rpmlog(RPMLOG_WARNING, _("Macro value too small for int: %" PRIu64 " Using %i instead.\n"), val, INT_MIN); + res = INT_MIN; + } else { + res = val; + } + return res; } void macros::clear() @@ -2063,12 +2074,12 @@ macros::expand_this(const char *n, ARGV_const_t args, int flags) return std::make_pair(rc, target); } -std::pair +std::pair macros::expand_numeric(const std::string & src, int flags) { auto [ exrc, s ] = macros().expand(src, flags); const char *val = s.c_str(); - int rc = 0; + int64_t rc = 0; if (!(val && *val != '%')) rc = 0; else if (*val == 'Y' || *val == 'y') @@ -2077,14 +2088,14 @@ macros::expand_numeric(const std::string & src, int flags) rc = 0; else { char *end; - rc = strtol(val, &end, 0); + rc = strtoll(val, &end, 0); if (!(end && *end == '\0')) rc = 0; } return std::make_pair(exrc, rc); } -std::pair +std::pair macros::expand_numeric(const std::initializer_list & src, int flags) { string buf; diff --git a/rpmio/rpmmacro_internal.hh b/rpmio/rpmmacro_internal.hh index 3970ddbaa0..c0c0b498e9 100644 --- a/rpmio/rpmmacro_internal.hh +++ b/rpmio/rpmmacro_internal.hh @@ -66,8 +66,8 @@ public: std::pair expand_this(const char *n, ARGV_const_t args, int flags = 0); /* Expand macros to numeric value, with a return code (rc, number) */ - std::pair expand_numeric(const std::string & src, int flags = 0); - std::pair expand_numeric(const std::initializer_list & src, + std::pair expand_numeric(const std::string & src, int flags = 0); + std::pair expand_numeric(const std::initializer_list & src, int flags = 0); void init(const char *macrofiles); bool is_defined(const char *n);