core/socket: fix memleak in the error paths in usbffs_dispatch_eps()
authorYu Watanabe <watanabe.yu+github@gmail.com>
Mon, 3 Sep 2018 05:22:08 +0000 (14:22 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Mon, 3 Sep 2018 05:25:08 +0000 (14:25 +0900)
TODO
src/core/socket.c

diff --git a/TODO b/TODO
index 38d8bd7..65dc51b 100644 (file)
--- a/TODO
+++ b/TODO
@@ -1,7 +1,5 @@
 Bugfixes:
 
-* the error paths in usbffs_dispatch_ep() leak memory
-
 * copy.c: set the right chattrs before copying files and others after
 
 External:
index 92cf181..8775bc8 100644 (file)
@@ -1359,8 +1359,10 @@ static int usbffs_dispatch_eps(SocketPort *p) {
 
         n = (size_t) r;
         p->auxiliary_fds = new(int, n);
-        if (!p->auxiliary_fds)
-                return -ENOMEM;
+        if (!p->auxiliary_fds) {
+                r = -ENOMEM;
+                goto clear;
+        }
 
         p->n_auxiliary_fds = n;
 
@@ -1369,8 +1371,10 @@ static int usbffs_dispatch_eps(SocketPort *p) {
                 _cleanup_free_ char *ep = NULL;
 
                 ep = path_make_absolute(ent[i]->d_name, p->path);
-                if (!ep)
-                        return -ENOMEM;
+                if (!ep) {
+                        r = -ENOMEM;
+                        goto fail;
+                }
 
                 path_simplify(ep, false);
 
@@ -1379,16 +1383,20 @@ static int usbffs_dispatch_eps(SocketPort *p) {
                         goto fail;
 
                 p->auxiliary_fds[k++] = r;
-                free(ent[i]);
         }
 
-        return r;
+        r = 0;
+        goto clear;
 
 fail:
         close_many(p->auxiliary_fds, k);
         p->auxiliary_fds = mfree(p->auxiliary_fds);
         p->n_auxiliary_fds = 0;
 
+clear:
+        for (i = 0; i < n; ++i)
+                free(ent[i]);
+
         return r;
 }