]> git.sur5r.net Git - openldap/blob - servers/slapd/back-sql/modrdn.c
fix different issues with referrals in searches; remove unused tests; cleanup referra...
[openldap] / servers / slapd / back-sql / modrdn.c
1 /* $OpenLDAP$ */
2 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
3  *
4  * Copyright 1999-2005 The OpenLDAP Foundation.
5  * Portions Copyright 1999 Dmitry Kovalev.
6  * Portions Copyright 2002 Pierangelo Masarati.
7  * All rights reserved.
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted only as authorized by the OpenLDAP
11  * Public License.
12  *
13  * A copy of this license is available in the file LICENSE in the
14  * top-level directory of the distribution or, alternatively, at
15  * <http://www.OpenLDAP.org/license.html>.
16  */
17 /* ACKNOWLEDGEMENTS:
18  * This work was initially developed by Dmitry Kovalev for inclusion
19  * by OpenLDAP Software.  Additional significant contributors include
20  * Pierangelo Masarati.
21  */
22
23 #include "portable.h"
24
25 #include <stdio.h>
26 #include <sys/types.h>
27 #include "ac/string.h"
28
29 #include "slap.h"
30 #include "proto-sql.h"
31
32 int
33 backsql_modrdn( Operation *op, SlapReply *rs )
34 {
35         backsql_info            *bi = (backsql_info*)op->o_bd->be_private;
36         SQLHDBC                 dbh = SQL_NULL_HDBC;
37         SQLHSTMT                sth = SQL_NULL_HSTMT;
38         RETCODE                 rc;
39         backsql_entryID         e_id = BACKSQL_ENTRYID_INIT,
40                                 n_id = BACKSQL_ENTRYID_INIT;
41         backsql_srch_info       bsi = { 0 };
42         backsql_oc_map_rec      *oc = NULL;
43         struct berval           pdn = BER_BVNULL, pndn = BER_BVNULL,
44                                 *new_pdn = NULL, *new_npdn = NULL,
45                                 new_dn = BER_BVNULL, new_ndn = BER_BVNULL,
46                                 realnew_dn = BER_BVNULL;
47         LDAPRDN                 new_rdn = NULL;
48         LDAPRDN                 old_rdn = NULL;
49         Entry                   r = { 0 },
50                                 p = { 0 },
51                                 n = { 0 },
52                                 *e = NULL;
53         int                     manageDSAit = get_manageDSAit( op );
54         Modifications           *mod = NULL;
55         struct berval           *newSuperior = op->oq_modrdn.rs_newSup;
56         char                    *next;
57  
58         Debug( LDAP_DEBUG_TRACE, "==>backsql_modrdn() renaming entry \"%s\", "
59                         "newrdn=\"%s\", newSuperior=\"%s\"\n",
60                         op->o_req_dn.bv_val, op->oq_modrdn.rs_newrdn.bv_val, 
61                         newSuperior ? newSuperior->bv_val : "(NULL)" );
62
63         rs->sr_err = backsql_get_db_conn( op, &dbh );
64         if ( rs->sr_err != LDAP_SUCCESS ) {
65                 Debug( LDAP_DEBUG_TRACE, "   backsql_modrdn(): "
66                         "could not get connection handle - exiting\n", 
67                         0, 0, 0 );
68                 rs->sr_text = ( rs->sr_err == LDAP_OTHER )
69                         ?  "SQL-backend error" : NULL;
70                 e = NULL;
71                 goto done;
72         }
73
74         bsi.bsi_e = &r;
75         rs->sr_err = backsql_init_search( &bsi, &op->o_req_ndn,
76                         LDAP_SCOPE_BASE, 
77                         SLAP_NO_LIMIT, SLAP_NO_LIMIT,
78                         (time_t)(-1), NULL, dbh, op, rs,
79                         slap_anlist_all_attributes,
80                         ( BACKSQL_ISF_MATCHED | BACKSQL_ISF_GET_ENTRY ) );
81         switch ( rs->sr_err ) {
82         case LDAP_SUCCESS:
83                 break;
84
85         case LDAP_REFERRAL:
86                 if ( !BER_BVISNULL( &bsi.bsi_e->e_nname ) &&
87                                 dn_match( &op->o_req_ndn, &bsi.bsi_e->e_nname )
88                                 && manageDSAit )
89                 {
90                         rs->sr_err = LDAP_SUCCESS;
91                         rs->sr_text = NULL;
92                         rs->sr_matched = NULL;
93                         if ( rs->sr_ref ) {
94                                 ber_bvarray_free( rs->sr_ref );
95                                 rs->sr_ref = NULL;
96                         }
97                         break;
98                 }
99                 e = &r;
100                 /* fallthru */
101
102         default:
103                 Debug( LDAP_DEBUG_TRACE, "backsql_modrdn(): "
104                         "could not retrieve modrdnDN ID - no such entry\n", 
105                         0, 0, 0 );
106                 if ( !BER_BVISNULL( &r.e_nname ) ) {
107                         /* FIXME: should always be true! */
108                         e = &r;
109
110                 } else {
111                         e = NULL;
112                 }
113                 goto done;
114         }
115
116 #ifdef BACKSQL_ARBITRARY_KEY
117         Debug( LDAP_DEBUG_TRACE, "   backsql_modrdn(): entry id=%s\n",
118                 e_id.eid_id.bv_val, 0, 0 );
119 #else /* ! BACKSQL_ARBITRARY_KEY */
120         Debug( LDAP_DEBUG_TRACE, "   backsql_modrdn(): entry id=%ld\n",
121                 e_id.eid_id, 0, 0 );
122 #endif /* ! BACKSQL_ARBITRARY_KEY */
123
124         if ( get_assert( op ) &&
125                         ( test_filter( op, &r, get_assertion( op ) )
126                           != LDAP_COMPARE_TRUE ) )
127         {
128                 rs->sr_err = LDAP_ASSERTION_FAILED;
129                 e = &r;
130                 goto done;
131         }
132
133         if ( backsql_has_children( bi, dbh, &op->o_req_ndn ) == LDAP_COMPARE_TRUE ) {
134                 Debug( LDAP_DEBUG_TRACE, "   backsql_modrdn(): "
135                         "entry \"%s\" has children\n",
136                         op->o_req_dn.bv_val, 0, 0 );
137                 rs->sr_err = LDAP_NOT_ALLOWED_ON_NONLEAF;
138                 rs->sr_text = "subtree rename not supported";
139                 e = &r;
140                 goto done;
141         }
142
143         /*
144          * Check for entry access to target
145          */
146         if ( !access_allowed( op, &r, slap_schema.si_ad_entry, 
147                                 NULL, ACL_WRITE, NULL ) ) {
148                 Debug( LDAP_DEBUG_TRACE, "   no access to entry\n", 0, 0, 0 );
149                 rs->sr_err = LDAP_INSUFFICIENT_ACCESS;
150                 goto done;
151         }
152
153         dnParent( &op->o_req_dn, &pdn );
154         dnParent( &op->o_req_ndn, &pndn );
155
156         /*
157          * namingContext "" is not supported
158          */
159         if ( BER_BVISEMPTY( &pdn ) ) {
160                 Debug( LDAP_DEBUG_TRACE, "   backsql_modrdn(): "
161                         "parent is \"\" - aborting\n", 0, 0, 0 );
162                 rs->sr_err = LDAP_UNWILLING_TO_PERFORM;
163                 rs->sr_text = "not allowed within namingContext";
164                 e = NULL;
165                 goto done;
166         }
167
168         /*
169          * Check for children access to parent
170          */
171         bsi.bsi_e = &p;
172         e_id = bsi.bsi_base_id;
173         rs->sr_err = backsql_init_search( &bsi, &pndn,
174                         LDAP_SCOPE_BASE, 
175                         SLAP_NO_LIMIT, SLAP_NO_LIMIT,
176                         (time_t)(-1), NULL, dbh, op, rs,
177                         slap_anlist_all_attributes,
178                         BACKSQL_ISF_GET_ENTRY );
179
180 #ifdef BACKSQL_ARBITRARY_KEY
181         Debug( LDAP_DEBUG_TRACE, "   backsql_modrdn(): "
182                 "old parent entry id is %s\n",
183                 bsi.bsi_base_id.eid_id.bv_val, 0, 0 );
184 #else /* ! BACKSQL_ARBITRARY_KEY */
185         Debug( LDAP_DEBUG_TRACE, "   backsql_modrdn(): "
186                 "old parent entry id is %ld\n",
187                 bsi.bsi_base_id.eid_id, 0, 0 );
188 #endif /* ! BACKSQL_ARBITRARY_KEY */
189
190         if ( rs->sr_err != LDAP_SUCCESS ) {
191                 Debug( LDAP_DEBUG_TRACE, "backsql_modrdn(): "
192                         "could not retrieve renameDN ID - no such entry\n", 
193                         0, 0, 0 );
194                 e = &p;
195                 goto done;
196         }
197
198         if ( !access_allowed( op, &p, slap_schema.si_ad_children, 
199                                 NULL, ACL_WRITE, NULL ) ) {
200                 Debug( LDAP_DEBUG_TRACE, "   no access to parent\n", 0, 0, 0 );
201                 rs->sr_err = LDAP_INSUFFICIENT_ACCESS;
202                 goto done;
203         }
204
205         if ( newSuperior ) {
206                 (void)backsql_free_entryID( op, &bsi.bsi_base_id, 0 );
207                 
208                 /*
209                  * namingContext "" is not supported
210                  */
211                 if ( BER_BVISEMPTY( newSuperior ) ) {
212                         Debug( LDAP_DEBUG_TRACE, "   backsql_modrdn(): "
213                                 "newSuperior is \"\" - aborting\n", 0, 0, 0 );
214                         rs->sr_err = LDAP_UNWILLING_TO_PERFORM;
215                         rs->sr_text = "not allowed within namingContext";
216                         e = NULL;
217                         goto done;
218                 }
219
220                 new_pdn = newSuperior;
221                 new_npdn = op->oq_modrdn.rs_nnewSup;
222
223                 /*
224                  * Check for children access to new parent
225                  */
226                 bsi.bsi_e = &n;
227                 rs->sr_err = backsql_init_search( &bsi, new_npdn,
228                                 LDAP_SCOPE_BASE, 
229                                 SLAP_NO_LIMIT, SLAP_NO_LIMIT,
230                                 (time_t)(-1), NULL, dbh, op, rs,
231                                 slap_anlist_all_attributes,
232                                 ( BACKSQL_ISF_MATCHED | BACKSQL_ISF_GET_ENTRY ) );
233                 if ( rs->sr_err != LDAP_SUCCESS ) {
234                         Debug( LDAP_DEBUG_TRACE, "backsql_modrdn(): "
235                                 "could not retrieve renameDN ID - no such entry\n", 
236                                 0, 0, 0 );
237                         e = &n;
238                         goto done;
239                 }
240
241                 n_id = bsi.bsi_base_id;
242
243 #ifdef BACKSQL_ARBITRARY_KEY
244                 Debug( LDAP_DEBUG_TRACE, "   backsql_modrdn(): "
245                         "new parent entry id=%s\n",
246                         n_id.eid_id.bv_val, 0, 0 );
247 #else /* ! BACKSQL_ARBITRARY_KEY */
248                 Debug( LDAP_DEBUG_TRACE, "   backsql_modrdn(): "
249                         "new parent entry id=%ld\n",
250                         n_id.eid_id, 0, 0 );
251 #endif /* ! BACKSQL_ARBITRARY_KEY */
252
253                 if ( !access_allowed( op, &n, slap_schema.si_ad_children, 
254                                         NULL, ACL_WRITE, NULL ) ) {
255                         Debug( LDAP_DEBUG_TRACE, "   backsql_modrdn(): "
256                                         "no access to new parent \"%s\"\n", 
257                                         new_pdn->bv_val, 0, 0 );
258                         rs->sr_err = LDAP_INSUFFICIENT_ACCESS;
259                         e = &n;
260                         goto done;
261                 }
262
263         } else {
264                 n_id = bsi.bsi_base_id;
265                 new_pdn = &pdn;
266                 new_npdn = &pndn;
267         }
268
269         if ( newSuperior && dn_match( &pndn, new_npdn ) ) {
270                 Debug( LDAP_DEBUG_TRACE, "   backsql_modrdn(): "
271                         "newSuperior is equal to old parent - ignored\n",
272                         0, 0, 0 );
273                 newSuperior = NULL;
274         }
275
276         if ( newSuperior && dn_match( &op->o_req_ndn, new_npdn ) ) {
277                 Debug( LDAP_DEBUG_TRACE, "   backsql_modrdn(): "
278                         "newSuperior is equal to entry being moved "
279                         "- aborting\n", 0, 0, 0 );
280                 rs->sr_err = LDAP_OTHER;
281                 rs->sr_text = "newSuperior is equal to old DN";
282                 e = &r;
283                 goto done;
284         }
285
286         build_new_dn( &new_dn, new_pdn, &op->oq_modrdn.rs_newrdn,
287                         op->o_tmpmemctx );
288         build_new_dn( &new_ndn, new_npdn, &op->oq_modrdn.rs_nnewrdn,
289                         op->o_tmpmemctx );
290         
291         Debug( LDAP_DEBUG_TRACE, "   backsql_modrdn(): new entry dn is \"%s\"\n",
292                         new_dn.bv_val, 0, 0 );
293
294         realnew_dn = new_dn;
295         if ( backsql_api_dn2odbc( op, rs, &realnew_dn ) ) {
296                 Debug( LDAP_DEBUG_TRACE, "   backsql_modrdn(\"%s\"): "
297                         "backsql_api_dn2odbc(\"%s\") failed\n", 
298                         op->o_req_dn.bv_val, realnew_dn.bv_val, 0 );
299                 SQLFreeStmt( sth, SQL_DROP );
300
301                 rs->sr_text = "SQL-backend error";
302                 rs->sr_err = LDAP_OTHER;
303                 e = NULL;
304                 goto done;
305         }
306
307         Debug( LDAP_DEBUG_TRACE, "   backsql_modrdn(): "
308                 "executing renentry_stmt\n", 0, 0, 0 );
309
310         rc = backsql_Prepare( dbh, &sth, bi->sql_renentry_stmt, 0 );
311         if ( rc != SQL_SUCCESS ) {
312                 Debug( LDAP_DEBUG_TRACE,
313                         "   backsql_modrdn(): "
314                         "error preparing renentry_stmt\n", 0, 0, 0 );
315                 backsql_PrintErrors( bi->sql_db_env, dbh, 
316                                 sth, rc );
317
318                 rs->sr_text = "SQL-backend error";
319                 rs->sr_err = LDAP_OTHER;
320                 e = NULL;
321                 goto done;
322         }
323
324         rc = backsql_BindParamBerVal( sth, 1, SQL_PARAM_INPUT, &realnew_dn );
325         if ( rc != SQL_SUCCESS ) {
326                 Debug( LDAP_DEBUG_TRACE,
327                         "   backsql_add_attr(): "
328                         "error binding DN parameter for objectClass %s\n",
329                         oc->bom_oc->soc_cname.bv_val, 0, 0 );
330                 backsql_PrintErrors( bi->sql_db_env, dbh, 
331                         sth, rc );
332                 SQLFreeStmt( sth, SQL_DROP );
333
334                 rs->sr_text = "SQL-backend error";
335                 rs->sr_err = LDAP_OTHER;
336                 e = NULL;
337                 goto done;
338         }
339
340         rc = backsql_BindParamID( sth, 2, SQL_PARAM_INPUT, &n_id.eid_id );
341         if ( rc != SQL_SUCCESS ) {
342                 Debug( LDAP_DEBUG_TRACE,
343                         "   backsql_add_attr(): "
344                         "error binding parent ID parameter for objectClass %s\n",
345                         oc->bom_oc->soc_cname.bv_val, 0, 0 );
346                 backsql_PrintErrors( bi->sql_db_env, dbh, 
347                         sth, rc );
348                 SQLFreeStmt( sth, SQL_DROP );
349
350                 rs->sr_text = "SQL-backend error";
351                 rs->sr_err = LDAP_OTHER;
352                 e = NULL;
353                 goto done;
354         }
355
356         rc = backsql_BindParamID( sth, 3, SQL_PARAM_INPUT, &e_id.eid_keyval );
357         if ( rc != SQL_SUCCESS ) {
358                 Debug( LDAP_DEBUG_TRACE,
359                         "   backsql_add_attr(): "
360                         "error binding entry ID parameter for objectClass %s\n",
361                         oc->bom_oc->soc_cname.bv_val, 0, 0 );
362                 backsql_PrintErrors( bi->sql_db_env, dbh, 
363                         sth, rc );
364                 SQLFreeStmt( sth, SQL_DROP );
365
366                 rs->sr_text = "SQL-backend error";
367                 rs->sr_err = LDAP_OTHER;
368                 e = NULL;
369                 goto done;
370         }
371
372         rc = backsql_BindParamID( sth, 4, SQL_PARAM_INPUT, &e_id.eid_id );
373         if ( rc != SQL_SUCCESS ) {
374                 Debug( LDAP_DEBUG_TRACE,
375                         "   backsql_add_attr(): "
376                         "error binding ID parameter for objectClass %s\n",
377                         oc->bom_oc->soc_cname.bv_val, 0, 0 );
378                 backsql_PrintErrors( bi->sql_db_env, dbh, 
379                         sth, rc );
380                 SQLFreeStmt( sth, SQL_DROP );
381
382                 rs->sr_text = "SQL-backend error";
383                 rs->sr_err = LDAP_OTHER;
384                 e = NULL;
385                 goto done;
386         }
387
388         rc = SQLExecute( sth );
389         if ( rc != SQL_SUCCESS ) {
390                 Debug( LDAP_DEBUG_TRACE, "   backsql_modrdn(): "
391                         "could not rename ldap_entries record\n", 0, 0, 0 );
392                 backsql_PrintErrors( bi->sql_db_env, dbh, sth, rc );
393                 SQLFreeStmt( sth, SQL_DROP );
394                 rs->sr_err = LDAP_OTHER;
395                 rs->sr_text = "SQL-backend error";
396                 e = NULL;
397                 goto done;
398         }
399         SQLFreeStmt( sth, SQL_DROP );
400
401         /*
402          * Get attribute type and attribute value of our new rdn,
403          * we will need to add that to our new entry
404          */
405         if ( ldap_bv2rdn( &op->oq_modrdn.rs_newrdn, &new_rdn, &next, 
406                                 LDAP_DN_FORMAT_LDAP ) )
407         {
408                 Debug( LDAP_DEBUG_TRACE,
409                         "   backsql_modrdn: can't figure out "
410                         "type(s)/values(s) of new_rdn\n", 
411                         0, 0, 0 );
412                 rs->sr_err = LDAP_INVALID_DN_SYNTAX;
413                 e = &r;
414                 goto done;
415         }
416
417         Debug( LDAP_DEBUG_TRACE, "backsql_modrdn: "
418                 "new_rdn_type=\"%s\", new_rdn_val=\"%s\"\n",
419                 new_rdn[ 0 ]->la_attr.bv_val,
420                 new_rdn[ 0 ]->la_value.bv_val, 0 );
421
422         if ( op->oq_modrdn.rs_deleteoldrdn ) {
423                 if ( ldap_bv2rdn( &op->o_req_dn, &old_rdn, &next,
424                                         LDAP_DN_FORMAT_LDAP ) )
425                 {
426                         Debug( LDAP_DEBUG_TRACE,
427                                 "   backsql_modrdn: can't figure out "
428                                 "the old_rdn type(s)/value(s)\n", 
429                                 0, 0, 0 );
430                         rs->sr_err = LDAP_OTHER;
431                         e = NULL;
432                         goto done;
433                 }
434         }
435
436         rs->sr_err = slap_modrdn2mods( op, rs, &r, old_rdn, new_rdn, &mod );
437         if ( rs->sr_err != LDAP_SUCCESS ) {
438                 e = &r;
439                 goto done;
440         }
441
442         oc = backsql_id2oc( bi, e_id.eid_oc_id );
443         rs->sr_err = backsql_modify_internal( op, rs, dbh, oc, &e_id, mod );
444         if ( rs->sr_err != LDAP_SUCCESS ) {
445                 e = &r;
446                 goto done;
447         }
448
449         if ( global_schemacheck ) {
450                 char            textbuf[ SLAP_TEXT_BUFLEN ] = { '\0' };
451
452                 entry_clean( &r );
453                 (void)backsql_free_entryID( op, &e_id, 0 );
454
455                 bsi.bsi_e = &r;
456                 rs->sr_err = backsql_init_search( &bsi, &new_ndn,
457                                 LDAP_SCOPE_BASE, 
458                                 SLAP_NO_LIMIT, SLAP_NO_LIMIT,
459                                 (time_t)(-1), NULL, dbh, op, rs,
460                                 slap_anlist_all_attributes,
461                                 ( BACKSQL_ISF_MATCHED | BACKSQL_ISF_GET_ENTRY ) );
462                 switch ( rs->sr_err ) {
463                 case LDAP_SUCCESS:
464                         break;
465
466                 case LDAP_REFERRAL:
467                         if ( !BER_BVISNULL( &bsi.bsi_e->e_nname ) &&
468                                         dn_match( &new_ndn, &bsi.bsi_e->e_nname )
469                                         && manageDSAit )
470                         {
471                                 rs->sr_err = LDAP_SUCCESS;
472                                 rs->sr_text = NULL;
473                                 rs->sr_matched = NULL;
474                                 if ( rs->sr_ref ) {
475                                         ber_bvarray_free( rs->sr_ref );
476                                         rs->sr_ref = NULL;
477                                 }
478                                 break;
479                         }
480                         e = &r;
481                         /* fallthru */
482
483                 default:
484                         Debug( LDAP_DEBUG_TRACE, "backsql_modrdn(): "
485                                 "could not retrieve modrdnDN ID - no such entry\n", 
486                                 0, 0, 0 );
487                         if ( !BER_BVISNULL( &r.e_nname ) ) {
488                                 /* FIXME: should always be true! */
489                                 e = &r;
490
491                         } else {
492                                 e = NULL;
493                         }
494                         goto done;
495                 }
496
497                 e_id = bsi.bsi_base_id;
498
499                 rs->sr_err = entry_schema_check( op->o_bd, &r,
500                                 NULL,
501                                 &rs->sr_text, textbuf, sizeof( textbuf ) );
502                 if ( rs->sr_err != LDAP_SUCCESS ) {
503                         Debug( LDAP_DEBUG_TRACE, "   backsql_add(\"%s\"): "
504                                 "entry failed schema check -- aborting\n",
505                                 r.e_name.bv_val, 0, 0 );
506                         e = NULL;
507                         goto done;
508                 }
509         }
510
511 done:;
512 #ifdef SLAP_ACL_HONOR_DISCLOSE
513         if ( e != NULL ) {
514                 if ( !access_allowed( op, e, slap_schema.si_ad_entry, NULL,
515                                         ACL_DISCLOSE, NULL ) )
516                 {
517                         rs->sr_err = LDAP_NO_SUCH_OBJECT;
518                         rs->sr_text = NULL;
519                         rs->sr_matched = NULL;
520                         if ( rs->sr_ref ) {
521                                 ber_bvarray_free( rs->sr_ref );
522                                 rs->sr_ref = NULL;
523                         }
524                 }
525         }
526 #endif /* SLAP_ACL_HONOR_DISCLOSE */
527
528         send_ldap_result( op, rs );
529
530         /*
531          * Commit only if all operations succeed
532          */
533         if ( sth != SQL_NULL_HSTMT ) {
534                 SQLUSMALLINT    CompletionType = SQL_ROLLBACK;
535         
536                 if ( rs->sr_err == LDAP_SUCCESS && !op->o_noop ) {
537                         CompletionType = SQL_COMMIT;
538                 }
539
540                 SQLTransact( SQL_NULL_HENV, dbh, CompletionType );
541         }
542
543         if ( !BER_BVISNULL( &realnew_dn ) && realnew_dn.bv_val != new_dn.bv_val ) {
544                 ch_free( realnew_dn.bv_val );
545         }
546
547         if ( !BER_BVISNULL( &new_dn ) ) {
548                 slap_sl_free( new_dn.bv_val, op->o_tmpmemctx );
549         }
550         
551         if ( !BER_BVISNULL( &new_ndn ) ) {
552                 slap_sl_free( new_ndn.bv_val, op->o_tmpmemctx );
553         }
554         
555         /* LDAP v2 supporting correct attribute handling. */
556         if ( new_rdn != NULL ) {
557                 ldap_rdnfree( new_rdn );
558         }
559         if ( old_rdn != NULL ) {
560                 ldap_rdnfree( old_rdn );
561         }
562         if ( mod != NULL ) {
563                 Modifications *tmp;
564                 for (; mod; mod = tmp ) {
565                         tmp = mod->sml_next;
566                         free( mod );
567                 }
568         }
569
570         if ( !BER_BVISNULL( &e_id.eid_ndn ) ) {
571                 (void)backsql_free_entryID( op, &e_id, 0 );
572         }
573
574         if ( !BER_BVISNULL( &n_id.eid_ndn ) ) {
575                 (void)backsql_free_entryID( op, &n_id, 0 );
576         }
577
578         if ( !BER_BVISNULL( &r.e_nname ) ) {
579                 entry_clean( &r );
580         }
581
582         if ( !BER_BVISNULL( &p.e_nname ) ) {
583                 entry_clean( &p );
584         }
585
586         if ( !BER_BVISNULL( &n.e_nname ) ) {
587                 entry_clean( &n );
588         }
589
590         Debug( LDAP_DEBUG_TRACE, "<==backsql_modrdn()\n", 0, 0, 0 );
591
592         return rs->sr_err;
593 }
594