summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2020-10-21 14:31:54 +0200
committerYu Watanabe <watanabe.yu+github@gmail.com>2020-10-22 08:33:20 +0900
commit66032ef489e19292b06773e5f44531a7b44c23c5 (patch)
tree399152dcb7ece3c8da5cd6d38ccfdaeae123bf73 /src
parent6c5496c492a8d74e54d22bf8824160cab1e63c10 (diff)
downloadsystemd-66032ef489e19292b06773e5f44531a7b44c23c5.tar.gz
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.
Diffstat (limited to 'src')
-rw-r--r--src/basic/macro.h11
-rw-r--r--src/basic/path-util.c4
-rw-r--r--src/basic/path-util.h2
-rw-r--r--src/basic/strv.h2
-rw-r--r--src/home/pam_systemd_home.c4
-rw-r--r--src/shared/json.c2
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;