char **lxc_string_split(const char *string, char _sep)
{
char *token, *str, *saveptr = NULL;
- char sep[2] = { _sep, '\0' };
- char **result = NULL;
+ char sep[2] = {_sep, '\0'};
+ char **tmp = NULL, **result = NULL;
size_t result_capacity = 0;
size_t result_count = 0;
int r, saved_errno;
if (!string)
return calloc(1, sizeof(char *));
- str = alloca(strlen(string)+1);
+ str = alloca(strlen(string) + 1);
strcpy(str, string);
for (; (token = strtok_r(str, sep, &saveptr)); str = NULL) {
r = lxc_grow_array((void ***)&result, &result_capacity, result_count + 1, 16);
}
/* if we allocated too much, reduce it */
- return realloc(result, (result_count + 1) * sizeof(char *));
+ tmp = realloc(result, (result_count + 1) * sizeof(char *));
+ if (!tmp)
+ goto error_out;
+ result = tmp;
+ /* Make sure we don't return uninitialized memory. */
+ if (result_count == 0)
+ *result = NULL;
+ return result;
error_out:
saved_errno = errno;
lxc_free_array((void **)result, free);