]> git.sur5r.net Git - openldap/commitdiff
ITS#5580: Revert prev commit, failed on byte-at-a-time input. Different
authorHoward Chu <hyc@openldap.org>
Wed, 2 Jul 2008 01:33:15 +0000 (01:33 +0000)
committerHoward Chu <hyc@openldap.org>
Wed, 2 Jul 2008 01:33:15 +0000 (01:33 +0000)
approach used here.

libraries/liblber/io.c

index bceb742b4885f95d256eafceddeec7da0ad11abf..4063b26c82360b10c41c1bf18adaaa1bdc0789be 100644 (file)
@@ -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 (sblen<i) return LBER_DEFAULT;
-                               ber->ber_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<llen; i++) {
                                tlen <<=8;