From: Howard Chu Date: Wed, 2 Jul 2008 01:33:15 +0000 (+0000) Subject: ITS#5580: Revert prev commit, failed on byte-at-a-time input. Different X-Git-Tag: LOCKER_IDS~69 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=aebcd93721669a0f800f5aa4c9b0e444ff2a8840;p=openldap ITS#5580: Revert prev commit, failed on byte-at-a-time input. Different approach used here. --- diff --git a/libraries/liblber/io.c b/libraries/liblber/io.c index bceb742b48..4063b26c82 100644 --- a/libraries/liblber/io.c +++ b/libraries/liblber/io.c @@ -522,14 +522,18 @@ ber_get_next( } while (ber->ber_rwptr > (char *)&ber->ber_tag && ber->ber_rwptr < - (char *)&ber->ber_len + LENSIZE*2 -1) { + (char *)&ber->ber_len + LENSIZE*2) { ber_slen_t sblen; char buf[sizeof(ber->ber_len)-1]; ber_len_t tlen = 0; + /* The tag & len can be at most 9 bytes; we try to read up to 8 here */ sock_errset(0); - sblen=ber_int_sb_read( sb, ber->ber_rwptr, - ((char *)&ber->ber_len + LENSIZE*2 - 1)-ber->ber_rwptr); + sblen=((char *)&ber->ber_len + LENSIZE*2 - 1)-ber->ber_rwptr; + /* Trying to read the last len byte of a 9 byte tag+len */ + if (sblen<1) + sblen = 1; + sblen=ber_int_sb_read( sb, ber->ber_rwptr, sblen ); if (sblen<=0) return LBER_DEFAULT; ber->ber_rwptr += sblen; @@ -579,16 +583,18 @@ ber_get_next( int i; unsigned char *p = (unsigned char *)ber->ber_ptr; int llen = *p++ & 0x7f; - if (llen > (int)sizeof(ber_len_t)) { + if (llen > LENSIZE) { sock_errset(ERANGE); return LBER_DEFAULT; } /* Not enough bytes? */ - i = ber->ber_rwptr - (char *)p; - if (i < llen) { - sblen=ber_int_sb_read( sb, ber->ber_rwptr, i ); - if (sblenber_rwptr += sblen; + if (ber->ber_rwptr - (char *)p < llen) { +#if defined( EWOULDBLOCK ) + sock_errset(EWOULDBLOCK); +#elif defined( EAGAIN ) + sock_errset(EAGAIN); +#endif + return LBER_DEFAULT; } for (i=0; i