summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDanny Holman <dholman@gymli.org>2023-09-13 11:21:51 -0500
committerDanny Holman <dholman@gymli.org>2023-09-13 11:21:51 -0500
commit4f2b2b5b946c211f97b4bbfa5a273c9c7327d203 (patch)
tree743efd4394af3cefc69f8ea77fd158dc2f171dbd
parente8dac62072e0a3be87ae730326efad7e4d10f50a (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>
-rw-r--r--common/include/util.h2
-rw-r--r--common/src/util.c17
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;
}