]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-ldap/map.c
better error handling when returning results
[openldap] / servers / slapd / back-ldap / map.c
index 5e0dc55026ba4d8de7b137f0068b259bc5c642f0..7bf1e470a1cd057b603e2a0941a489ea759a9ba1 100644 (file)
@@ -1,6 +1,6 @@
 /* map.c - ldap backend mapping routines */
 /*
- * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved.
+ * Copyright 1998-2002 The OpenLDAP Foundation, All Rights Reserved.
  * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
  */
 /* This is an altered version */
@@ -183,16 +183,18 @@ ldap_back_map_filter(
                                plen = m.bv_len;
                                extra -= plen;
                                if (extra < 0) {
+                                       char *tmpnf;
                                        while (extra < 0) {
                                                extra += len;
                                                len *= 2;
                                        }
                                        s -= (long)nf;
-                                       nf = ch_realloc(nf, len + 1);
-                                       if (nf == NULL) {
-                                               free(nf);
+                                       tmpnf = ch_realloc(nf, len + 1);
+                                       if (tmpnf == NULL) {
+                                               ch_free(nf);
                                                return(NULL);
                                        }
+                                       nf = tmpnf;
                                        s += (long)nf;
                                }
                                AC_MEMCPY(s, m.bv_val, plen);
@@ -214,7 +216,7 @@ ldap_back_map_attrs(
                int remap
 )
 {
-       int i;
+       int i, j;
        char **na;
        struct berval mapped;
 
@@ -229,14 +231,14 @@ ldap_back_map_attrs(
        if (na == NULL)
                return(NULL);
 
-       for (i = 0; an[i].an_name.bv_val; ) {
+       for (i = j = 0; an[i].an_name.bv_val; i++) {
                ldap_back_map(at_map, &an[i].an_name, &mapped, remap);
-               if (mapped.bv_val != NULL) {
-                       na[i] = mapped.bv_val;
-                       i++;
-               }
+               if (mapped.bv_val != NULL)
+                       na[j++] = mapped.bv_val;
        }
-       na[i] = NULL;
+       if (j == 0 && i != 0)
+               na[j++] = LDAP_NO_ATTRS;
+       na[j] = NULL;
 
        return(na);
 }