X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fextended.c;h=b919201e1cfb01bcd74cb019cfc9079dd71915a3;hb=caf751fbb20fbccf535b900df1dabef0f40e0222;hp=9d6aeb95052cf951bffe567c0569ca423255e180;hpb=45cda82eb1aed0aee6af81cd00dc46136d6199a4;p=openldap diff --git a/servers/slapd/extended.c b/servers/slapd/extended.c index 9d6aeb9505..b919201e1c 100644 --- a/servers/slapd/extended.c +++ b/servers/slapd/extended.c @@ -1,7 +1,7 @@ /* $OpenLDAP$ */ /* This work is part of OpenLDAP Software . * - * Copyright 1999-2006 The OpenLDAP Foundation. + * Copyright 1999-2012 The OpenLDAP Foundation. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -39,9 +39,6 @@ #include "slap.h" #include "lber_pvt.h" -#define UNSUPPORTED_EXOP "unsupported extended operation" - - static struct extop_list { struct extop_list *next; struct berval oid; @@ -56,17 +53,16 @@ static SLAP_EXTOP_MAIN_FN whoami_extop; * just a way to get built-in extops onto the extop list without * having a separate init routine for each built-in extop. */ -const struct berval slap_EXOP_CANCEL = BER_BVC(LDAP_EXOP_X_CANCEL); -const struct berval slap_EXOP_WHOAMI = BER_BVC(LDAP_EXOP_X_WHO_AM_I); -const struct berval slap_EXOP_MODIFY_PASSWD = BER_BVC(LDAP_EXOP_MODIFY_PASSWD); -const struct berval slap_EXOP_START_TLS = BER_BVC(LDAP_EXOP_START_TLS); - static struct { const struct berval *oid; slap_mask_t flags; SLAP_EXTOP_MAIN_FN *ext_main; } builtin_extops[] = { - { &slap_EXOP_CANCEL, SLAP_EXOP_HIDE, cancel_extop }, +#ifdef LDAP_X_TXN + { &slap_EXOP_TXN_START, 0, txn_start_extop }, + { &slap_EXOP_TXN_END, 0, txn_end_extop }, +#endif + { &slap_EXOP_CANCEL, 0, cancel_extop }, { &slap_EXOP_WHOAMI, 0, whoami_extop }, { &slap_EXOP_MODIFY_PASSWD, SLAP_EXOP_WRITES, passwd_extop }, { NULL, 0, NULL } @@ -124,32 +120,31 @@ do_extended( ) { struct berval reqdata = {0, NULL}; - ber_tag_t tag; ber_len_t len; - Debug( LDAP_DEBUG_TRACE, "do_extended\n", 0, 0, 0 ); + Debug( LDAP_DEBUG_TRACE, "%s do_extended\n", + op->o_log_prefix, 0, 0 ); if( op->o_protocol < LDAP_VERSION3 ) { - Debug( LDAP_DEBUG_ANY, - "do_extended: protocol version (%d) too low\n", - op->o_protocol, 0 ,0 ); + Debug( LDAP_DEBUG_ANY, "%s do_extended: protocol version (%d) too low\n", + op->o_log_prefix, op->o_protocol, 0 ); send_ldap_discon( op, rs, LDAP_PROTOCOL_ERROR, "requires LDAPv3" ); rs->sr_err = SLAPD_DISCONNECT; goto done; } if ( ber_scanf( op->o_ber, "{m" /*}*/, &op->ore_reqoid ) == LBER_ERROR ) { - Debug( LDAP_DEBUG_ANY, "do_extended: ber_scanf failed\n", 0, 0 ,0 ); + Debug( LDAP_DEBUG_ANY, "%s do_extended: ber_scanf failed\n", + op->o_log_prefix, 0, 0 ); send_ldap_discon( op, rs, LDAP_PROTOCOL_ERROR, "decoding error" ); rs->sr_err = SLAPD_DISCONNECT; goto done; } - tag = ber_peek_tag( op->o_ber, &len ); - if( ber_peek_tag( op->o_ber, &len ) == LDAP_TAG_EXOP_REQ_VALUE ) { if( ber_scanf( op->o_ber, "m", &reqdata ) == LBER_ERROR ) { - Debug( LDAP_DEBUG_ANY, "do_extended: ber_scanf failed\n", 0, 0 ,0 ); + Debug( LDAP_DEBUG_ANY, "%s do_extended: ber_scanf failed\n", + op->o_log_prefix, 0, 0 ); send_ldap_discon( op, rs, LDAP_PROTOCOL_ERROR, "decoding error" ); rs->sr_err = SLAPD_DISCONNECT; goto done; @@ -157,14 +152,16 @@ do_extended( } if( get_ctrls( op, rs, 1 ) != LDAP_SUCCESS ) { - Debug( LDAP_DEBUG_ANY, "do_extended: get_ctrls failed\n", 0, 0 ,0 ); + Debug( LDAP_DEBUG_ANY, "%s do_extended: get_ctrls failed\n", + op->o_log_prefix, 0, 0 ); return rs->sr_err; } + Statslog( LDAP_DEBUG_STATS, "%s EXT oid=%s\n", + op->o_log_prefix, op->ore_reqoid.bv_val, 0, 0, 0 ); + /* check for controls inappropriate for all extended operations */ if( get_manageDSAit( op ) == SLAP_CONTROL_CRITICAL ) { - Statslog( LDAP_DEBUG_STATS, "%s EXT oid=%s\n", - op->o_log_prefix, op->ore_reqoid.bv_val, 0, 0, 0 ); send_ldap_error( op, rs, LDAP_UNAVAILABLE_CRITICAL_EXTENSION, "manageDSAit control inappropriate" ); @@ -179,6 +176,18 @@ do_extended( op->o_bd = frontendDB; rs->sr_err = frontendDB->be_extended( op, rs ); + /* clean up in case some overlay set them? */ + if ( !BER_BVISNULL( &op->o_req_ndn ) ) { + if ( !BER_BVISNULL( &op->o_req_dn ) + && op->o_req_ndn.bv_val != op->o_req_dn.bv_val ) + { + op->o_tmpfree( op->o_req_dn.bv_val, op->o_tmpmemctx ); + } + op->o_tmpfree( op->o_req_ndn.bv_val, op->o_tmpmemctx ); + BER_BVZERO( &op->o_req_dn ); + BER_BVZERO( &op->o_req_ndn ); + } + done: return rs->sr_err; } @@ -195,10 +204,8 @@ fe_extended( Operation *op, SlapReply *rs ) ext = find_extop(supp_ext_list, &op->ore_reqoid ); if ( ext == NULL ) { - Statslog( LDAP_DEBUG_STATS, "%s EXT oid=%s\n", - op->o_log_prefix, op->ore_reqoid.bv_val, 0, 0, 0 ); - Debug( LDAP_DEBUG_ANY, "do_extended: unsupported operation \"%s\"\n", - op->ore_reqoid.bv_val, 0 ,0 ); + Debug( LDAP_DEBUG_ANY, "%s do_extended: unsupported operation \"%s\"\n", + op->o_log_prefix, op->ore_reqoid.bv_val, 0 ); send_ldap_error( op, rs, LDAP_PROTOCOL_ERROR, "unsupported extended operation" ); goto done; @@ -237,10 +244,12 @@ fe_extended( Operation *op, SlapReply *rs ) if ( rs->sr_rspoid != NULL ) { free( (char *)rs->sr_rspoid ); + rs->sr_rspoid = NULL; } if ( rs->sr_rspdata != NULL ) { ber_bvfree( rs->sr_rspdata ); + rs->sr_rspdata = NULL; } } /* end of OpenLDAP extended operation */ @@ -263,13 +272,17 @@ load_extop2( return -1; } - if ( ext_oid == NULL || BER_BVISNULL( ext_oid ) || BER_BVISEMPTY( ext_oid ) ) { + if ( ext_oid == NULL || BER_BVISNULL( ext_oid ) || + BER_BVISEMPTY( ext_oid ) ) + { return -1; } - if ( numericoidValidate( NULL, (struct berval *)ext_oid ) != LDAP_SUCCESS ) { + if ( numericoidValidate( NULL, (struct berval *)ext_oid ) != + LDAP_SUCCESS ) + { oidm.bv_val = oidm_find( ext_oid->bv_val ); - if ( ext_oid == NULL ) { + if ( oidm.bv_val == NULL ) { return -1; } oidm.bv_len = strlen( oidm.bv_val ); @@ -349,6 +362,8 @@ find_extop( struct extop_list *list, struct berval *oid ) } +const struct berval slap_EXOP_WHOAMI = BER_BVC(LDAP_EXOP_WHO_AM_I); + static int whoami_extop ( Operation *op, @@ -367,7 +382,8 @@ whoami_extop ( op->o_bd = op->o_conn->c_authz_backend; if( backend_check_restrictions( op, rs, - (struct berval *)&slap_EXOP_WHOAMI ) != LDAP_SUCCESS ) { + (struct berval *)&slap_EXOP_WHOAMI ) != LDAP_SUCCESS ) + { return rs->sr_err; }