nsswitch: fix double free errors in nsstest.c
authorStefan Metzmacher <metze@samba.org>
Sat, 10 Feb 2018 22:54:33 +0000 (23:54 +0100)
committerRalph Boehme <slow@samba.org>
Wed, 21 Feb 2018 13:19:17 +0000 (14:19 +0100)
We need to zero out static pointers on free.

Bug: https://bugzilla.samba.org/show_bug.cgi?id=13283

Signed-off-by: Stefan Metzmacher <metze@samba.org>
Reviewed-by: Ralph Boehme <slow@samba.org>
nsswitch/nsstest.c

index 4b3d0a4..6d92806 100644 (file)
@@ -21,6 +21,8 @@
 #include "replace.h"
 #include "nsswitch/nsstest.h"
 
+#define SAFE_FREE(x) do { if ((x) != NULL) {free(x); (x)=NULL;} } while(0)
+
 static const char *so_path = "/lib/libnss_winbind.so";
 static const char *nss_name = "winbind";
 static int nss_errno;
@@ -48,10 +50,10 @@ static void *find_fn(const char *name)
        if (!res) {
                printf("Can't find function %s\n", s);
                total_errors++;
-               free(s);
+               SAFE_FREE(s);
                return NULL;
        }
-       free(s);
+       SAFE_FREE(s);
        return res;
 }
 
@@ -194,12 +196,12 @@ again:
                goto again;
        }
        if (status == NSS_STATUS_NOTFOUND) {
-               free(buf);
+               SAFE_FREE(buf);
                return NULL;
        }
        if (status != NSS_STATUS_SUCCESS) {
                report_nss_error("getgrent", status);
-               free(buf);
+               SAFE_FREE(buf);
                return NULL;
        }
        return &grp;
@@ -232,12 +234,12 @@ again:
                goto again;
        }
        if (status == NSS_STATUS_NOTFOUND) {
-               free(buf);
+               SAFE_FREE(buf);
                return NULL;
        }
        if (status != NSS_STATUS_SUCCESS) {
                report_nss_error("getgrnam", status);
-               free(buf);
+               SAFE_FREE(buf);
                return NULL;
        }
        return &grp;
@@ -271,12 +273,12 @@ again:
                goto again;
        }
        if (status == NSS_STATUS_NOTFOUND) {
-               free(buf);
+               SAFE_FREE(buf);
                return NULL;
        }
        if (status != NSS_STATUS_SUCCESS) {
                report_nss_error("getgrgid", status);
-               free(buf);
+               SAFE_FREE(buf);
                return NULL;
        }
        return &grp;