diff options
author | Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> | 2021-02-10 08:32:23 +0100 |
---|---|---|
committer | Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> | 2021-02-10 14:46:59 +0100 |
commit | 71c163c9fa737053bccf8f6d733b272dfacc966f (patch) | |
tree | ceae5a14c5e34a864d57db7992f76fd264f5f9be | |
parent | 38d1e120636bf6c998ea0e5be5524e40e38716e3 (diff) | |
download | systemd-71c163c9fa737053bccf8f6d733b272dfacc966f.tar.gz |
udev: make sure UdevBuiltinCommand is properly converted
-rw-r--r-- | src/udev/meson.build | 6 | ||||
-rw-r--r-- | src/udev/test-udev-builtin.c | 26 | ||||
-rw-r--r-- | src/udev/udev-builtin.h | 14 |
3 files changed, 44 insertions, 2 deletions
diff --git a/src/udev/meson.build b/src/udev/meson.build index 4a95c431a5..fd74e28682 100644 --- a/src/udev/meson.build +++ b/src/udev/meson.build @@ -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 index 0000000000..1bd1dbddf5 --- /dev/null +++ b/src/udev/test-udev-builtin.c @@ -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(); +} diff --git a/src/udev/udev-builtin.h b/src/udev/udev-builtin.h index 14d6406d2b..b92d74fc9d 100644 --- a/src/udev/udev-builtin.h +++ b/src/udev/udev-builtin.h @@ -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; |