File net-snmp-5.7.3-fix-potential-bad-free.patch of Package net-snmp.27328

commit d27ccfba26840ef8446152c007557ca4daa45a8f
Author: Jan Safranek <jsafranek@users.sourceforge.net>
Date:   Mon Jan 18 12:38:58 2016 +0100

    Fixed potential bad free.
    
    When a 'default_domain' starts with a comma ',', the first strtok()
    returns pointer somwehere to the 'default_domain' duplicate and not
    to the first character. When cleaning up, make sure we try to free
    the duplicate (i.e. tokenized_domain) and not the first found token
    (which may be different).

diff --git a/snmplib/snmp_transport.c b/snmplib/snmp_transport.c
index 29bc50a6d2..b3cbcc2e7e 100644
--- a/snmplib/snmp_transport.c
+++ b/snmplib/snmp_transport.c
@@ -499,6 +499,7 @@ netsnmp_tdomain_transport_full(const char *application,
     int                 any_found = 0;
     char buf[SNMP_MAXPATH];
     char **lspec = 0;
+    char *tokenized_domain = 0;
 
     DEBUGMSGTL(("tdomain",
                 "tdomain_transport_full(\"%s\", \"%s\", %d, \"%s\", \"%s\")\n",
@@ -593,13 +594,13 @@ netsnmp_tdomain_transport_full(const char *application,
             else {
                 int commas = 0;
                 const char *cp = default_domain;
-                char *dup = strdup(default_domain);
                 char *ptr = NULL;
+                tokenized_domain = strdup(default_domain);
 
                 while (*++cp) if (*cp == ',') commas++;
                 lspec = calloc(commas+2, sizeof(char *));
                 commas = 1;
-                lspec[0] = strtok_r(dup, ",", &ptr);
+                lspec[0] = strtok_r(tokenized_domain, ",", &ptr);
                 while ((lspec[commas++] = strtok_r(NULL, ",", &ptr)))
                     ;
                 spec = (const char * const *)lspec;
@@ -653,7 +654,7 @@ netsnmp_tdomain_transport_full(const char *application,
                 t = match->f_create_from_tstring_new(addr, local, addr2);
             if (t) {
                 if (lspec) {
-                    free(lspec[0]);
+                    free(tokenized_domain);
                     free(lspec);
                 }
                 return t;
@@ -668,7 +669,7 @@ netsnmp_tdomain_transport_full(const char *application,
     if (!any_found)
         snmp_log(LOG_ERR, "No support for any checked transport domain\n");
     if (lspec) {
-        free(lspec[0]);
+        free(tokenized_domain);
         free(lspec);
     }
     return NULL;
openSUSE Build Service is sponsored by