]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/ad.c
first step towards removing back-*/external.h
[openldap] / servers / slapd / ad.c
index 6896f9a353f9e5632ab0b0d0d29534bf55f1a2e0..a05cefe556dcefb2629e3cacfee5fd391e37f340 100644 (file)
@@ -24,7 +24,6 @@
 #include <ac/string.h>
 #include <ac/time.h>
 
-#include "ldap_pvt.h"
 #include "slap.h"
 #include "lutil.h"
 
@@ -793,6 +792,7 @@ str2anlist( AttributeName *an, char *in, const char *brkstr )
        }
 
        an = ch_realloc( an, ( i + j + 1 ) * sizeof( AttributeName ) );
+       BER_BVZERO( &an[i + j].an_name );
        anew = an + i;
        for ( s = ldap_pvt_strtok( str, brkstr, &lasts );
                s != NULL;
@@ -811,14 +811,7 @@ str2anlist( AttributeName *an, char *in, const char *brkstr )
                                        adname.bv_val = &anew->an_name.bv_val[1];
                                        slap_bv2ad(&adname, &anew->an_desc, &text);
                                        if ( !anew->an_desc ) {
-                                               free( an );
-                                               free( str );
-                                               /*
-                                                * overwrites input string
-                                                * on error!
-                                                */
-                                               strcpy( in, s );
-                                               return NULL;
+                                               goto reterr;
                                        }
                                } break;
 
@@ -830,14 +823,7 @@ str2anlist( AttributeName *an, char *in, const char *brkstr )
                                        ocname.bv_val = &anew->an_name.bv_val[1];
                                        anew->an_oc = oc_bvfind( &ocname );
                                        if ( !anew->an_oc ) {
-                                               free( an );
-                                               free( str );
-                                               /*
-                                                * overwrites input string
-                                                * on error!
-                                                */
-                                               strcpy( in, s );
-                                               return NULL;
+                                               goto reterr;
                                        }
 
                                        if ( anew->an_name.bv_val[0] == '!' ) {
@@ -849,11 +835,7 @@ str2anlist( AttributeName *an, char *in, const char *brkstr )
                                /* old (deprecated) way */
                                anew->an_oc = oc_bvfind( &anew->an_name );
                                if ( !anew->an_oc ) {
-                                       free( an );
-                                       free( str );
-                                       /* overwrites input string on error! */
-                                       strcpy( in, s );
-                                       return NULL;
+                                       goto reterr;
                                }
                        }
                }
@@ -863,6 +845,19 @@ str2anlist( AttributeName *an, char *in, const char *brkstr )
        anew->an_name.bv_val = NULL;
        free( str );
        return( an );
+
+reterr:
+       for ( i = 0; an[i].an_name.bv_val; i++ ) {
+               free( an[i].an_name.bv_val );
+       }
+       free( an );
+       /*
+        * overwrites input string
+        * on error!
+        */
+       strcpy( in, s );
+       free( str );
+       return NULL;
 }
 
 char **anlist2charray_x( AttributeName *an, int dup, void *ctx )
@@ -904,7 +899,7 @@ anlist2attrs( AttributeName * anlist )
        attrs = anlist2charray( anlist, 1 );
                                                                                 
        for ( i = 0; anlist[i].an_name.bv_val; i++ ) {
-               if ( oc = anlist[i].an_oc ) {
+               if ( ( oc = anlist[i].an_oc ) ) {
                        for ( j = 0; oc->soc_required && oc->soc_required[j]; j++ ) ;
                        k += j;
                        for ( j = 0; oc->soc_allowed && oc->soc_allowed[j]; j++ ) ;
@@ -921,7 +916,7 @@ anlist2attrs( AttributeName * anlist )
                attrs = (char **) ch_realloc( attrs, (i + k + 1) * sizeof( char * ));
 
        for ( i = 0; anlist[i].an_name.bv_val; i++ ) {
-               if ( oc = anlist[i].an_oc ) {
+               if ( ( oc = anlist[i].an_oc ) ) {
                        for ( j = 0; oc->soc_required && oc->soc_required[j]; j++ ) {
                                attrs[n++] = ch_strdup(
                                                                oc->soc_required[j]->sat_cname.bv_val );
@@ -964,7 +959,8 @@ anlist2attrs( AttributeName * anlist )
                }
        }
 
-       attrs = (char **) ch_realloc( attrs, (i+1) * sizeof( char * ));
+       if ( i != n )
+               attrs = (char **) ch_realloc( attrs, (i+1) * sizeof( char * ));
 
        return attrs;
 }
@@ -999,7 +995,7 @@ file2anlist( AttributeName *an, const char *fname, const char *brkstr )
        while ( fgets( lcur, LBUFSIZ, fp ) != NULL ) {
                char *str, *s, *next;
                const char *delimstr = brkstr;
-               if (c = strchr( lcur, '\n' )) {
+               if ( ( c = strchr( lcur, '\n' ) ) ) {
                        if ( c == line ) {
                                *c = '\0';
                        } else if ( *(c-1) == '\r' ) {