]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
json: explicitly support offsets relative to NULL when dispatching
authorLennart Poettering <lennart@poettering.net>
Fri, 30 Sep 2022 12:09:54 +0000 (14:09 +0200)
committerLennart Poettering <lennart@poettering.net>
Fri, 30 Sep 2022 12:17:15 +0000 (14:17 +0200)
Let's trick out UndefinedBehaviourSanitizer:

https://github.com/systemd/systemd/pull/24853#issuecomment-1263380745

src/shared/json.c

index 40c6f723eecaf8498d598a79347db1f0af25cfee..950be9485d58193a6dd18147410a107e4c9c969e 100644 (file)
@@ -4211,6 +4211,19 @@ int json_log_internal(
                                 NULL);
 }
 
+static void *dispatch_userdata(const JsonDispatch *p, void *userdata) {
+
+        /* When the the userdata pointer is passed in as NULL, then we'll just use the offset as a literal
+         * address, and convert it to a pointer.  Note that might as well just add the offset to the NULL
+         * pointer, but UndefinedBehaviourSanitizer doesn't like pointer arithmetics based on NULL pointers,
+         * hence we code this explicitly here. */
+
+        if (userdata)
+                return (uint8_t*) userdata + p->offset;
+
+        return SIZE_TO_PTR(p->offset);
+}
+
 int json_dispatch(JsonVariant *v, const JsonDispatch table[], JsonDispatchCallback bad, JsonDispatchFlags flags, void *userdata) {
         size_t m;
         int r, done = 0;
@@ -4274,7 +4287,7 @@ int json_dispatch(JsonVariant *v, const JsonDispatch table[], JsonDispatchCallba
                         found[p-table] = true;
 
                         if (p->callback) {
-                                r = p->callback(json_variant_string(key), value, merged_flags, (uint8_t*) userdata + p->offset);
+                                r = p->callback(json_variant_string(key), value, merged_flags, dispatch_userdata(p, userdata));
                                 if (r < 0) {
                                         if (merged_flags & JSON_PERMISSIVE)
                                                 continue;