chiark / gitweb /
journal: do not leak mmaps on OOM
authorPhilippe De Swert <philippedeswert@gmail.com>
Wed, 10 Sep 2014 09:20:41 +0000 (12:20 +0300)
committerDavid Herrmann <dh.herrmann@gmail.com>
Thu, 11 Sep 2014 15:27:44 +0000 (17:27 +0200)
After a section of memory is succesfully allocated, some of the following
actions can still fail due to lack of memory. In this case -ENOMEM is
returned without actually freeing the already mapped memory.
Found with coverity. Fixes: CID#1237762

src/journal/mmap-cache.c

index 7dbbb5ef381b4c6b617441c4a6dae2c74aae9ca3..908562da27a45e922f5ddccfe31de12d0934a98b 100644 (file)
@@ -496,15 +496,15 @@ static int add_mmap(
 
         c = context_add(m, context);
         if (!c)
 
         c = context_add(m, context);
         if (!c)
-                return -ENOMEM;
+                goto outofmem;
 
         f = fd_add(m, fd);
         if (!f)
 
         f = fd_add(m, fd);
         if (!f)
-                return -ENOMEM;
+                goto outofmem;
 
         w = window_add(m);
         if (!w)
 
         w = window_add(m);
         if (!w)
-                return -ENOMEM;
+                goto outofmem;
 
         w->keep_always = keep_always;
         w->ptr = d;
 
         w->keep_always = keep_always;
         w->ptr = d;
@@ -522,6 +522,10 @@ static int add_mmap(
         if (ret)
                 *ret = (uint8_t*) w->ptr + (offset - w->offset);
         return 1;
         if (ret)
                 *ret = (uint8_t*) w->ptr + (offset - w->offset);
         return 1;
+
+outofmem:
+        munmap(d, wsize);
+        return -ENOMEM;
 }
 
 int mmap_cache_get(
 }
 
 int mmap_cache_get(