aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tools/xenstore/utils.c20
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)))