On Mon, Apr 14, 2025 at 02:25:05PM +0200, Peter Krempa wrote: > On Mon, Apr 14, 2025 at 13:20:55 +0100, Daniel P. Berrangé via Devel wrote: > > On Mon, Apr 14, 2025 at 03:06:09PM +0300, Alexander Kuznetsov wrote: > > > 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); > > > > AFAICT in this 'else if' branch, 'path' is only allocated inside the > > 'LIBVIRT_NSS_GUEST' condition, so movnig the free outside is pointless. > > > > Rather than adding more "free" calls, I think this code would be > > improved by declaring 'path' with "g_autofree" and using > > g_steal_pointer when assigning it to 'leaseFiles[nleaseFiles++]', > > then existing 'free' calls can be removed. > > IIUC the NSS module code is supposed to be glib-free to avoid pulling it > into the code that uses lookups.
Oh yes, but we can still use attribute(cleanup) directly though without glib. Or even just #define g_autofree locally so we match the codestyle With regards, Daniel -- |: https://berrange.com -o- https://www.flickr.com/photos/dberrange :| |: https://libvirt.org -o- https://fstop138.berrange.com :| |: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|