From 66032ef489e19292b06773e5f44531a7b44c23c5 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Wed, 21 Oct 2020 14:31:54 +0200 Subject: [PATCH] macro: introduce POINTER_MAX as define for (void*) -1 Just add a safer, prettier way to write (void*) -1, that doesn't rely on two's complement, but uses the correct underlying C constructs. --- src/basic/macro.h | 11 +++++++---- src/basic/path-util.c | 4 ++-- src/basic/path-util.h | 2 +- src/basic/strv.h | 2 +- src/home/pam_systemd_home.c | 4 ++-- src/shared/json.c | 2 +- 6 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/basic/macro.h b/src/basic/macro.h index 7aa51fe939..d0ddb369ca 100644 --- a/src/basic/macro.h +++ b/src/basic/macro.h @@ -554,10 +554,13 @@ static inline int __coverity_check_and_return__(int condition) { #define STRV_MAKE(...) ((char**) ((const char*[]) { __VA_ARGS__, NULL })) #define STRV_MAKE_EMPTY ((char*[1]) { NULL }) -/* Iterates through a specified list of pointers. Accepts NULL pointers, but uses (void*) -1 as internal marker for EOL. */ -#define FOREACH_POINTER(p, x, ...) \ - for (typeof(p) *_l = (typeof(p)[]) { ({ p = x; }), ##__VA_ARGS__, (void*) -1 }; \ - p != (typeof(p)) (void*) -1; \ +/* Pointers range from NULL to POINTER_MAX */ +#define POINTER_MAX ((void*) UINTPTR_MAX) + +/* Iterates through a specified list of pointers. Accepts NULL pointers, but uses POINTER_MAX as internal marker for EOL. */ +#define FOREACH_POINTER(p, x, ...) \ + for (typeof(p) *_l = (typeof(p)[]) { ({ p = x; }), ##__VA_ARGS__, POINTER_MAX }; \ + p != (typeof(p)) POINTER_MAX; \ p = *(++_l)) /* Define C11 thread_local attribute even on older gcc compiler diff --git a/src/basic/path-util.c b/src/basic/path-util.c index a36cf8332c..95c9d5863c 100644 --- a/src/basic/path-util.c +++ b/src/basic/path-util.c @@ -550,7 +550,7 @@ char* path_join_internal(const char *first, ...) { sz = strlen_ptr(first); va_start(ap, first); - while ((p = va_arg(ap, char*)) != (const char*) -1) + while ((p = va_arg(ap, char*)) != POINTER_MAX) if (!isempty(p)) sz += 1 + strlen(p); va_end(ap); @@ -570,7 +570,7 @@ char* path_join_internal(const char *first, ...) { } va_start(ap, first); - while ((p = va_arg(ap, char*)) != (const char*) -1) { + while ((p = va_arg(ap, char*)) != POINTER_MAX) { if (isempty(p)) continue; diff --git a/src/basic/path-util.h b/src/basic/path-util.h index bd8c14903e..ced0d2af40 100644 --- a/src/basic/path-util.h +++ b/src/basic/path-util.h @@ -62,7 +62,7 @@ int path_compare(const char *a, const char *b) _pure_; bool path_equal(const char *a, const char *b) _pure_; bool path_equal_or_files_same(const char *a, const char *b, int flags); char* path_join_internal(const char *first, ...); -#define path_join(x, ...) path_join_internal(x, __VA_ARGS__, (const char*) -1) +#define path_join(x, ...) path_join_internal(x, __VA_ARGS__, POINTER_MAX) char* path_simplify(char *path, bool kill_dots); diff --git a/src/basic/strv.h b/src/basic/strv.h index 919fabf75a..195dbe4ca9 100644 --- a/src/basic/strv.h +++ b/src/basic/strv.h @@ -62,7 +62,7 @@ char **strv_new_internal(const char *x, ...) _sentinel_; char **strv_new_ap(const char *x, va_list ap); #define strv_new(...) strv_new_internal(__VA_ARGS__, NULL) -#define STRV_IGNORE ((const char *) -1) +#define STRV_IGNORE ((const char *) POINTER_MAX) static inline const char* STRV_IFNOTNULL(const char *x) { return x ? x : STRV_IGNORE; diff --git a/src/home/pam_systemd_home.c b/src/home/pam_systemd_home.c index 544eae9164..4d7c99733e 100644 --- a/src/home/pam_systemd_home.c +++ b/src/home/pam_systemd_home.c @@ -142,7 +142,7 @@ static int acquire_user_record( if (r == PAM_SUCCESS && json) { /* We determined earlier that this is not a homed user? Then exit early. (We use -1 as * negative cache indicator) */ - if (json == (void*) -1) + if (json == POINTER_MAX) return PAM_USER_UNKNOWN; } else { _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL; @@ -235,7 +235,7 @@ static int acquire_user_record( user_unknown: /* Cache this, so that we don't check again */ - r = pam_set_data(handle, homed_field, (void*) -1, NULL); + r = pam_set_data(handle, homed_field, POINTER_MAX, NULL); if (r != PAM_SUCCESS) pam_syslog(handle, LOG_ERR, "Failed to set PAM user record data '%s' to invalid, ignoring: %s", homed_field, pam_strerror(handle, r)); diff --git a/src/shared/json.c b/src/shared/json.c index e938e59ab6..1d2cbc8aed 100644 --- a/src/shared/json.c +++ b/src/shared/json.c @@ -3892,7 +3892,7 @@ int json_dispatch(JsonVariant *v, const JsonDispatch table[], JsonDispatchCallba assert_se(value = json_variant_by_index(v, i+1)); for (p = table; p->name; p++) - if (p->name == (const char*) -1 || + if (p->name == POINTER_MAX || streq_ptr(json_variant_string(key), p->name)) break;