]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/overlays/constraint.c
Merge remote-tracking branch 'origin/mdb.master'
[openldap] / servers / slapd / overlays / constraint.c
index 538d38307f9e03ec3d7d0aedbda33d44ebdea01c..2d943a223f73b0e272a3b96666f42d5e11065f28 100644 (file)
@@ -181,7 +181,7 @@ constraint_cf_gen( ConfigArgs *c )
                                }
 
                                if (cp->count || cp->size) {
-                                       int len = snprintf(val_buf, sizeof(val_buf), "%d", val);
+                                       int len = snprintf(val_buf, sizeof(val_buf), "%zd", val);
                                        if (len <= 0) {
                                                /* error */
                                                return -1;
@@ -845,41 +845,33 @@ constraint_check_count_violation( Modifications *m, Entry *target_entry, constra
        unsigned ca;
        int j;
 
-       for ( j = 0; cp->ap[j]; j++ ) {
-               ca = 0;
+       if ( cp->set )
+               return 0;
 
+       for ( j = 0; cp->ap[j]; j++ ) {
                /* Get this attribute count */
                if ( target_entry )
                        ce = constraint_count_attr( target_entry, cp->ap[j] );
 
                for( ; m; m = m->sml_next ) {
                        if ( cp->ap[j] == m->sml_desc ) {
+                               ca = m->sml_numvals;
                                switch ( m->sml_op ) {
                                case LDAP_MOD_DELETE:
-                                       if (( b = m->sml_values ) == NULL  || b[0].bv_val == NULL ) {
+                                       if ( !ca || ca > ce ) {
                                                ce = 0;
-                                       }
-                                       else {
+                                       } else {
                                                /* No need to check for values' validity. Invalid values
                                                 * cause the whole transaction to die anyway. */
-                                               for ( ca = 0; b[ca].bv_val; ++ca );
                                                ce -= ca;
                                        }
                                        break;
 
                                case LDAP_MOD_ADD:
-                                       if (( b = m->sml_values ) == NULL  || b[0].bv_val == NULL )
-                                               continue;
-
-                                       for ( ca = 0; b[ca].bv_val; ++ca );
                                        ce += ca;
                                        break;
 
                                case LDAP_MOD_REPLACE:
-                                       if (( b = m->sml_values ) == NULL  || b[0].bv_val == NULL )
-                                               continue;
-
-                                       for ( ca = 0; b[ca].bv_val; ++ca );
                                        ce = ca;
                                        break;