From: Yu Watanabe Date: Mon, 3 Sep 2018 05:22:08 +0000 (+0900) Subject: core/socket: fix memleak in the error paths in usbffs_dispatch_eps() X-Git-Tag: v240~771^2 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=0de4876496671e90d5eb1bbecaff39706baa0934;p=thirdparty%2Fsystemd.git core/socket: fix memleak in the error paths in usbffs_dispatch_eps() --- diff --git a/TODO b/TODO index 38d8bd7b494..65dc51b2250 100644 --- 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: diff --git a/src/core/socket.c b/src/core/socket.c index 92cf1815410..8775bc8a586 100644 --- a/src/core/socket.c +++ b/src/core/socket.c @@ -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; }