]> git.sur5r.net Git - openldap/commitdiff
ITS#6715: Fix slap_sort_vals(attr with 1 value)
authorHallvard Furuseth <hallvard@openldap.org>
Fri, 19 Nov 2010 12:21:34 +0000 (12:21 +0000)
committerHallvard Furuseth <hallvard@openldap.org>
Fri, 19 Nov 2010 12:21:34 +0000 (12:21 +0000)
Also rearrange slightly to silence gcc -Wuninitialized, get a single
exit point, and skip the unnecessary sorting of the single value.

servers/slapd/modify.c

index 8898a8eebddcd91878b72ed3eca9db36f4a19805..87756dc0a291916be1ec6f64e6352f71765d6c98 100644 (file)
@@ -684,7 +684,7 @@ slap_sort_vals(
        AttributeDescription *ad;
        MatchingRule *mr;
        int istack[sizeof(int)*16];
-       int i, j, k, l, ir, jstack, match, *ix, itmp, nvals, rc;
+       int i, j, k, l, ir, jstack, match, *ix, itmp, nvals, rc = LDAP_SUCCESS;
        int is_norm;
        struct berval a, *cv;
 
@@ -705,6 +705,8 @@ slap_sort_vals(
 
        ad = ml->sml_desc;
        nvals = ml->sml_numvals;
+       if ( nvals <= 1 )
+               goto ret;
 
        /* For Modifications, sml_nvalues is NULL if normalization wasn't needed.
         * For Attributes, sml_nvalues == sml_values when normalization isn't needed.
@@ -834,15 +836,14 @@ slap_sort_vals(
 
        slap_sl_free( ix, ctx );
 
-       if ( rc != LDAP_SUCCESS ) {
-               return rc;
-       } else if ( match == 0 ) {
+       if ( rc == LDAP_SUCCESS && match == 0 ) {
                /* value exists already */
                assert( i >= 0 );
                assert( i < nvals );
-               return LDAP_TYPE_OR_VALUE_EXISTS;
+               rc = LDAP_TYPE_OR_VALUE_EXISTS;
        }
-       return LDAP_SUCCESS;
+ ret:
+       return rc;
 }
 
 /* Enter with bv->bv_len = sizeof buffer, returns with