]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/modify.c
ITS#4088 force cursors to use same locker
[openldap] / servers / slapd / modify.c
index 4473e1b7dac665308372ab4ab58cfab0a5e9a593..4f90671ec32f5ca3ab160167284bfdb0fa176613 100644 (file)
@@ -215,7 +215,6 @@ fe_op_modify( Operation *op, SlapReply *rs )
 #endif
        int             manageDSAit;
        Modifications   *modlist = op->orm_modlist;
-       Modifications   **modtail = &modlist;
        int             increment = op->orm_increment;
        BackendDB *op_be;
        char            textbuf[ SLAP_TEXT_BUFLEN ];
@@ -818,7 +817,7 @@ void slap_mods_opattrs(
        struct berval nname;
        char timebuf[ LDAP_LUTIL_GENTIME_BUFSIZE ];
        char csnbuf[ LDAP_LUTIL_CSNSTR_BUFSIZE ];
-       Modifications *mod, **modtail;
+       Modifications *mod, **modtail, *modlast;
 
        if ( SLAP_LASTMOD( op->o_bd ) ) {
                char *ptr;
@@ -869,18 +868,18 @@ void slap_mods_opattrs(
                assert( !BER_BVISNULL( &mod->sml_values[0] ) );
                mod->sml_nvalues = NULL;
                *modtail = mod;
+               modlast = mod;
                modtail = &mod->sml_next;
        
-               mod = *modtail;
                if ( get_manageDIT( op ) ) {
-                       for ( mod = mods; mod->sml_next; mod = mod->sml_next ) {
+                       for ( mod = mods; mod != modlast; mod = mod->sml_next ) {
                                if ( mod->sml_desc == slap_schema.si_ad_modifiersName ) {
                                        break;
                                }
                        }
                }
 
-               if ( mod == *modtail ) {
+               if ( mod->sml_desc != slap_schema.si_ad_modifiersName ) {
                        mod = (Modifications *) ch_malloc( sizeof( Modifications ) );
                        mod->sml_op = LDAP_MOD_REPLACE;
                        mod->sml_flags = SLAP_MOD_INTERNAL;
@@ -900,16 +899,15 @@ void slap_mods_opattrs(
                        modtail = &mod->sml_next;
                }
 
-               mod = *modtail;
                if ( get_manageDIT( op ) ) {
-                       for ( mod = mods; mod->sml_next; mod = mod->sml_next ) {
+                       for ( mod = mods; mod != modlast; mod = mod->sml_next ) {
                                if ( mod->sml_desc == slap_schema.si_ad_modifyTimestamp ) {
                                        break;
                                }
                        }
                }
 
-               if ( mod == *modtail ) {
+               if ( mod->sml_desc != slap_schema.si_ad_modifyTimestamp ) {
                        mod = (Modifications *) ch_malloc( sizeof( Modifications ) );
                        mod->sml_op = LDAP_MOD_REPLACE;
                        mod->sml_flags = SLAP_MOD_INTERNAL;
@@ -921,6 +919,8 @@ void slap_mods_opattrs(
                        BER_BVZERO( &mod->sml_values[1] );
                        assert( !BER_BVISNULL( &mod->sml_values[0] ) );
                        mod->sml_nvalues = NULL;
+                       *modtail = mod;
+                       modtail = &mod->sml_next;
                }
        }
 }