]> git.sur5r.net Git - openldap/blobdiff - libraries/liblber/io.c
Fix ITS#2142
[openldap] / libraries / liblber / io.c
index 4a687de4830faf0392f5149b7f0fd70acd4a1299..74abb24fd4d22b1516e1b5dc0b5dfd41af1a75e2 100644 (file)
@@ -33,6 +33,7 @@
 #endif
 
 #include "lber-int.h"
+#include "ldap_log.h"
 
 ber_slen_t
 ber_read(
@@ -104,7 +105,7 @@ ber_realloc( BerElement *ber, ber_len_t len )
 
        total = ber_pvt_ber_total( ber );
 
-#define LBER_EXBUFSIZ  1000 /* a few words less than 2^N for binary buddy */
+#define LBER_EXBUFSIZ  4060 /* 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 */
@@ -191,7 +192,7 @@ ber_free( BerElement *ber, int freebuf )
 int
 ber_flush( Sockbuf *sb, BerElement *ber, int freeit )
 {
-       ber_len_t       nwritten, towrite;
+       ber_len_t       towrite;
        ber_slen_t      rc;     
 
        assert( sb != NULL );
@@ -207,11 +208,14 @@ ber_flush( Sockbuf *sb, BerElement *ber, int freeit )
 
        if ( sb->sb_debug ) {
 #ifdef NEW_LOGGING
-               LDAP_LOG(( "liblber", LDAP_LEVEL_DETAIL1,
+               LDAP_LOG( BER, DETAIL1,
                           "ber_flush: %ld bytes to sd %ld%s\n",
                           towrite, (long)sb->sb_fd,
-                          ber->ber_rwptr != ber->ber_buf ? " (re-flush)" : "" ));
-               BER_DUMP(( "liblber", LDAP_LEVEL_DETAIL2, ber, 1 ));
+                          ber->ber_rwptr != ber->ber_buf ? " (re-flush)" : "" );
+
+               if(LDAP_LOGS_TEST(BER, DETAIL2))
+                               BER_DUMP(( "liblber", LDAP_LEVEL_DETAIL2, ber, 1 ));
+
 #else
                ber_log_printf( LDAP_DEBUG_ANY, sb->sb_debug,
                        "ber_flush: %ld bytes to sd %ld%s\n",
@@ -222,16 +226,14 @@ ber_flush( Sockbuf *sb, BerElement *ber, int freeit )
 #endif
        }
 
-       nwritten = 0;
-       do {
+       while ( towrite > 0 ) {
                rc = ber_int_sb_write( sb, ber->ber_rwptr, towrite );
                if (rc<=0) {
                        return -1;
                }
                towrite -= rc;
-               nwritten += rc;
                ber->ber_rwptr += rc;
-       } while ( towrite > 0 );
+       } 
 
        if ( freeit )
                ber_free( ber, 1 );
@@ -292,13 +294,12 @@ ber_dup( BerElement *ber )
 }
 
 
-/* OLD U-Mich ber_init() */
 void
-ber_init_w_nullc( BerElement *ber, int options )
+ber_init2( BerElement *ber, struct berval *bv, int options )
 {
        assert( ber != NULL );
 
-    ber_int_options.lbo_valid = LBER_INITIALIZED;
+       ber_int_options.lbo_valid = LBER_INITIALIZED;
 
        (void) memset( (char *)ber, '\0', sizeof( BerElement ));
        ber->ber_valid = LBER_VALID_BERELEMENT;
@@ -306,9 +307,22 @@ ber_init_w_nullc( BerElement *ber, int options )
        ber->ber_options = (char) options;
        ber->ber_debug = ber_int_debug;
 
+       if ( bv != NULL ) {
+               ber->ber_buf = bv->bv_val;
+               ber->ber_ptr = ber->ber_buf;
+               ber->ber_end = ber->ber_buf + bv->bv_len;
+       }
+
        assert( LBER_VALID( ber ) );
 }
 
+/* OLD U-Mich ber_init() */
+void
+ber_init_w_nullc( BerElement *ber, int options )
+{
+       ber_init2( ber, NULL, options );
+}
+
 /* New C-API ber_init() */
 /* This function constructs a BerElement containing a copy
 ** of the data in the bv argument.
@@ -431,7 +445,7 @@ ber_get_next(
        assert( LBER_VALID( ber ) );
 
 #ifdef NEW_LOGGING
-       LDAP_LOG(( "liblber", LDAP_LEVEL_ENTRY, "ber_get_next: enter\n" ));
+       LDAP_LOG( BER, ENTRY, "ber_get_next: enter\n", 0, 0, 0 );
 #else
        ber_log_printf( LDAP_DEBUG_TRACE, ber->ber_debug,
                "ber_get_next\n" );
@@ -499,10 +513,12 @@ ber_get_next(
                        ber->ber_ptr = (char *)p;
                }
 
+               if (i == 1) continue;
+
                /* Now look for the length */
                if (*ber->ber_ptr & 0x80) {     /* multi-byte */
                        int llen = *(unsigned char *)ber->ber_ptr++ & 0x7f;
-                       if (llen > sizeof(ber_len_t)) {
+                       if (llen > (int)sizeof(ber_len_t)) {
                                errno = ERANGE;
                                return LBER_DEFAULT;
                        }
@@ -519,7 +535,10 @@ ber_get_next(
                }
                /* Are there leftover data bytes inside ber->ber_len? */
                if (ber->ber_ptr < (char *)&ber->ber_usertag) {
-                       i = (char *)&ber->ber_usertag - ber->ber_ptr;
+                       if (ber->ber_rwptr < (char *)&ber->ber_usertag)
+                               i = ber->ber_rwptr - ber->ber_ptr;
+                       else
+                               i = (char *)&ber->ber_usertag - ber->ber_ptr;
                        AC_MEMCPY(buf, ber->ber_ptr, i);
                        ber->ber_ptr += i;
                } else {
@@ -535,9 +554,9 @@ ber_get_next(
                        return LBER_DEFAULT;
                } else if ( sb->sb_max_incoming && ber->ber_len > sb->sb_max_incoming ) {
 #ifdef NEW_LOGGING
-                       LDAP_LOG(( "liblber", LDAP_LEVEL_ERR, 
+                       LDAP_LOG( BER, ERR, 
                                "ber_get_next: sockbuf_max_incoming limit hit "
-                               "(%d > %d)\n", ber->ber_len, sb->sb_max_incoming ));
+                               "(%d > %d)\n", ber->ber_len, sb->sb_max_incoming, 0 );
 #else
                        ber_log_printf( LDAP_DEBUG_CONNS, ber->ber_debug,
                                "ber_get_next: sockbuf_max_incoming limit hit "
@@ -603,10 +622,11 @@ done:
                *len = ber->ber_len;
                if ( ber->ber_debug ) {
 #ifdef NEW_LOGGING
-                       LDAP_LOG(( "liblber", LDAP_LEVEL_DETAIL1,
-                               "ber_get_next: tag 0x%lx len %ld\n",
-                               ber->ber_tag, ber->ber_len ));
-                       BER_DUMP(( "liblber", LDAP_LEVEL_DETAIL2, ber, 1 ));
+                       LDAP_LOG( BER, DETAIL1, 
+                               "ber_get_next: tag 0x%lx len %ld\n", 
+                               ber->ber_tag, ber->ber_len, 0  );
+                       if(LDAP_LOGS_TEST(BER, DETAIL2))
+                                       BER_DUMP(( "liblber", LDAP_LEVEL_DETAIL2, ber, 1 ));
 #else
                        ber_log_printf( LDAP_DEBUG_TRACE, ber->ber_debug,
                                "ber_get_next: tag 0x%lx len %ld contents:\n",