X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=libraries%2Fliblber%2Fdecode.c;h=ae0b963b033614af71f9eaf62fb267db599f3fa7;hb=5ee926446579ba94fe5a2c125966b738b46ffc3b;hp=33f33b4c6d5efb2ad252ef1fe949fb714b15efa7;hpb=3cc07977fa26133739e74116dc248e8ecb7cf9b3;p=openldap diff --git a/libraries/liblber/decode.c b/libraries/liblber/decode.c index 33f33b4c6d..ae0b963b03 100644 --- a/libraries/liblber/decode.c +++ b/libraries/liblber/decode.c @@ -128,7 +128,7 @@ ber_skip_tag( BerElement *ber, ber_len_t *len ) return LBER_DEFAULT; } - if( (unsigned) ber_read( ber, netlen, noctets ) != noctets ) { + if( (unsigned) ber_read( ber, (char *) netlen, noctets ) != noctets ) { return LBER_DEFAULT; } @@ -315,15 +315,16 @@ ber_get_stringbvl( bgbvr *b, ber_len_t *rlen ) char *last, *orig; struct berval bv, *bvp = NULL; + /* For rewinding, just like ber_peek_tag() */ orig = b->ber->ber_ptr; + tag = b->ber->ber_tag; - tag = ber_first_element( b->ber, &len, &last ); - if ( tag != LBER_DEFAULT ) { + if ( ber_first_element( b->ber, &len, &last ) != LBER_DEFAULT ) { for ( ; b->ber->ber_ptr < last; i++ ) { - tag = ber_skip_tag( b->ber, &len ); - if (tag == LBER_DEFAULT) break; + if (ber_skip_tag( b->ber, &len ) == LBER_DEFAULT) break; b->ber->ber_ptr += len; + b->ber->ber_tag = *(unsigned char *)b->ber->ber_ptr; } } @@ -340,25 +341,25 @@ ber_get_stringbvl( bgbvr *b, ber_len_t *rlen ) /* Allocate the result vector */ switch (b->choice) { case ChArray: - *b->res.c = LBER_MALLOC( (n+1) * sizeof( char * )); + *b->res.c = ber_memalloc_x( (n+1) * sizeof( char * ), b->ber->ber_memctx); if ( *b->res.c == NULL ) return LBER_DEFAULT; (*b->res.c)[n] = NULL; break; case BvArray: - *b->res.ba = LBER_MALLOC( (n+1) * sizeof( struct berval )); + *b->res.ba = ber_memalloc_x( (n+1) * sizeof( struct berval ), b->ber->ber_memctx); if ( *b->res.ba == NULL ) return LBER_DEFAULT; (*b->res.ba)[n].bv_val = NULL; break; case BvVec: - *b->res.bv = LBER_MALLOC( (n+1) * sizeof( struct berval *)); + *b->res.bv = ber_memalloc_x( (n+1) * sizeof( struct berval *), b->ber->ber_memctx); if ( *b->res.bv == NULL ) return LBER_DEFAULT; (*b->res.bv)[n] = NULL; break; case BvOff: - *b->res.ba = LBER_MALLOC( (n+1) * b->siz ); + *b->res.ba = ber_memalloc_x( (n+1) * b->siz, b->ber->ber_memctx ); if ( *b->res.ba == NULL ) return LBER_DEFAULT; ((struct berval *)((long)(*b->res.ba) + n*b->siz + @@ -366,6 +367,7 @@ ber_get_stringbvl( bgbvr *b, ber_len_t *rlen ) break; } b->ber->ber_ptr = orig; + b->ber->ber_tag = tag; ber_skip_tag( b->ber, &len ); for (n=0; nres.ba)[n] = bv; break; case BvVec: - bvp = LBER_MALLOC( sizeof( struct berval )); + bvp = ber_memalloc_x( sizeof( struct berval ), b->ber->ber_memctx); if ( !bvp ) { LBER_FREE(bv.bv_val); goto nomem; @@ -407,6 +409,7 @@ nomem: case BvArray: LBER_FREE((*b->res.ba)[n].bv_val); break; case BvVec: LBER_FREE((*b->res.bv)[n]->bv_val); LBER_FREE((*b->res.bv)[n]); break; + default: break; } } } @@ -435,7 +438,7 @@ ber_get_stringbv( BerElement *ber, struct berval *bv, int alloc ) } if ( alloc ) { - if ( (bv->bv_val = (char *) LBER_MALLOC( bv->bv_len + 1 )) == NULL ) { + if ( (bv->bv_val = (char *) ber_memalloc_x( bv->bv_len + 1, ber->ber_memctx )) == NULL ) { return LBER_DEFAULT; } @@ -477,7 +480,7 @@ ber_get_stringal( BerElement *ber, struct berval **bv ) assert( ber != NULL ); assert( bv != NULL ); - *bv = (struct berval *) LBER_MALLOC( sizeof(struct berval) ); + *bv = (struct berval *) ber_memalloc_x( sizeof(struct berval), ber->ber_memctx ); if ( *bv == NULL ) { return LBER_DEFAULT; } @@ -512,7 +515,7 @@ ber_get_bitstringa( } --datalen; - if ( (*buf = (char *) LBER_MALLOC( datalen )) == NULL ) { + if ( (*buf = (char *) ber_memalloc_x( datalen, ber->ber_memctx )) == NULL ) { return LBER_DEFAULT; }