]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-sql/api.c
comment about helper requirements
[openldap] / servers / slapd / back-sql / api.c
index 1a1c32ab9368de151b744e13f24807e70771e550..d5730d826b7f68b99baef3a2ed5d589d0bf48e91 100644 (file)
@@ -94,14 +94,30 @@ backsql_api_dn2odbc( Operation *op, SlapReply *rs, struct berval *dn )
 
        for ( ; ba; ba = ba->ba_next ) {
                if ( ba->ba_dn2odbc ) {
+                       /*
+                        * The dn2odbc() helper is supposed to rewrite
+                        * the contents of bv, freeing the original value
+                        * with ch_free() if required and replacing it 
+                        * with a newly allocated one using ch_malloc() 
+                        * or companion functions.
+                        *
+                        * NOTE: it is supposed to __always__ free
+                        * the value of bv in case of error, and reset
+                        * it with BER_BVZERO() .
+                        */
                        rc = ( *ba->ba_dn2odbc )( op, rs, &bv );
 
                        if ( rc ) {
+                               /* in case of error, dn2odbc() must cleanup */
+                               assert( BER_BVISNULL( &bv ) );
+
                                return rc;
                        }
                }
        }
 
+       assert( !BER_BVISNULL( &bv ) );
+
        *dn = bv;
 
        return 0;
@@ -126,13 +142,28 @@ backsql_api_odbc2dn( Operation *op, SlapReply *rs, struct berval *dn )
        for ( ; ba; ba = ba->ba_next ) {
                if ( ba->ba_dn2odbc ) {
                        rc = ( *ba->ba_odbc2dn )( op, rs, &bv );
-
+                       /*
+                        * The odbc2dn() helper is supposed to rewrite
+                        * the contents of bv, freeing the original value
+                        * with ch_free() if required and replacing it 
+                        * with a newly allocated one using ch_malloc() 
+                        * or companion functions.
+                        *
+                        * NOTE: it is supposed to __always__ free
+                        * the value of bv in case of error, and reset
+                        * it with BER_BVZERO() .
+                        */
                        if ( rc ) {
+                               /* in case of error, odbc2dn() must cleanup */
+                               assert( BER_BVISNULL( &bv ) );
+
                                return rc;
                        }
                }
        }
 
+       assert( !BER_BVISNULL( &bv ) );
+
        *dn = bv;
 
        return 0;