]> git.sur5r.net Git - openldap/blob - servers/slapd/back-sql/modrdn.c
fix ITS#3406 wrt/ dnattr; silence warning
[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 ( manageDSAit && !BER_BVISNULL( &bsi.bsi_e->e_nname ) &&
87                                 dn_match( &op->o_req_ndn, &bsi.bsi_e->e_nname ) )
88                 {
89                         rs->sr_err = LDAP_SUCCESS;
90                         rs->sr_text = NULL;
91                         rs->sr_matched = NULL;
92                         if ( rs->sr_ref ) {
93                                 ber_bvarray_free( rs->sr_ref );
94                                 rs->sr_ref = NULL;
95                         }
96                         break;
97                 }
98                 e = &r;
99                 /* fallthru */
100
101         default:
102                 Debug( LDAP_DEBUG_TRACE, "backsql_modrdn(): "
103                         "could not retrieve modrdnDN ID - no such entry\n", 
104                         0, 0, 0 );
105                 if ( !BER_BVISNULL( &r.e_nname ) ) {
106                         /* FIXME: should always be true! */
107                         e = &r;
108
109                 } else {
110                         e = NULL;
111                 }
112                 goto done;
113         }
114
115 #ifdef BACKSQL_ARBITRARY_KEY
116         Debug( LDAP_DEBUG_TRACE, "   backsql_modrdn(): entry id=%s\n",
117                 e_id.eid_id.bv_val, 0, 0 );
118 #else /* ! BACKSQL_ARBITRARY_KEY */
119         Debug( LDAP_DEBUG_TRACE, "   backsql_modrdn(): entry id=%ld\n",
120                 e_id.eid_id, 0, 0 );
121 #endif /* ! BACKSQL_ARBITRARY_KEY */
122
123         if ( get_assert( op ) &&
124                         ( test_filter( op, &r, get_assertion( op ) )
125                           != LDAP_COMPARE_TRUE ) )
126         {
127                 rs->sr_err = LDAP_ASSERTION_FAILED;
128                 e = &r;
129                 goto done;
130         }
131
132         if ( backsql_has_children( bi, dbh, &op->o_req_ndn ) == LDAP_COMPARE_TRUE ) {
133                 Debug( LDAP_DEBUG_TRACE, "   backsql_modrdn(): "
134                         "entry \"%s\" has children\n",
135                         op->o_req_dn.bv_val, 0, 0 );
136                 rs->sr_err = LDAP_NOT_ALLOWED_ON_NONLEAF;
137                 rs->sr_text = "subtree rename not supported";
138                 e = &r;
139                 goto done;
140         }
141
142         /*
143          * Check for entry access to target
144          */
145         if ( !access_allowed( op, &r, slap_schema.si_ad_entry, 
146                                 NULL, ACL_WRITE, NULL ) ) {
147                 Debug( LDAP_DEBUG_TRACE, "   no access to entry\n", 0, 0, 0 );
148                 rs->sr_err = LDAP_INSUFFICIENT_ACCESS;
149                 goto done;
150         }
151
152         dnParent( &op->o_req_dn, &pdn );
153         dnParent( &op->o_req_ndn, &pndn );
154
155         /*
156          * namingContext "" is not supported
157          */
158         if ( BER_BVISEMPTY( &pdn ) ) {
159                 Debug( LDAP_DEBUG_TRACE, "   backsql_modrdn(): "
160                         "parent is \"\" - aborting\n", 0, 0, 0 );
161                 rs->sr_err = LDAP_UNWILLING_TO_PERFORM;
162                 rs->sr_text = "not allowed within namingContext";
163                 e = NULL;
164                 goto done;
165         }
166
167         /*
168          * Check for children access to parent
169          */
170         bsi.bsi_e = &p;
171         e_id = bsi.bsi_base_id;
172         rs->sr_err = backsql_init_search( &bsi, &pndn,
173                         LDAP_SCOPE_BASE, 
174                         SLAP_NO_LIMIT, SLAP_NO_LIMIT,
175                         (time_t)(-1), NULL, dbh, op, rs,
176                         slap_anlist_all_attributes,
177                         BACKSQL_ISF_GET_ENTRY );
178
179 #ifdef BACKSQL_ARBITRARY_KEY
180         Debug( LDAP_DEBUG_TRACE, "   backsql_modrdn(): "
181                 "old parent entry id is %s\n",
182                 bsi.bsi_base_id.eid_id.bv_val, 0, 0 );
183 #else /* ! BACKSQL_ARBITRARY_KEY */
184         Debug( LDAP_DEBUG_TRACE, "   backsql_modrdn(): "
185                 "old parent entry id is %ld\n",
186                 bsi.bsi_base_id.eid_id, 0, 0 );
187 #endif /* ! BACKSQL_ARBITRARY_KEY */
188
189         if ( rs->sr_err != LDAP_SUCCESS ) {
190                 Debug( LDAP_DEBUG_TRACE, "backsql_modrdn(): "
191                         "could not retrieve renameDN ID - no such entry\n", 
192                         0, 0, 0 );
193                 e = &p;
194                 goto done;
195         }
196
197         if ( !access_allowed( op, &p, slap_schema.si_ad_children, 
198                                 NULL, ACL_WRITE, NULL ) ) {
199                 Debug( LDAP_DEBUG_TRACE, "   no access to parent\n", 0, 0, 0 );
200                 rs->sr_err = LDAP_INSUFFICIENT_ACCESS;
201                 goto done;
202         }
203
204         if ( newSuperior ) {
205                 (void)backsql_free_entryID( op, &bsi.bsi_base_id, 0 );
206                 
207                 /*
208                  * namingContext "" is not supported
209                  */
210                 if ( BER_BVISEMPTY( newSuperior ) ) {
211                         Debug( LDAP_DEBUG_TRACE, "   backsql_modrdn(): "
212                                 "newSuperior is \"\" - aborting\n", 0, 0, 0 );
213                         rs->sr_err = LDAP_UNWILLING_TO_PERFORM;
214                         rs->sr_text = "not allowed within namingContext";
215                         e = NULL;
216                         goto done;
217                 }
218
219                 new_pdn = newSuperior;
220                 new_npdn = op->oq_modrdn.rs_nnewSup;
221
222                 /*
223                  * Check for children access to new parent
224                  */
225                 bsi.bsi_e = &n;
226                 rs->sr_err = backsql_init_search( &bsi, new_npdn,
227                                 LDAP_SCOPE_BASE, 
228                                 SLAP_NO_LIMIT, SLAP_NO_LIMIT,
229                                 (time_t)(-1), NULL, dbh, op, rs,
230                                 slap_anlist_all_attributes,
231                                 ( BACKSQL_ISF_MATCHED | BACKSQL_ISF_GET_ENTRY ) );
232                 if ( rs->sr_err != LDAP_SUCCESS ) {
233                         Debug( LDAP_DEBUG_TRACE, "backsql_modrdn(): "
234                                 "could not retrieve renameDN ID - no such entry\n", 
235                                 0, 0, 0 );
236                         e = &n;
237                         goto done;
238                 }
239
240                 n_id = bsi.bsi_base_id;
241
242 #ifdef BACKSQL_ARBITRARY_KEY
243                 Debug( LDAP_DEBUG_TRACE, "   backsql_modrdn(): "
244                         "new parent entry id=%s\n",
245                         n_id.eid_id.bv_val, 0, 0 );
246 #else /* ! BACKSQL_ARBITRARY_KEY */
247                 Debug( LDAP_DEBUG_TRACE, "   backsql_modrdn(): "
248                         "new parent entry id=%ld\n",
249                         n_id.eid_id, 0, 0 );
250 #endif /* ! BACKSQL_ARBITRARY_KEY */
251
252                 if ( !access_allowed( op, &n, slap_schema.si_ad_children, 
253                                         NULL, ACL_WRITE, NULL ) ) {
254                         Debug( LDAP_DEBUG_TRACE, "   backsql_modrdn(): "
255                                         "no access to new parent \"%s\"\n", 
256                                         new_pdn->bv_val, 0, 0 );
257                         rs->sr_err = LDAP_INSUFFICIENT_ACCESS;
258                         e = &n;
259                         goto done;
260                 }
261
262         } else {
263                 n_id = bsi.bsi_base_id;
264                 new_pdn = &pdn;
265                 new_npdn = &pndn;
266         }
267
268         if ( newSuperior && dn_match( &pndn, new_npdn ) ) {
269                 Debug( LDAP_DEBUG_TRACE, "   backsql_modrdn(): "
270                         "newSuperior is equal to old parent - ignored\n",
271                         0, 0, 0 );
272                 newSuperior = NULL;
273         }
274
275         if ( newSuperior && dn_match( &op->o_req_ndn, new_npdn ) ) {
276                 Debug( LDAP_DEBUG_TRACE, "   backsql_modrdn(): "
277                         "newSuperior is equal to entry being moved "
278                         "- aborting\n", 0, 0, 0 );
279                 rs->sr_err = LDAP_OTHER;
280                 rs->sr_text = "newSuperior is equal to old DN";
281                 e = &r;
282                 goto done;
283         }
284
285         build_new_dn( &new_dn, new_pdn, &op->oq_modrdn.rs_newrdn,
286                         op->o_tmpmemctx );
287         build_new_dn( &new_ndn, new_npdn, &op->oq_modrdn.rs_nnewrdn,
288                         op->o_tmpmemctx );
289         
290         Debug( LDAP_DEBUG_TRACE, "   backsql_modrdn(): new entry dn is \"%s\"\n",
291                         new_dn.bv_val, 0, 0 );
292
293         realnew_dn = new_dn;
294         if ( backsql_api_dn2odbc( op, rs, &realnew_dn ) ) {
295                 Debug( LDAP_DEBUG_TRACE, "   backsql_modrdn(\"%s\"): "
296                         "backsql_api_dn2odbc(\"%s\") failed\n", 
297                         op->o_req_dn.bv_val, realnew_dn.bv_val, 0 );
298                 SQLFreeStmt( sth, SQL_DROP );
299
300                 rs->sr_text = "SQL-backend error";
301                 rs->sr_err = LDAP_OTHER;
302                 e = NULL;
303                 goto done;
304         }
305
306         Debug( LDAP_DEBUG_TRACE, "   backsql_modrdn(): "
307                 "executing renentry_stmt\n", 0, 0, 0 );
308
309         rc = backsql_Prepare( dbh, &sth, bi->sql_renentry_stmt, 0 );
310         if ( rc != SQL_SUCCESS ) {
311                 Debug( LDAP_DEBUG_TRACE,
312                         "   backsql_modrdn(): "
313                         "error preparing renentry_stmt\n", 0, 0, 0 );
314                 backsql_PrintErrors( bi->sql_db_env, dbh, 
315                                 sth, rc );
316
317                 rs->sr_text = "SQL-backend error";
318                 rs->sr_err = LDAP_OTHER;
319                 e = NULL;
320                 goto done;
321         }
322
323         rc = backsql_BindParamBerVal( sth, 1, SQL_PARAM_INPUT, &realnew_dn );
324         if ( rc != SQL_SUCCESS ) {
325                 Debug( LDAP_DEBUG_TRACE,
326                         "   backsql_add_attr(): "
327                         "error binding DN parameter for objectClass %s\n",
328                         oc->bom_oc->soc_cname.bv_val, 0, 0 );
329                 backsql_PrintErrors( bi->sql_db_env, dbh, 
330                         sth, rc );
331                 SQLFreeStmt( sth, SQL_DROP );
332
333                 rs->sr_text = "SQL-backend error";
334                 rs->sr_err = LDAP_OTHER;
335                 e = NULL;
336                 goto done;
337         }
338
339         rc = backsql_BindParamID( sth, 2, SQL_PARAM_INPUT, &n_id.eid_id );
340         if ( rc != SQL_SUCCESS ) {
341                 Debug( LDAP_DEBUG_TRACE,
342                         "   backsql_add_attr(): "
343                         "error binding parent ID parameter for objectClass %s\n",
344                         oc->bom_oc->soc_cname.bv_val, 0, 0 );
345                 backsql_PrintErrors( bi->sql_db_env, dbh, 
346                         sth, rc );
347                 SQLFreeStmt( sth, SQL_DROP );
348
349                 rs->sr_text = "SQL-backend error";
350                 rs->sr_err = LDAP_OTHER;
351                 e = NULL;
352                 goto done;
353         }
354
355         rc = backsql_BindParamID( sth, 3, SQL_PARAM_INPUT, &e_id.eid_keyval );
356         if ( rc != SQL_SUCCESS ) {
357                 Debug( LDAP_DEBUG_TRACE,
358                         "   backsql_add_attr(): "
359                         "error binding entry ID parameter for objectClass %s\n",
360                         oc->bom_oc->soc_cname.bv_val, 0, 0 );
361                 backsql_PrintErrors( bi->sql_db_env, dbh, 
362                         sth, rc );
363                 SQLFreeStmt( sth, SQL_DROP );
364
365                 rs->sr_text = "SQL-backend error";
366                 rs->sr_err = LDAP_OTHER;
367                 e = NULL;
368                 goto done;
369         }
370
371         rc = backsql_BindParamID( sth, 4, SQL_PARAM_INPUT, &e_id.eid_id );
372         if ( rc != SQL_SUCCESS ) {
373                 Debug( LDAP_DEBUG_TRACE,
374                         "   backsql_add_attr(): "
375                         "error binding ID parameter for objectClass %s\n",
376                         oc->bom_oc->soc_cname.bv_val, 0, 0 );
377                 backsql_PrintErrors( bi->sql_db_env, dbh, 
378                         sth, rc );
379                 SQLFreeStmt( sth, SQL_DROP );
380
381                 rs->sr_text = "SQL-backend error";
382                 rs->sr_err = LDAP_OTHER;
383                 e = NULL;
384                 goto done;
385         }
386
387         rc = SQLExecute( sth );
388         if ( rc != SQL_SUCCESS ) {
389                 Debug( LDAP_DEBUG_TRACE, "   backsql_modrdn(): "
390                         "could not rename ldap_entries record\n", 0, 0, 0 );
391                 backsql_PrintErrors( bi->sql_db_env, dbh, sth, rc );
392                 SQLFreeStmt( sth, SQL_DROP );
393                 rs->sr_err = LDAP_OTHER;
394                 rs->sr_text = "SQL-backend error";
395                 e = NULL;
396                 goto done;
397         }
398         SQLFreeStmt( sth, SQL_DROP );
399
400         /*
401          * Get attribute type and attribute value of our new rdn,
402          * we will need to add that to our new entry
403          */
404         if ( ldap_bv2rdn( &op->oq_modrdn.rs_newrdn, &new_rdn, &next, 
405                                 LDAP_DN_FORMAT_LDAP ) )
406         {
407                 Debug( LDAP_DEBUG_TRACE,
408                         "   backsql_modrdn: can't figure out "
409                         "type(s)/values(s) of new_rdn\n", 
410                         0, 0, 0 );
411                 rs->sr_err = LDAP_INVALID_DN_SYNTAX;
412                 e = &r;
413                 goto done;
414         }
415
416         Debug( LDAP_DEBUG_TRACE, "backsql_modrdn: "
417                 "new_rdn_type=\"%s\", new_rdn_val=\"%s\"\n",
418                 new_rdn[ 0 ]->la_attr.bv_val,
419                 new_rdn[ 0 ]->la_value.bv_val, 0 );
420
421         if ( op->oq_modrdn.rs_deleteoldrdn ) {
422                 if ( ldap_bv2rdn( &op->o_req_dn, &old_rdn, &next,
423                                         LDAP_DN_FORMAT_LDAP ) )
424                 {
425                         Debug( LDAP_DEBUG_TRACE,
426                                 "   backsql_modrdn: can't figure out "
427                                 "the old_rdn type(s)/value(s)\n", 
428                                 0, 0, 0 );
429                         rs->sr_err = LDAP_OTHER;
430                         e = NULL;
431                         goto done;
432                 }
433         }
434
435         rs->sr_err = slap_modrdn2mods( op, rs, &r, old_rdn, new_rdn, &mod );
436         if ( rs->sr_err != LDAP_SUCCESS ) {
437                 e = &r;
438                 goto done;
439         }
440
441         oc = backsql_id2oc( bi, e_id.eid_oc_id );
442         rs->sr_err = backsql_modify_internal( op, rs, dbh, oc, &e_id, mod );
443         if ( rs->sr_err != LDAP_SUCCESS ) {
444                 e = &r;
445                 goto done;
446         }
447
448         if ( global_schemacheck ) {
449                 char            textbuf[ SLAP_TEXT_BUFLEN ] = { '\0' };
450
451                 entry_clean( &r );
452                 (void)backsql_free_entryID( op, &e_id, 0 );
453
454                 bsi.bsi_e = &r;
455                 rs->sr_err = backsql_init_search( &bsi, &new_ndn,
456                                 LDAP_SCOPE_BASE, 
457                                 SLAP_NO_LIMIT, SLAP_NO_LIMIT,
458                                 (time_t)(-1), NULL, dbh, op, rs,
459                                 slap_anlist_all_attributes,
460                                 ( BACKSQL_ISF_MATCHED | BACKSQL_ISF_GET_ENTRY ) );
461                 switch ( rs->sr_err ) {
462                 case LDAP_SUCCESS:
463                         break;
464
465                 case LDAP_REFERRAL:
466                         if ( manageDSAit && !BER_BVISNULL( &bsi.bsi_e->e_nname ) &&
467                                         dn_match( &new_ndn, &bsi.bsi_e->e_nname ) )
468                         {
469                                 rs->sr_err = LDAP_SUCCESS;
470                                 rs->sr_text = NULL;
471                                 rs->sr_matched = NULL;
472                                 if ( rs->sr_ref ) {
473                                         ber_bvarray_free( rs->sr_ref );
474                                         rs->sr_ref = NULL;
475                                 }
476                                 break;
477                         }
478                         e = &r;
479                         /* fallthru */
480
481                 default:
482                         Debug( LDAP_DEBUG_TRACE, "backsql_modrdn(): "
483                                 "could not retrieve modrdnDN ID - no such entry\n", 
484                                 0, 0, 0 );
485                         if ( !BER_BVISNULL( &r.e_nname ) ) {
486                                 /* FIXME: should always be true! */
487                                 e = &r;
488
489                         } else {
490                                 e = NULL;
491                         }
492                         goto done;
493                 }
494
495                 e_id = bsi.bsi_base_id;
496
497                 rs->sr_err = entry_schema_check( op->o_bd, &r,
498                                 NULL,
499                                 &rs->sr_text, textbuf, sizeof( textbuf ) );
500                 if ( rs->sr_err != LDAP_SUCCESS ) {
501                         Debug( LDAP_DEBUG_TRACE, "   backsql_add(\"%s\"): "
502                                 "entry failed schema check -- aborting\n",
503                                 r.e_name.bv_val, 0, 0 );
504                         e = NULL;
505                         goto done;
506                 }
507         }
508
509 done:;
510 #ifdef SLAP_ACL_HONOR_DISCLOSE
511         if ( e != NULL ) {
512                 if ( !access_allowed( op, e, slap_schema.si_ad_entry, NULL,
513                                         ACL_DISCLOSE, NULL ) )
514                 {
515                         rs->sr_err = LDAP_NO_SUCH_OBJECT;
516                         rs->sr_text = NULL;
517                         rs->sr_matched = NULL;
518                         if ( rs->sr_ref ) {
519                                 ber_bvarray_free( rs->sr_ref );
520                                 rs->sr_ref = NULL;
521                         }
522                 }
523         }
524 #endif /* SLAP_ACL_HONOR_DISCLOSE */
525
526         send_ldap_result( op, rs );
527
528         /*
529          * Commit only if all operations succeed
530          */
531         if ( sth != SQL_NULL_HSTMT ) {
532                 SQLUSMALLINT    CompletionType = SQL_ROLLBACK;
533         
534                 if ( rs->sr_err == LDAP_SUCCESS && !op->o_noop ) {
535                         CompletionType = SQL_COMMIT;
536                 }
537
538                 SQLTransact( SQL_NULL_HENV, dbh, CompletionType );
539         }
540
541         if ( !BER_BVISNULL( &realnew_dn ) && realnew_dn.bv_val != new_dn.bv_val ) {
542                 ch_free( realnew_dn.bv_val );
543         }
544
545         if ( !BER_BVISNULL( &new_dn ) ) {
546                 slap_sl_free( new_dn.bv_val, op->o_tmpmemctx );
547         }
548         
549         if ( !BER_BVISNULL( &new_ndn ) ) {
550                 slap_sl_free( new_ndn.bv_val, op->o_tmpmemctx );
551         }
552         
553         /* LDAP v2 supporting correct attribute handling. */
554         if ( new_rdn != NULL ) {
555                 ldap_rdnfree( new_rdn );
556         }
557         if ( old_rdn != NULL ) {
558                 ldap_rdnfree( old_rdn );
559         }
560         if ( mod != NULL ) {
561                 Modifications *tmp;
562                 for (; mod; mod = tmp ) {
563                         tmp = mod->sml_next;
564                         free( mod );
565                 }
566         }
567
568         if ( !BER_BVISNULL( &e_id.eid_ndn ) ) {
569                 (void)backsql_free_entryID( op, &e_id, 0 );
570         }
571
572         if ( !BER_BVISNULL( &n_id.eid_ndn ) ) {
573                 (void)backsql_free_entryID( op, &n_id, 0 );
574         }
575
576         if ( !BER_BVISNULL( &r.e_nname ) ) {
577                 entry_clean( &r );
578         }
579
580         if ( !BER_BVISNULL( &p.e_nname ) ) {
581                 entry_clean( &p );
582         }
583
584         if ( !BER_BVISNULL( &n.e_nname ) ) {
585                 entry_clean( &n );
586         }
587
588         Debug( LDAP_DEBUG_TRACE, "<==backsql_modrdn()\n", 0, 0, 0 );
589
590         return rs->sr_err;
591 }
592