diff options
author | Danny Holman <dholman@gymli.org> | 2023-09-13 11:21:51 -0500 |
---|---|---|
committer | Danny Holman <dholman@gymli.org> | 2023-09-13 11:21:51 -0500 |
commit | 4f2b2b5b946c211f97b4bbfa5a273c9c7327d203 (patch) | |
tree | 743efd4394af3cefc69f8ea77fd158dc2f171dbd /common | |
parent | e8dac62072e0a3be87ae730326efad7e4d10f50a (diff) |
common: fix a segfault in str_split
Fix a bug in which str_split would segfault when the string is
misformatted.
Signed-off-by: Danny Holman <dholman@gymli.org>
Diffstat (limited to 'common')
-rw-r--r-- | common/include/util.h | 2 | ||||
-rw-r--r-- | common/src/util.c | 17 |
2 files changed, 9 insertions, 10 deletions
diff --git a/common/include/util.h b/common/include/util.h index 39c130b..66221b2 100644 --- a/common/include/util.h +++ b/common/include/util.h @@ -8,6 +8,6 @@ (type*)((char*)__mptr - offsetof(type, member)); }) char* str_strip(char *str); -char** str_split(char *str, const char *delim); +size_t str_split(char*** arr, char *str, const char *delim); #endif diff --git a/common/src/util.c b/common/src/util.c index 63eefa2..3ff4b57 100644 --- a/common/src/util.c +++ b/common/src/util.c @@ -65,20 +65,19 @@ char* str_strip(char *str) { return str; } -char** str_split(char *str, const char *delim) { +size_t str_split(char*** arr, char *str, const char *delim) { size_t count = 0; - char **ret = NULL; - char *token; char *saveptr; - token = strtok_r(str, delim, &saveptr); + char *token = strtok_r(str, delim, &saveptr); + while (token != NULL) { count++; - ret = realloc(ret, sizeof(char*) * count); - ret[count-1] = strdup(str_strip(token)); + *arr = realloc(*arr, sizeof(char*) * count); + (*arr)[count-1] = strdup(str_strip(token)); token = strtok_r(NULL, delim, &saveptr); } count++; - ret = realloc(ret, sizeof(char*) * count); - ret[count-1] = NULL; - return ret; + *arr = realloc(*arr, sizeof(char*) * count); + (*arr)[count-1] = NULL; + return count; } |