]> git.sur5r.net Git - openldap/commitdiff
ITS#3924
authorLuke Howard <lukeh@openldap.org>
Tue, 9 Aug 2005 05:28:58 +0000 (05:28 +0000)
committerLuke Howard <lukeh@openldap.org>
Tue, 9 Aug 2005 05:28:58 +0000 (05:28 +0000)
Also, fix slapi_dn_parent() crasher

servers/slapd/slapi/proto-slapi.h
servers/slapd/slapi/slapi_pblock.c
servers/slapd/slapi/slapi_utils.c

index 0d1e8ee6c9636913bdd6a39546dd980e789e710f..0728af5bcbb1ef949654f25d0ce4ca4ccf090eba 100644 (file)
@@ -26,7 +26,7 @@
 LDAP_BEGIN_DECL
 
 /* slapi_utils.c */
-LDAP_SLAPI_F (LDAPMod **) slapi_int_modifications2ldapmods LDAP_P(( Modifications ** ));
+LDAP_SLAPI_F (LDAPMod **) slapi_int_modifications2ldapmods LDAP_P(( Modifications * ));
 LDAP_SLAPI_F (Modifications *) slapi_int_ldapmods2modifications LDAP_P(( LDAPMod ** ));
 LDAP_SLAPI_F (int) slapi_int_count_controls LDAP_P(( LDAPControl **ctrls ));
 LDAP_SLAPI_F (char **) slapi_get_supported_extended_ops LDAP_P((void));
index e273295c1ba5f2245ce669c07e73bde0c37f7bf4..1b4e5dab5621f1df9b535b7ec607195d104ba132 100644 (file)
@@ -607,7 +607,7 @@ pblock_get( Slapi_PBlock *pb, int param, void **value )
                                rc = PBLOCK_ERROR;
                                break;
                        }
-                       mods = slapi_int_modifications2ldapmods( &pb->pb_op->orm_modlist );
+                       mods = slapi_int_modifications2ldapmods( pb->pb_op->orm_modlist );
                        pblock_set_default( pb, param, (void *)mods );
                }
                *((LDAPMod ***)value) = mods;
index 8c82d9adea5721ed84bb77d5dbd2414661cc6f61..3e1d1149baa062a0c06d710ddfe0e1f8ec7dbacd 100644 (file)
@@ -903,6 +903,7 @@ slapi_dn_parent( const char *_dn )
 {
        struct berval   dn, prettyDN;
        struct berval   parentDN;
+       char            *ret;
 
        if ( _dn == NULL ) {
                return NULL;
@@ -921,13 +922,15 @@ slapi_dn_parent( const char *_dn )
 
        dnParent( &prettyDN, &parentDN ); /* in-place */
 
-       slapi_ch_free( (void **)&prettyDN.bv_val );
-
        if ( parentDN.bv_len == 0 ) {
+               slapi_ch_free_string( &prettyDN.bv_val );
                return NULL;
        }
 
-       return slapi_ch_strdup( parentDN.bv_val );
+       ret = slapi_ch_strdup( parentDN.bv_val );
+       slapi_ch_free_string( &prettyDN.bv_val );
+
+       return ret;
 }
 
 int slapi_dn_isbesuffix( Slapi_PBlock *pb, char *ldn )
@@ -2691,20 +2694,14 @@ int slapi_acl_check_mods(Slapi_PBlock *pb, Slapi_Entry *e, LDAPMod **mods, char
 
 /*
  * Synthesise an LDAPMod array from a Modifications list to pass
- * to SLAPI. This synthesis is destructive and as such the 
- * Modifications list may not be used after calling this 
- * function.
- * 
- * This function must also be called before slap_mods_check().
+ * to SLAPI.
  */
-LDAPMod **slapi_int_modifications2ldapmods( Modifications **pmodlist )
+LDAPMod **slapi_int_modifications2ldapmods( Modifications *modlist )
 {
-       Modifications *ml, *modlist;
+       Modifications *ml;
        LDAPMod **mods, *modp;
        int i, j;
 
-       modlist = *pmodlist;
-
        for( i = 0, ml = modlist; ml != NULL; i++, ml = ml->sml_next )
                ;
 
@@ -2731,14 +2728,9 @@ LDAPMod **slapi_int_modifications2ldapmods( Modifications **pmodlist )
                        for( j = 0; ml->sml_values[j].bv_val != NULL; j++ ) {
                                modp->mod_bvalues[j] = (struct berval *)slapi_ch_malloc(
                                                sizeof(struct berval) );
-                               /* Take ownership of original values. */
-                               modp->mod_bvalues[j]->bv_len = ml->sml_values[j].bv_len;
-                               modp->mod_bvalues[j]->bv_val = ml->sml_values[j].bv_val;
-                               ml->sml_values[j].bv_len = 0;
-                               ml->sml_values[j].bv_val = NULL;
+                               ber_dupbv( modp->mod_bvalues[j], &ml->sml_values[j] );
                        }
                        modp->mod_bvalues[j] = NULL;
-                       slapi_ch_free( (void **)&ml->sml_values );
                } else {
                        modp->mod_bvalues = NULL;
                }
@@ -2747,9 +2739,6 @@ LDAPMod **slapi_int_modifications2ldapmods( Modifications **pmodlist )
 
        mods[i] = NULL;
 
-       slap_mods_free( modlist, 1 );
-       *pmodlist = NULL;
-
        return mods;
 }