contigmem: free allocated memory on error
authorTiwei Bie <tiwei.bie@intel.com>
Sun, 4 Jun 2017 05:53:23 +0000 (13:53 +0800)
committerThomas Monjalon <thomas@monjalon.net>
Mon, 3 Jul 2017 23:32:28 +0000 (01:32 +0200)
Fixes: 764bf26873b9 ("add FreeBSD support")
Cc: stable@dpdk.org
Signed-off-by: Tiwei Bie <tiwei.bie@intel.com>
Acked-by: Bruce Richardson <bruce.richardson@intel.com>
lib/librte_eal/bsdapp/contigmem/contigmem.c

index da971de..03e3e8d 100644 (file)
@@ -123,19 +123,21 @@ static int
 contigmem_load()
 {
        char index_string[8], description[32];
-       int  i;
+       int  i, error = 0;
 
        if (contigmem_num_buffers > RTE_CONTIGMEM_MAX_NUM_BUFS) {
                printf("%d buffers requested is greater than %d allowed\n",
                                contigmem_num_buffers, RTE_CONTIGMEM_MAX_NUM_BUFS);
-               return EINVAL;
+               error = EINVAL;
+               goto error;
        }
 
        if (contigmem_buffer_size < PAGE_SIZE ||
                        (contigmem_buffer_size & (contigmem_buffer_size - 1)) != 0) {
                printf("buffer size 0x%lx is not greater than PAGE_SIZE and "
                                "power of two\n", contigmem_buffer_size);
-               return EINVAL;
+               error = EINVAL;
+               goto error;
        }
 
        for (i = 0; i < contigmem_num_buffers; i++) {
@@ -145,7 +147,8 @@ contigmem_load()
 
                if (contigmem_buffers[i] == NULL) {
                        printf("contigmalloc failed for buffer %d\n", i);
-                       return ENOMEM;
+                       error = ENOMEM;
+                       goto error;
                }
 
                printf("%2u: virt=%p phys=%p\n", i, contigmem_buffers[i],
@@ -165,6 +168,14 @@ contigmem_load()
                        GID_WHEEL, 0600, "contigmem");
 
        return 0;
+
+error:
+       for (i = 0; i < contigmem_num_buffers; i++)
+               if (contigmem_buffers[i] != NULL)
+                       contigfree(contigmem_buffers[i], contigmem_buffer_size,
+                                       M_CONTIGMEM);
+
+       return error;
 }
 
 static int