From 60e1237c4e9077bd89b1400b6a3a24b905c8aad8 Mon Sep 17 00:00:00 2001 From: Kurt Zeilenga Date: Fri, 20 Oct 2006 06:46:38 +0000 Subject: [PATCH] Parse txn failed msgid --- libraries/libldap/txn.c | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/libraries/libldap/txn.c b/libraries/libldap/txn.c index 23856db4b6..3c22f91828 100644 --- a/libraries/libldap/txn.c +++ b/libraries/libldap/txn.c @@ -102,6 +102,9 @@ ldap_txn_end_s( int rc; BerElement *txnber = NULL; struct berval *txnval = NULL; + struct berval *retdata = NULL; + + if ( retidp != NULL ) *retidp = -1; txnber = ber_alloc_t( LBER_USE_DER ); @@ -114,7 +117,38 @@ ldap_txn_end_s( ber_flatten( txnber, &txnval ); rc = ldap_extended_operation_s( ld, LDAP_EXOP_X_TXN_END, - txnval, sctrls, cctrls, NULL, NULL ); + txnval, sctrls, cctrls, NULL, &retdata ); + + ber_free( txnber, 1 ); + + /* parse retdata */ + if( retdata != NULL ) { + BerElement *ber; + ber_tag_t tag; + ber_int_t retid; + + if( retidp == NULL ) goto done; + + ber = ber_init( retdata ); + + if( ber == NULL ) { + rc = ld->ld_errno = LDAP_NO_MEMORY; + goto done; + } + + tag = ber_scanf( ber, "i", &retid ); + ber_free( ber, 1 ); + + if ( tag != LBER_INTEGER ) { + rc = ld->ld_errno = LDAP_DECODING_ERROR; + goto done; + } + + *retidp = (int) retid; + +done: + ber_bvfree( retdata ); + } return rc; }