diff --git a/i3bar/src/workspaces.c b/i3bar/src/workspaces.c index 773f8f54..961a41f5 100644 --- a/i3bar/src/workspaces.c +++ b/i3bar/src/workspaces.c @@ -106,7 +106,7 @@ static int workspaces_string_cb(void *params_, const unsigned char *val, size_t if (!strcmp(params->cur_key, "name")) { const char *ws_name = (const char *)val; - params->workspaces_walk->canonical_name = strndup(ws_name, len); + params->workspaces_walk->canonical_name = sstrndup(ws_name, len); if (config.strip_ws_numbers && params->workspaces_walk->num >= 0) { /* Special case: strip off the workspace number */ diff --git a/include/libi3.h b/include/libi3.h index a64b3981..3e6f8427 100644 --- a/include/libi3.h +++ b/include/libi3.h @@ -127,6 +127,13 @@ void *srealloc(void *ptr, size_t size); */ char *sstrdup(const char *str); +/** + * Safe-wrapper around strndup which exits if strndup returns NULL (meaning that + * there is no more memory available) + * + */ +char *sstrndup(const char *str, size_t size); + /** * Safe-wrapper around asprintf which exits if it returns -1 (meaning that * there is no more memory available) diff --git a/libi3/resolve_tilde.c b/libi3/resolve_tilde.c index 3a56cbea..26cbabe5 100644 --- a/libi3/resolve_tilde.c +++ b/libi3/resolve_tilde.c @@ -23,7 +23,7 @@ char *resolve_tilde(const char *path) { char *head, *tail, *result; tail = strchr(path, '/'); - head = strndup(path, tail ? (size_t)(tail - path) : strlen(path)); + head = sstrndup(path, tail ? (size_t)(tail - path) : strlen(path)); int res = glob(head, GLOB_TILDE, NULL, &globbuf); free(head); diff --git a/libi3/safewrappers.c b/libi3/safewrappers.c index 74460f37..f5973cab 100644 --- a/libi3/safewrappers.c +++ b/libi3/safewrappers.c @@ -48,6 +48,13 @@ char *sstrdup(const char *str) { return result; } +char *sstrndup(const char *str, size_t size) { + char *result = strndup(str, size); + if (result == NULL) + err(EXIT_FAILURE, "strndup()"); + return result; +} + int sasprintf(char **strp, const char *fmt, ...) { va_list args; int result; diff --git a/src/window.c b/src/window.c index 29cd11eb..7b0f397d 100644 --- a/src/window.c +++ b/src/window.c @@ -27,30 +27,27 @@ void window_update_class(i3Window *win, xcb_get_property_reply_t *prop, bool bef * null-terminated strings (for compatibility reasons). Instead, we * use strdup() on both strings */ const size_t prop_length = xcb_get_property_value_length(prop); - char *new_class = smalloc(prop_length + 1); - memcpy(new_class, xcb_get_property_value(prop), prop_length); - new_class[prop_length] = '\0'; + char *new_class = xcb_get_property_value(prop); + const size_t class_class_index = strnlen(new_class, prop_length) + 1; FREE(win->class_instance); FREE(win->class_class); - win->class_instance = sstrdup(new_class); - if ((strlen(new_class) + 1) < prop_length) - win->class_class = sstrdup(new_class + strlen(new_class) + 1); + win->class_instance = sstrndup(new_class, prop_length); + if (class_class_index < prop_length) + win->class_class = sstrndup(new_class + class_class_index, prop_length - class_class_index); else win->class_class = NULL; LOG("WM_CLASS changed to %s (instance), %s (class)\n", win->class_instance, win->class_class); if (before_mgmt) { - free(new_class); free(prop); return; } run_assignments(win); - free(new_class); free(prop); }