]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
udev: make sure UdevBuiltinCommand is properly converted
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Wed, 10 Feb 2021 07:32:23 +0000 (08:32 +0100)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Wed, 10 Feb 2021 13:46:59 +0000 (14:46 +0100)
src/udev/meson.build
src/udev/test-udev-builtin.c [new file with mode: 0644]
src/udev/udev-builtin.h

index 4a95c431a53dc3196def5e9f62896515b4f7df03..fd74e28682ffa5f63cfa623d0e985b88e5f9a505 100644 (file)
@@ -197,6 +197,12 @@ tests += [
          [threads,
           libacl]],
 
+        [['src/udev/test-udev-builtin.c'],
+         [libudevd_core,
+          libshared],
+         [threads,
+          libacl]],
+
         [['src/udev/fido_id/test-fido-id-desc.c',
           'src/udev/fido_id/fido_id_desc.c']],
 ]
diff --git a/src/udev/test-udev-builtin.c b/src/udev/test-udev-builtin.c
new file mode 100644 (file)
index 0000000..1bd1dbd
--- /dev/null
@@ -0,0 +1,26 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+
+#include "tests.h"
+#include "udev-builtin.h"
+
+static void test_udev_builtin_cmd_to_ptr(void) {
+        log_info("/* %s */", __func__);
+
+        /* Those could have been static_assert()s, but ({}) is not allowed there. */
+#if HAVE_BLKID
+        assert_se(UDEV_BUILTIN_CMD_TO_PTR(UDEV_BUILTIN_BLKID));
+        assert_se(PTR_TO_UDEV_BUILTIN_CMD(UDEV_BUILTIN_CMD_TO_PTR(UDEV_BUILTIN_BLKID)) == UDEV_BUILTIN_BLKID);
+#endif
+        assert_se(UDEV_BUILTIN_CMD_TO_PTR(UDEV_BUILTIN_BTRFS));
+        assert_se(PTR_TO_UDEV_BUILTIN_CMD(UDEV_BUILTIN_CMD_TO_PTR(UDEV_BUILTIN_BTRFS)) == UDEV_BUILTIN_BTRFS);
+        assert_se(PTR_TO_UDEV_BUILTIN_CMD(UDEV_BUILTIN_CMD_TO_PTR(_UDEV_BUILTIN_INVALID)) == _UDEV_BUILTIN_INVALID);
+
+        assert_se(PTR_TO_UDEV_BUILTIN_CMD(NULL) == _UDEV_BUILTIN_INVALID);
+        assert_se(PTR_TO_UDEV_BUILTIN_CMD((void*) 10000) == _UDEV_BUILTIN_INVALID);
+}
+
+int main(int argc, char *argv[]) {
+        test_setup_logging(LOG_DEBUG);
+
+        test_udev_builtin_cmd_to_ptr();
+}
index 14d6406d2b1dffa4fb5f14f9ebcc2b91f5848813..b92d74fc9d1ebddd25ab86fa7fc49fa9dacbeadb 100644 (file)
@@ -37,8 +37,18 @@ typedef struct UdevBuiltin {
         bool run_once;
 } UdevBuiltin;
 
-#define PTR_TO_UDEV_BUILTIN_CMD(p) ((UdevBuiltinCommand) ((intptr_t) (p)-1))
-#define UDEV_BUILTIN_CMD_TO_PTR(u) ((void *)             ((intptr_t) (u)+1))
+#define UDEV_BUILTIN_CMD_TO_PTR(u)                 \
+        ({                                         \
+                UdevBuiltinCommand _u = (u);       \
+                _u < 0 ? NULL : (void*)(intptr_t) (_u + 1);     \
+        })
+
+#define PTR_TO_UDEV_BUILTIN_CMD(p)                 \
+        ({                                         \
+                void *_p = (p);                    \
+                _p && (intptr_t)(_p) <= _UDEV_BUILTIN_MAX ? \
+                        (UdevBuiltinCommand)((intptr_t)_p - 1) : _UDEV_BUILTIN_INVALID; \
+        })
 
 #if HAVE_BLKID
 extern const UdevBuiltin udev_builtin_blkid;