]> git.sur5r.net Git - openldap/commitdiff
Fix realloc() bugs
authorKurt Zeilenga <kurt@openldap.org>
Tue, 8 Oct 2002 20:37:30 +0000 (20:37 +0000)
committerKurt Zeilenga <kurt@openldap.org>
Tue, 8 Oct 2002 20:37:30 +0000 (20:37 +0000)
libraries/liblber/memory.c
libraries/libldap/dnssrv.c

index 73b338e3b52f89f5fb16763e0d97026578bba32d..fb68dd5c14847b40475c9d2382e4fe93ee91feb7 100644 (file)
@@ -674,22 +674,32 @@ ber_bvarray_add( BerVarray *a, BerValue *bv )
                        return 0;
                }
                n = 0;
+
                *a = (BerValue *) LBER_MALLOC( 2 * sizeof(BerValue) );
+               if ( *a == NULL ) {
+                       return -1;
+               }
+
        } else {
+               BerVarray *atmp;
                BER_MEM_VALID( a );
 
                for ( n = 0; *a != NULL && (*a)[n].bv_val != NULL; n++ ) {
-                       ;       /* NULL */
+                       ;       /* just count them */
                }
 
                if (bv == NULL) {
                        return n;
                }
-               *a = (BerValue *) LBER_REALLOC( (char *) *a,
+
+               *atmp = (BerValue *) LBER_REALLOC( (char *) *a,
                    (n + 2) * sizeof(BerValue) );
-       }
-       if ( *a == NULL ) {
-               return -1;
+
+               if( *atmp == NULL ) {
+                       return -1;
+               }
+
+               *a = *atmp;
        }
 
        (*a)[n++] = *bv;
index 72835f22e89bfec97fe73e8183aabc3778061195..ef5eb89d3b8f58806d0cac45cb66430b2939e97d 100644 (file)
@@ -121,46 +121,49 @@ int ldap_domain2dn(
        LDAP_CONST char *domain_in,
        char **dnp)
 {
-    char *domain, *s, *tok_r, *dn;
-    size_t loc;
+       char *domain, *s, *tok_r, *dn, *dntmp;
+       size_t loc;
 
        assert( domain_in != NULL );
        assert( dnp != NULL );
 
-    domain = LDAP_STRDUP(domain_in);
-    if (domain == NULL) {
+       domain = LDAP_STRDUP(domain_in);
+       if (domain == NULL) {
                return LDAP_NO_MEMORY;
-    }
-    dn = NULL;
-    loc = 0;
-
-    for (s = ldap_pvt_strtok(domain, ".", &tok_r);
-        s != NULL;
-        s = ldap_pvt_strtok(NULL, ".", &tok_r)) {
-       size_t len = strlen(s);
-
-       dn = (char *) LDAP_REALLOC(dn, loc + sizeof(",dc=") + len );
-       if (dn == NULL) {
-           LDAP_FREE(domain);
-           return LDAP_NO_MEMORY;
-       }
-       if (loc > 0) {
-           /* not first time. */
-           strcpy(dn + loc, ",");
-           loc++;
        }
-       strcpy(dn + loc, "dc=");
-       loc += sizeof("dc=")-1;
+       dn = NULL;
+       loc = 0;
+
+       for (s = ldap_pvt_strtok(domain, ".", &tok_r);
+               s != NULL;
+               s = ldap_pvt_strtok(NULL, ".", &tok_r))
+       {
+               size_t len = strlen(s);
+
+               dntmp = (char *) LDAP_REALLOC(dn, loc + sizeof(",dc=") + len );
+               if (dn == NULL) {
+                       LDAP_FREE(dn);
+                   LDAP_FREE(domain);
+                   return LDAP_NO_MEMORY;
+               }
 
-       strcpy(dn + loc, s);
-       loc += len;
-    }
+               dn = dntmp;
 
-    LDAP_FREE(domain);
+               if (loc > 0) {
+                   /* not first time. */
+                   strcpy(dn + loc, ",");
+                   loc++;
+               }
+               strcpy(dn + loc, "dc=");
+               loc += sizeof("dc=")-1;
 
-    *dnp = dn;
+               strcpy(dn + loc, s);
+               loc += len;
+    }
 
-    return LDAP_SUCCESS;
+       LDAP_FREE(domain);
+       *dnp = dn;
+       return LDAP_SUCCESS;
 }
 
 /*