From: Yu Watanabe Date: Tue, 18 Nov 2025 20:10:44 +0000 (+0900) Subject: user-util: avoid double evaluation in STRERROR_USER/GROUP() X-Git-Tag: v259-rc2~68^2 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=refs%2Fpull%2F39794%2Fhead;p=thirdparty%2Fsystemd.git user-util: avoid double evaluation in STRERROR_USER/GROUP() Follow-up for 6e6e96f628d352b56fd396cffb311f16839f78fb. --- diff --git a/src/basic/user-util.c b/src/basic/user-util.c index 4b692076c84..5610abac94d 100644 --- a/src/basic/user-util.c +++ b/src/basic/user-util.c @@ -28,6 +28,26 @@ #include "user-util.h" #include "utf8.h" +#define DEFINE_STRERROR_ACCOUNT(type) \ + const char* strerror_##type( \ + int errnum, \ + char *buf, \ + size_t buflen) { \ + \ + errnum = ABS(errnum); \ + switch (errnum) { \ + case ESRCH: \ + return "Unknown " STRINGIFY(type); \ + case ENOEXEC: \ + return "Not a system " STRINGIFY(type); \ + default: \ + return strerror_r(errnum, buf, buflen); \ + } \ + } + +DEFINE_STRERROR_ACCOUNT(user); +DEFINE_STRERROR_ACCOUNT(group); + bool uid_is_valid(uid_t uid) { /* Also see POSIX IEEE Std 1003.1-2008, 2016 Edition, 3.436. */ diff --git a/src/basic/user-util.h b/src/basic/user-util.h index b7e71720a57..e2486e5a69c 100644 --- a/src/basic/user-util.h +++ b/src/basic/user-util.h @@ -20,11 +20,11 @@ #define MAP_UID_MIN ((uid_t) 60514) #define MAP_UID_MAX ((uid_t) 60577) -/* A helper to print an error message when user or group resolution fails. - * Note that we can't use ({ … }) to define a temporary variable, so errnum is - * evaluated multiple times. */ -#define STRERROR_USER(errnum) ((errnum) == -ESRCH ? "Unknown user" : (errnum) == -ENOEXEC ? "Not a system user" : STRERROR(errnum)) -#define STRERROR_GROUP(errnum) ((errnum) == -ESRCH ? "Unknown group" : (errnum) == -ENOEXEC ? "Not a system group" : STRERROR(errnum)) +/* A helper to print an error message when user or group resolution fails. */ +const char* strerror_user(int errnum, char *buf, size_t buflen); +#define STRERROR_USER(errnum) strerror_user(errnum, (char[ERRNO_BUF_LEN]){}, ERRNO_BUF_LEN) +const char* strerror_group(int errnum, char *buf, size_t buflen); +#define STRERROR_GROUP(errnum) strerror_group(errnum, (char[ERRNO_BUF_LEN]){}, ERRNO_BUF_LEN) static inline bool ERRNO_IS_NEG_BAD_ACCOUNT(intmax_t r) { return IN_SET(r,