From 0de4876496671e90d5eb1bbecaff39706baa0934 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Mon, 3 Sep 2018 14:22:08 +0900 Subject: [PATCH] core/socket: fix memleak in the error paths in usbffs_dispatch_eps() --- TODO | 2 -- src/core/socket.c | 20 ++++++++++++++------ 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/TODO b/TODO index 38d8bd7b49..65dc51b225 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 92cf181541..8775bc8a58 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; }