X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fback-sql%2Fapi.c;h=d5730d826b7f68b99baef3a2ed5d589d0bf48e91;hb=2d88c1b826797b30500c7d0b3d4e8219277dfacc;hp=1a1c32ab9368de151b744e13f24807e70771e550;hpb=396743f62f451f1d55df9d91ebbdaf21f075ec2c;p=openldap diff --git a/servers/slapd/back-sql/api.c b/servers/slapd/back-sql/api.c index 1a1c32ab93..d5730d826b 100644 --- a/servers/slapd/back-sql/api.c +++ b/servers/slapd/back-sql/api.c @@ -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;