fixup memory leak and return value, if malloc or realloc fail.
authorvhanquez@kneesa.uk.xensource.com <vhanquez@kneesa.uk.xensource.com>
Tue, 24 Jan 2006 10:55:45 +0000 (10:55 +0000)
committervhanquez@kneesa.uk.xensource.com <vhanquez@kneesa.uk.xensource.com>
Tue, 24 Jan 2006 10:55:45 +0000 (10:55 +0000)
Signed-off-by: Vincent Hanquez <vincent@xensource.com>
tools/xenstore/utils.c

index f8bf989c22e96413c7bec49a0f0574984a92db26..6655777bcd402460538c1a70e7fcaf99db376eff 100644 (file)
@@ -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)))