]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/entry.c
fix previous commit (ITS#4861)
[openldap] / servers / slapd / entry.c
index 54f7eaf296342e4ef4e7aba32484d6e4ef145139..af8b3c7ec440deaa043f94b1a1573afceb9eb823 100644 (file)
@@ -2,7 +2,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 1998-2005 The OpenLDAP Foundation.
+ * Copyright 1998-2007 The OpenLDAP Foundation.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -132,6 +132,11 @@ str2entry2( char *s, int checkvals )
                        break;
                }
                i++;
+               if (i >= lines) {
+                       Debug( LDAP_DEBUG_TRACE,
+                               "<= str2entry ran past end of entry\n", 0, 0, 0 );
+                       goto fail;
+               }
 
                rc = ldif_parse_line2( s, type+i, vals+i, &freev );
                freeval[i] = freev;
@@ -173,6 +178,8 @@ str2entry2( char *s, int checkvals )
                goto fail;
        }
 
+#define bvcasematch(bv1, bv2)  ( ((bv1)->bv_len == (bv2)->bv_len) && (strncasecmp((bv1)->bv_val, (bv2)->bv_val, (bv1)->bv_len) == 0) )
+
        /* Make sure all attributes with multiple values are contiguous */
        if ( checkvals ) {
                int j, k;
@@ -181,7 +188,7 @@ str2entry2( char *s, int checkvals )
 
                for (i=0; i<lines; i++) {
                        for ( j=i+1; j<lines; j++ ) {
-                               if ( bvmatch( type+i, type+j )) {
+                               if ( bvcasematch( type+i, type+j )) {
                                        /* out of order, move intervening attributes down */
                                        if ( j != i+1 ) {
                                                bv = vals[j];
@@ -204,7 +211,7 @@ str2entry2( char *s, int checkvals )
 
        for ( i=0; i<=lines; i++ ) {
                ad_prev = ad;
-               if ( !ad || ( i<lines && !bvmatch( type+i, &ad->ad_cname ))) {
+               if ( !ad || ( i<lines && !bvcasematch( type+i, &ad->ad_cname ))) {
                        ad = NULL;
                        rc = slap_bv2ad( type+i, &ad, &text );
 
@@ -282,7 +289,7 @@ str2entry2( char *s, int checkvals )
                                 * validate value per syntax
                                 */
 #ifdef SLAP_ORDERED_PRETTYNORM
-                               rc = ordered_value_validate( ad, &vals[i] );
+                               rc = ordered_value_validate( ad, &vals[i], LDAP_MOD_ADD );
 #else /* ! SLAP_ORDERED_PRETTYNORM */
                                rc = validate( ad->ad_type->sat_syntax, &vals[i] );
 #endif /* ! SLAP_ORDERED_PRETTYNORM */