path is allocated by asprintf() and must be freed later if realloc() fails or at
the end of each while() iteration

Move the free() call out of LIBVIRT_NSS_GUEST macro and add another one if
realloc() fails

Found by Linux Verification Center (linuxtesting.org) with Svace.

Reported-by: Dmitry Fedin <d.fe...@fobos-nt.ru>
Signed-off-by: Alexander Kuznetsov <kuznetso...@altlinux.org>
---
 tools/nss/libvirt_nss.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/tools/nss/libvirt_nss.c b/tools/nss/libvirt_nss.c
index d79a00a1b0..190cc7a3dd 100644
--- a/tools/nss/libvirt_nss.c
+++ b/tools/nss/libvirt_nss.c
@@ -141,8 +141,11 @@ findLease(const char *name,
                 goto cleanup;
 
             tmpLease = realloc(leaseFiles, sizeof(char *) * (nleaseFiles + 1));
-            if (!tmpLease)
+            if (!tmpLease) {
+                free(path);
                 goto cleanup;
+            }
+
             leaseFiles = tmpLease;
             leaseFiles[nleaseFiles++] = path;
 #if defined(LIBVIRT_NSS_GUEST)
@@ -155,8 +158,8 @@ findLease(const char *name,
                 free(path);
                 goto cleanup;
             }
-            free(path);
 #endif /* LIBVIRT_NSS_GUEST */
+            free(path);
         }
 
         errno = 0;
-- 
2.42.4

Reply via email to