1
0
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:
Peter Hutterer
2015-10-12 08:51:33 +10:00
parent c464c86fa4
commit 1abc7cdb69
5 changed files with 28 additions and 10 deletions

View File

@@ -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:

View File

@@ -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)
{

View File

@@ -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;
}

View File

@@ -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>";

View File

@@ -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;