X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=libraries%2Fliblber%2Fio.c;h=b54f828cdc88b93b4ffefd2fff060526280cc84e;hb=729fe5669895890b25ddbbfeec4deb545b0e1df3;hp=36e43311047f8ac528121a98f518c67cc82aa127;hpb=61d874af100f0e20ed34796fe61e5f9f76a6506f;p=openldap diff --git a/libraries/liblber/io.c b/libraries/liblber/io.c index 36e4331104..b54f828cdc 100644 --- a/libraries/liblber/io.c +++ b/libraries/liblber/io.c @@ -34,8 +34,6 @@ #include "lber-int.h" -#define EXBUFSIZ 1024 - static ber_slen_t BerRead( Sockbuf *sb, @@ -75,9 +73,9 @@ ber_read( assert( ber != NULL ); assert( buf != NULL ); - assert( BER_VALID( ber ) ); + assert( LBER_VALID( ber ) ); - nleft = ber->ber_end - ber->ber_ptr; + nleft = ber_pvt_ber_remaining( ber ); actuallen = nleft < len ? nleft : len; AC_MEMCPY( buf, ber->ber_ptr, actuallen ); @@ -97,7 +95,7 @@ ber_write( assert( ber != NULL ); assert( buf != NULL ); - assert( BER_VALID( ber ) ); + assert( LBER_VALID( ber ) ); if ( nosos || ber->ber_sos == NULL ) { if ( ber->ber_ptr + len > ber->ber_end ) { @@ -123,23 +121,36 @@ ber_write( int ber_realloc( BerElement *ber, ber_len_t len ) { - ber_len_t need, have, total; + ber_len_t total; Seqorset *s; long off; char *oldbuf; assert( ber != NULL ); assert( len > 0 ); - - assert( BER_VALID( ber ) ); - - have = (ber->ber_end - ber->ber_buf) / EXBUFSIZ; - need = (len < EXBUFSIZ ? 1 : (len + (EXBUFSIZ - 1)) / EXBUFSIZ); - total = have * EXBUFSIZ + need * EXBUFSIZ; + assert( LBER_VALID( ber ) ); + + total = ber_pvt_ber_total( ber ); + +#define LBER_EXBUFSIZ 1000 /* a few words less than 2^N for binary buddy */ +#if defined( LBER_EXBUFSIZ ) && LBER_EXBUFSIZ > 0 +# ifndef notdef + /* don't realloc by small amounts */ + total += len < LBER_EXBUFSIZ ? LBER_EXBUFSIZ : len; +# else + { /* not sure what value this adds */ + ber_len_t have = (total + (LBER_EXBUFSIZE - 1)) / LBER_EXBUFSIZ; + ber_len_t need = (len + (LBER_EXBUFSIZ - 1)) / LBER_EXBUFSIZ; + total = ( have + need ) * LBER_EXBUFSIZ; + } +# endif +#else + total += len; /* realloc just what's needed */ +#endif oldbuf = ber->ber_buf; - ber->ber_buf = (char *) LBER_REALLOC( ber->ber_buf, total ); + ber->ber_buf = (char *) LBER_REALLOC( oldbuf, total ); if ( ber->ber_buf == NULL ) { ber->ber_buf = oldbuf; @@ -180,7 +191,7 @@ ber_free( BerElement *ber, int freebuf ) return; } - assert( BER_VALID( ber ) ); + assert( LBER_VALID( ber ) ); if ( freebuf ) { Seqorset *s, *next; @@ -209,7 +220,7 @@ ber_flush( Sockbuf *sb, BerElement *ber, int freeit ) assert( ber != NULL ); assert( SOCKBUF_VALID( sb ) ); - assert( BER_VALID( ber ) ); + assert( LBER_VALID( ber ) ); if ( ber->ber_rwptr == NULL ) { ber->ber_rwptr = ber->ber_buf; @@ -259,28 +270,29 @@ ber_alloc_t( int options ) ber = (BerElement *) LBER_CALLOC( 1, sizeof(BerElement) ); - if ( ber == NULL ) - return( NULL ); + if ( ber == NULL ) { + return NULL; + } ber->ber_valid = LBER_VALID_BERELEMENT; ber->ber_tag = LBER_DEFAULT; ber->ber_options = options; ber->ber_debug = ber_int_debug; - assert( BER_VALID( ber ) ); - return( ber ); + assert( LBER_VALID( ber ) ); + return ber; } BerElement * ber_alloc( void ) /* deprecated */ { - return( ber_alloc_t( 0 ) ); + return ber_alloc_t( 0 ); } BerElement * der_alloc( void ) /* deprecated */ { - return( ber_alloc_t( LBER_USE_DER ) ); + return ber_alloc_t( LBER_USE_DER ); } BerElement * @@ -289,15 +301,15 @@ ber_dup( BerElement *ber ) BerElement *new; assert( ber != NULL ); - assert( BER_VALID( ber ) ); + assert( LBER_VALID( ber ) ); if ( (new = ber_alloc_t( ber->ber_options )) == NULL ) { - return( NULL ); + return NULL; } *new = *ber; - assert( BER_VALID( new ) ); + assert( LBER_VALID( new ) ); return( new ); } @@ -316,7 +328,7 @@ ber_init_w_nullc( BerElement *ber, int options ) ber->ber_options = (char) options; ber->ber_debug = ber_int_debug; - assert( BER_VALID( ber ) ); + assert( LBER_VALID( ber ) ); } /* New C-API ber_init() */ @@ -375,7 +387,7 @@ int ber_flatten( return -1; } - bv = LBER_MALLOC( sizeof(struct berval)); + bv = LBER_MALLOC( sizeof(struct berval) ); if ( bv == NULL ) { return -1; } @@ -387,7 +399,7 @@ int ber_flatten( } else { /* copy the berval */ - ber_len_t len = ber->ber_ptr - ber->ber_buf; + ber_len_t len = ber_pvt_ber_write( ber ); bv->bv_val = (char *) LBER_MALLOC( len + 1 ); if ( bv->bv_val == NULL ) { @@ -408,11 +420,12 @@ void ber_reset( BerElement *ber, int was_writing ) { assert( ber != NULL ); - assert( BER_VALID( ber ) ); + assert( LBER_VALID( ber ) ); if ( was_writing ) { ber->ber_end = ber->ber_ptr; ber->ber_ptr = ber->ber_buf; + } else { ber->ber_ptr = ber->ber_end; } @@ -437,7 +450,7 @@ ber_get_next( assert( ber != NULL ); assert( SOCKBUF_VALID( sb ) ); - assert( BER_VALID( ber ) ); + assert( LBER_VALID( ber ) ); #ifdef NEW_LOGGING LDAP_LOG(( "liblber", LDAP_LEVEL_ENTRY, "ber_get_next: enter\n" )); @@ -475,8 +488,10 @@ ber_get_next( if (ber->ber_rwptr == (char *) &ber->ber_tag) { if (ber_int_sb_read( sb, ber->ber_rwptr, 1)<=0) return LBER_DEFAULT; + if ((ber->ber_rwptr[0] & LBER_BIG_TAG_MASK) - != LBER_BIG_TAG_MASK) { + != LBER_BIG_TAG_MASK) + { ber->ber_tag = ber->ber_rwptr[0]; ber->ber_rwptr = (char *) &ber->ber_usertag; goto get_lenbyte; @@ -504,17 +519,21 @@ ber_get_next( get_lenbyte: if (ber->ber_rwptr==(char *) &ber->ber_usertag) { unsigned char c; - if (ber_int_sb_read( sb, (char *) &c, 1)<=0) + if (ber_int_sb_read( sb, (char *) &c, 1)<=0) { return LBER_DEFAULT; + } + if (c & 0x80U) { int len = c & 0x7fU; if ( (len==0) || ( len>sizeof( ber->ber_len ) ) ) { errno = ERANGE; return LBER_DEFAULT; } + ber->ber_rwptr = (char *) &ber->ber_len + sizeof(ber->ber_len) - len; ber->ber_len = 0; + } else { ber->ber_len = c; goto fill_buffer; @@ -529,6 +548,7 @@ get_lenbyte: to_go = (char *) &ber->ber_len + sizeof( ber->ber_len ) - ber->ber_rwptr; assert( to_go > 0 ); + res = BerRead( sb, netlen, to_go ); if (res <= 0) { return LBER_DEFAULT; @@ -540,8 +560,10 @@ get_lenbyte: ber->ber_len <<= 8; ber->ber_len |= netlen[to_go]; } - if (PTR_IN_VAR(ber->ber_rwptr, ber->ber_len)) + + if (PTR_IN_VAR(ber->ber_rwptr, ber->ber_len)) { return LBER_DEFAULT; + } } fill_buffer: @@ -603,6 +625,7 @@ fill_buffer: } return (ber->ber_tag); } + assert( 0 ); /* ber structure is messed up ?*/ return LBER_DEFAULT; }