From 1abc7cdb692f135e2a794cdaff51be7a4b2e8c3f Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Mon, 12 Oct 2015 08:51:33 +1000 Subject: [PATCH] Add strdup_safe() as a reliable strdup function Handles NULL and guarantees a successful strdup Fixes #14 Signed-off-by: Peter Hutterer --- src/libratbag-hidraw.c | 2 +- src/libratbag-util.h | 18 ++++++++++++++++++ src/libratbag.c | 4 ++-- tools/ratbag-command.c | 2 +- tools/shared.c | 12 ++++++------ 5 files changed, 28 insertions(+), 10 deletions(-) diff --git a/src/libratbag-hidraw.c b/src/libratbag-hidraw.c index d712806e..2a29bef6 100644 --- a/src/libratbag-hidraw.c +++ b/src/libratbag-hidraw.c @@ -186,7 +186,7 @@ ratbag_open_hidraw_node(struct ratbag_device *device, struct udev_device *hidraw device->hidraw.reports = zalloc(reports_size); ratbag_hidraw_parse_report_descriptor(device); - device->hidraw.sysname = strdup(sysname); + device->hidraw.sysname = strdup_safe(sysname); return 0; err: diff --git a/src/libratbag-util.h b/src/libratbag-util.h index 3bd12a2a..bb79c028 100644 --- a/src/libratbag-util.h +++ b/src/libratbag-util.h @@ -99,6 +99,24 @@ zalloc(size_t size) return p; } +/** + * returns NULL if str is NULL, otherwise guarantees a successful strdup. + */ +static inline char * +strdup_safe(const char *str) +{ + char *s; + + if (!str) + return NULL; + + s = strdup(str); + if (!s) + abort(); + + return s; +} + static inline void msleep(unsigned int ms) { diff --git a/src/libratbag.c b/src/libratbag.c index 4ad3aa99..5235672f 100644 --- a/src/libratbag.c +++ b/src/libratbag.c @@ -157,7 +157,7 @@ ratbag_device_new(struct ratbag *ratbag, struct udev_device *udev_device, struct ratbag_device *device = NULL; device = zalloc(sizeof(*device)); - device->name = strdup(name); + device->name = strdup_safe(name); if (!name) { free(device); @@ -1190,7 +1190,7 @@ ratbag_button_set_macro(struct ratbag_button *button, const char *name) } button->action.type = RATBAG_BUTTON_ACTION_TYPE_MACRO; - button->action.macro->name = name ? strdup(name) : NULL; + button->action.macro->name = strdup_safe(name); return 0; } diff --git a/tools/ratbag-command.c b/tools/ratbag-command.c index a332438b..5ba24adc 100644 --- a/tools/ratbag-command.c +++ b/tools/ratbag-command.c @@ -481,7 +481,7 @@ str_to_macro(const char *action_arg, struct macro *m) if (!action_arg) return -EINVAL; - str = strdup(action_arg); + str = strdup_safe(action_arg); s = str; m->name = ""; diff --git a/tools/shared.c b/tools/shared.c index 29202bab..1e7fa19a 100644 --- a/tools/shared.c +++ b/tools/shared.c @@ -131,7 +131,7 @@ button_action_button_to_str(struct ratbag_button *button) sprintf(str, "button %d", ratbag_button_get_button(button)); - return strdup(str); + return strdup_safe(str); } char * @@ -145,7 +145,7 @@ button_action_key_to_str(struct ratbag_button *button) if (!str) str = "UNKNOWN"; - return strdup(str); + return strdup_safe(str); } static const char *strip_ev_key(int key) @@ -191,7 +191,7 @@ button_action_macro_to_str(struct ratbag_button *button) } } - return strdup(str); + return strdup_safe(str); } char * @@ -205,12 +205,12 @@ button_action_to_str(struct ratbag_button *button) switch (type) { case RATBAG_BUTTON_ACTION_TYPE_BUTTON: str = button_action_button_to_str(button); break; case RATBAG_BUTTON_ACTION_TYPE_KEY: str = button_action_key_to_str(button); break; - case RATBAG_BUTTON_ACTION_TYPE_SPECIAL: str = strdup(button_action_special_to_str(button)); break; + case RATBAG_BUTTON_ACTION_TYPE_SPECIAL: str = strdup_safe(button_action_special_to_str(button)); break; case RATBAG_BUTTON_ACTION_TYPE_MACRO: str = button_action_macro_to_str(button); break; - case RATBAG_BUTTON_ACTION_TYPE_NONE: str = strdup("none"); break; + case RATBAG_BUTTON_ACTION_TYPE_NONE: str = strdup_safe("none"); break; default: error("type %d unknown\n", type); - str = strdup("UNKNOWN"); + str = strdup_safe("UNKNOWN"); } return str;