--- libraries/liblber/decode.c 2000/10/02 17:26:31 1.34.6.5 +++ libraries/liblber/decode.c 2000/06/05 17:22:22 1.52 @@ -1,5 +1,5 @@ /* decode.c - ber input decoding routines */ -/* $OpenLDAP: pkg/ldap/libraries/liblber/decode.c,v 1.34.6.4 2000/07/29 01:53:07 kurt Exp $ */ +/* $OpenLDAP: pkg/ldap/libraries/liblber/decode.c,v 1.51 2000/05/14 01:38:27 kurt Exp $ */ /* * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved. * COPYING RESTRICTIONS APPLY, see COPYRIGHT file @@ -136,22 +136,29 @@ ber_skip_tag( BerElement *ber, ber_len_t ber_tag_t ber_peek_tag( - BerElement *ber, + BerElement *ber_in, ber_len_t *len ) { - /* - * This implementation assumes ber_skip_tag() only - * modifies ber_ptr field of the BerElement. - */ - - char *save; ber_tag_t tag; + BerElement *ber; + + assert( ber_in != NULL ); + assert( BER_VALID( ber_in ) ); + + *len = 0; + + ber = ber_dup( ber_in ); + + if( ber == NULL ) { + return LBER_ERROR; + } + + assert( BER_VALID( ber ) ); - save = ber->ber_ptr; tag = ber_skip_tag( ber, len ); - ber->ber_ptr = save; - return tag; + ber_free( ber, 0 ); + return( tag ); } static ber_len_t @@ -297,33 +304,23 @@ ber_get_stringal( BerElement *ber, struc if ( (tag = ber_skip_tag( ber, &len )) == LBER_DEFAULT ) { *bv = NULL; - return LBER_DEFAULT; - } - - *bv = (struct berval *) LBER_MALLOC( sizeof(struct berval) ); - if ( *bv == NULL ) { - return LBER_DEFAULT; + return( LBER_DEFAULT ); } - if( len == 0 ) { - (*bv)->bv_val = NULL; - (*bv)->bv_len = 0; - return tag; - } + if ( (*bv = (struct berval *) LBER_MALLOC( sizeof(struct berval) )) == NULL ) + return( LBER_DEFAULT ); - (*bv)->bv_val = (char *) LBER_MALLOC( len + 1 ); - if ( (*bv)->bv_val == NULL ) { + if ( ((*bv)->bv_val = (char *) LBER_MALLOC( len + 1 )) == NULL ) { LBER_FREE( *bv ); *bv = NULL; - return LBER_DEFAULT; + return( LBER_DEFAULT ); } if ( (ber_len_t) ber_read( ber, (*bv)->bv_val, len ) != len ) { ber_bvfree( *bv ); *bv = NULL; - return LBER_DEFAULT; + return( LBER_DEFAULT ); } - ((*bv)->bv_val)[len] = '\0'; (*bv)->bv_len = len;