diff options
-rw-r--r-- | tools/xenstore/utils.c | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/tools/xenstore/utils.c b/tools/xenstore/utils.c index f8bf989c22..6655777bcd 100644 --- a/tools/xenstore/utils.c +++ b/tools/xenstore/utils.c @@ -96,21 +96,29 @@ void *grab_file(const char *filename, unsigned long *size) return NULL; buffer = malloc(max+1); + if (!buffer) + goto error; *size = 0; while ((ret = read(fd, buffer + *size, max - *size)) > 0) { *size += ret; if (*size == max) { + void *nbuffer; max *= 2; - buffer = realloc(buffer, max + 1); + nbuffer = realloc(buffer, max + 1); + if (!nbuffer) + goto error; + buffer = nbuffer; } } - if (ret < 0) { - free(buffer); - buffer = NULL; - } else - ((char *)buffer)[*size] = '\0'; + if (ret < 0) + goto error; + ((char *)buffer)[*size] = '\0'; close(fd); return buffer; +error: + free(buffer); + close(fd); + return NULL; } void release_file(void *data, unsigned long size __attribute__((unused))) |