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;