forked from drath/libratbag
Add strdup_safe() as a reliable strdup function
Handles NULL and guarantees a successful strdup Fixes #14 Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
This commit is contained in:
@@ -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:
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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 = "<cmdline>";
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user