Return value is either NULL or a strdup'd string, depending on the input value.
Signed-off-by: Peter Hutterer <peter.hutte...@who-t.net> --- meson.build | 2 ++ src/libinput-util.h | 19 +++++++++++++++++++ src/libinput.c | 12 +++--------- src/path-seat.c | 7 +++---- src/udev-seat.c | 3 +-- test/litest.c | 13 ++++++------- test/test-path.c | 5 +++-- tools/shared.c | 2 +- 8 files changed, 38 insertions(+), 25 deletions(-) diff --git a/meson.build b/meson.build index 9b0fa246..abc8d765 100644 --- a/meson.build +++ b/meson.build @@ -625,6 +625,8 @@ if get_option('tests') args : [ meson.current_source_dir() ]) libinput_test_runner_sources = [ + 'src/libinput-util.h', + 'src/libinput-util.c', 'test/test-udev.c', 'test/test-path.c', 'test/test-pointer.c', diff --git a/src/libinput-util.h b/src/libinput-util.h index 264eea73..b984f9f1 100644 --- a/src/libinput-util.h +++ b/src/libinput-util.h @@ -145,6 +145,25 @@ zalloc(size_t size) return p; } +/** + * strdup guaranteed to succeed. If the input string is NULL, the output + * string is NULL. If the input string is a string pointer, we strdup or + * abort on failure. + */ +static inline char* +safe_strdup(const char *str) +{ + char *s; + + if (!str) + return NULL; + + s = strdup(str); + if (!s) + abort(); + return s; +} + /* This bitfield helper implementation is taken from from libevdev-util.h, * except that it has been modified to work with arrays of unsigned chars */ diff --git a/src/libinput.c b/src/libinput.c index 4187c166..1ca737a0 100644 --- a/src/libinput.c +++ b/src/libinput.c @@ -1861,8 +1861,8 @@ libinput_seat_init(struct libinput_seat *seat, { seat->refcount = 1; seat->libinput = libinput; - seat->physical_name = strdup(physical_name); - seat->logical_name = strdup(logical_name); + seat->physical_name = safe_strdup(physical_name); + seat->logical_name = safe_strdup(logical_name); seat->destroy = destroy; list_init(&seat->devices_list); list_insert(&libinput->seat_list, &seat->link); @@ -3319,13 +3319,7 @@ libinput_device_group_create(struct libinput *libinput, group = zalloc(sizeof *group); group->refcount = 1; - if (identifier) { - group->identifier = strdup(identifier); - if (!group->identifier) { - free(group); - return NULL; - } - } + group->identifier = safe_strdup(identifier); list_init(&group->link); list_insert(&libinput->device_group_list, &group->link); diff --git a/src/path-seat.c b/src/path-seat.c index a0749732..c162dc64 100644 --- a/src/path-seat.c +++ b/src/path-seat.c @@ -121,10 +121,10 @@ path_device_enable(struct path_input *input, sysname = udev_device_get_sysname(udev_device); seat_prop = udev_device_get_property_value(udev_device, "ID_SEAT"); - seat_name = strdup(seat_prop ? seat_prop : default_seat); + seat_name = safe_strdup(seat_prop ? seat_prop : default_seat); if (seat_logical_name_override) { - seat_logical_name = strdup(seat_logical_name_override); + seat_logical_name = safe_strdup(seat_logical_name_override); } else { seat_prop = udev_device_get_property_value(udev_device, "WL_SEAT"); seat_logical_name = strdup(seat_prop ? seat_prop : default_seat_name); @@ -173,8 +173,7 @@ path_device_enable(struct path_input *input, evdev_read_calibration_prop(device); output_name = udev_device_get_property_value(udev_device, "WL_OUTPUT"); - if (output_name) - device->output_name = strdup(output_name); + device->output_name = safe_strdup(output_name); out: free(seat_name); diff --git a/src/udev-seat.c b/src/udev-seat.c index b954e3ca..988ac3bf 100644 --- a/src/udev-seat.c +++ b/src/udev-seat.c @@ -102,8 +102,7 @@ device_added(struct udev_device *udev_device, evdev_read_calibration_prop(device); output_name = udev_device_get_property_value(udev_device, "WL_OUTPUT"); - if (output_name) - device->output_name = strdup(output_name); + device->output_name = strdup(output_name); return 0; } diff --git a/test/litest.c b/test/litest.c index 23395413..902d9ce5 100644 --- a/test/litest.c +++ b/test/litest.c @@ -524,8 +524,8 @@ litest_add_tcase_for_device(struct suite *suite, struct test *t; t = zalloc(sizeof(*t)); - t->name = strdup(funcname); - t->devname = strdup(dev->shortname); + t->name = safe_strdup(funcname); + t->devname = safe_strdup(dev->shortname); t->func = func; t->setup = dev->setup; t->teardown = dev->teardown ? @@ -549,8 +549,8 @@ litest_add_tcase_no_device(struct suite *suite, return; t = zalloc(sizeof(*t)); - t->name = strdup(test_name); - t->devname = strdup("no device"); + t->name = safe_strdup(test_name); + t->devname = safe_strdup("no device"); t->func = func; if (range) t->range = *range; @@ -571,7 +571,7 @@ get_suite(const char *name) } s = zalloc(sizeof(*s)); - s->name = strdup(name); + s->name = safe_strdup(name); list_init(&s->tests); list_insert(&all_tests, &s->node); @@ -1133,8 +1133,7 @@ litest_copy_file(const char *dest, const char *src, const char *header) int suffixlen; file = zalloc(sizeof(*file)); - file->path = strdup(dest); - litest_assert(file->path); + file->path = safe_strdup(dest); suffixlen = file->path + strlen(file->path) - rindex(file->path, '.'); out = mkstemps(file->path, suffixlen); diff --git a/test/test-path.c b/test/test-path.c index 66f41ae0..d4087f1a 100644 --- a/test/test-path.c +++ b/test/test-path.c @@ -32,6 +32,7 @@ #include <unistd.h> #include "litest.h" +#include "libinput-util.h" struct counter { int open_func_count; @@ -393,7 +394,7 @@ START_TEST(path_add_device) ck_assert_int_eq(type, LIBINPUT_EVENT_DEVICE_ADDED); device = libinput_event_get_device(event); ck_assert_notnull(device); - sysname1 = strdup(libinput_device_get_sysname(device)); + sysname1 = safe_strdup(libinput_device_get_sysname(device)); libinput_event_destroy(event); litest_assert_empty_queue(li); @@ -410,7 +411,7 @@ START_TEST(path_add_device) ck_assert_int_eq(type, LIBINPUT_EVENT_DEVICE_ADDED); device = libinput_event_get_device(event); ck_assert_notnull(device); - sysname2 = strdup(libinput_device_get_sysname(device)); + sysname2 = safe_strdup(libinput_device_get_sysname(device)); libinput_event_destroy(event); ck_assert_str_eq(sysname1, sysname2); diff --git a/tools/shared.c b/tools/shared.c index db6e70ce..998782ff 100644 --- a/tools/shared.c +++ b/tools/shared.c @@ -397,7 +397,7 @@ find_device(const char *udev_tag) } if (udev_device_get_property_value(device, udev_tag)) - device_node = strdup(udev_device_get_devnode(device)); + device_node = safe_strdup(udev_device_get_devnode(device)); udev_device_unref(device); -- 2.13.0 _______________________________________________ wayland-devel mailing list wayland-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/wayland-devel