X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=libraries%2Flibldap%2Ftxn.c;h=d5ac2d7c2f8342b2b392fbe5570e8aacefc57937;hb=7d13ef7e42f1514dd99878835a13a700da4f4b69;hp=23856db4b6370fd6cc1fa9b46410ce1146b60972;hpb=544d00f3e53f598e51d23c795f72e5ba3a2f8642;p=openldap diff --git a/libraries/libldap/txn.c b/libraries/libldap/txn.c index 23856db4b6..d5ac2d7c2f 100644 --- a/libraries/libldap/txn.c +++ b/libraries/libldap/txn.c @@ -1,7 +1,7 @@ /* $OpenLDAP$ */ /* This work is part of OpenLDAP Software . * - * Copyright 2006 The OpenLDAP Foundation. + * Copyright 2006-2012 The OpenLDAP Foundation. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -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; }