X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fback-sql%2Fapi.c;h=d5730d826b7f68b99baef3a2ed5d589d0bf48e91;hb=2d88c1b826797b30500c7d0b3d4e8219277dfacc;hp=715e22b63b53c93de438473de6755dea960e6a62;hpb=761f2879435deec0dc8369de98381557de416b89;p=openldap diff --git a/servers/slapd/back-sql/api.c b/servers/slapd/back-sql/api.c index 715e22b63b..d5730d826b 100644 --- a/servers/slapd/back-sql/api.c +++ b/servers/slapd/back-sql/api.c @@ -19,8 +19,6 @@ #include "portable.h" -#ifdef SLAPD_SQL - #include #include #include "ac/string.h" @@ -31,11 +29,11 @@ static backsql_api *backsqlapi; int -backsql_api_config( backsql_info *si, const char *name ) +backsql_api_config( backsql_info *bi, const char *name ) { backsql_api *ba; - assert( si ); + assert( bi ); assert( name ); for ( ba = backsqlapi; ba; ba = ba->ba_next ) { @@ -44,8 +42,8 @@ backsql_api_config( backsql_info *si, const char *name ) ba2 = ch_malloc( sizeof( backsql_api ) ); *ba2 = *ba; - ba2->ba_next = si->si_api; - si->si_api = ba2; + ba2->ba_next = bi->sql_api; + bi->sql_api = ba2; return 0; } } @@ -68,7 +66,7 @@ backsql_api_register( backsql_api *ba ) for ( ba2 = backsqlapi; ba2; ba2 = ba2->ba_next ) { if ( strcasecmp( ba->ba_name, ba2->ba_name ) == 0 ) { fprintf( stderr, "API module \"%s\" already defined\n", ba->ba_name ); - exit(EXIT_FAILURE); + exit( EXIT_FAILURE ); } } @@ -81,12 +79,12 @@ backsql_api_register( backsql_api *ba ) int backsql_api_dn2odbc( Operation *op, SlapReply *rs, struct berval *dn ) { - backsql_info *si = (backsql_info *)op->o_bd->be_private; + backsql_info *bi = (backsql_info *)op->o_bd->be_private; backsql_api *ba; int rc; struct berval bv; - ba = si->si_api; + ba = bi->sql_api; if ( ba == NULL ) { return 0; @@ -96,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; @@ -112,12 +126,12 @@ backsql_api_dn2odbc( Operation *op, SlapReply *rs, struct berval *dn ) int backsql_api_odbc2dn( Operation *op, SlapReply *rs, struct berval *dn ) { - backsql_info *si = (backsql_info *)op->o_bd->be_private; + backsql_info *bi = (backsql_info *)op->o_bd->be_private; backsql_api *ba; int rc; struct berval bv; - ba = si->si_api; + ba = bi->sql_api; if ( ba == NULL ) { return 0; @@ -128,17 +142,30 @@ 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; } -#endif /* SLAPD_SQL */ -