]> git.sur5r.net Git - openldap/blobdiff - libraries/liblber/io.c
setting UFN prefix to NULL should clear prefix not cause crash.
[openldap] / libraries / liblber / io.c
index 98c5d5d552327aa0d88fcfd7fdea535789cad404..e153cc997cb334d29aec08dcf39ed398579d5e36 100644 (file)
@@ -1,4 +1,5 @@
 /* io.c - ber general i/o routines */
+/* $OpenLDAP$ */
 /*
  * Copyright 1998-1999 The OpenLDAP Foundation, All Rights Reserved.
  * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
@@ -31,9 +32,6 @@
 #include <io.h>
 #endif
 
-#undef LDAP_F_PRE
-#define LDAP_F_PRE LDAP_F_EXPORT
-
 #include "lber-int.h"
 
 static ber_slen_t BerRead LDAP_P((
@@ -41,10 +39,6 @@ static ber_slen_t BerRead LDAP_P((
        char *buf,
        ber_len_t len ));
 
-static int ber_realloc LDAP_P((
-       BerElement *ber,
-       ber_len_t len ));
-
 #define EXBUFSIZ       1024
 
 /* probably far too large... */
@@ -139,7 +133,7 @@ ber_write(
        }
 }
 
-static int
+int
 ber_realloc( BerElement *ber, ber_len_t len )
 {
        ber_len_t       need, have, total;
@@ -201,10 +195,18 @@ ber_free( BerElement *ber, int freebuf )
 
        assert( BER_VALID( ber ) );
 
-       if ( freebuf && ber->ber_buf != NULL )
+       if ( freebuf ) {
+               Seqorset *s, *next;
                LBER_FREE( ber->ber_buf );
 
+               for( s = ber->ber_sos ; s != NULL ; s = next ) {
+                       next = s->sos_next;
+                       LBER_FREE( s );
+               }
+       }
+
        ber->ber_buf = NULL;
+       ber->ber_sos = NULL;
        ber->ber_valid = LBER_UNINITIALIZED;
 
        LBER_FREE( (char *) ber );
@@ -240,6 +242,8 @@ ber_flush( Sockbuf *sb, BerElement *ber, int freeit )
        if ( sb->sb_options & (LBER_TO_FILE | LBER_TO_FILE_ONLY) ) {
                rc = write( sb->sb_fd, ber->ber_rwptr, towrite );
                if ( sb->sb_options & LBER_TO_FILE_ONLY ) {
+                       if ( freeit )
+                               ber_free( ber, 1 );
                        return( (int)rc );
                }
        }
@@ -296,7 +300,7 @@ der_alloc( void )   /* deprecated */
 }
 
 BerElement *
-ber_dup( LDAP_CONST BerElement *ber )
+ber_dup( BerElement *ber )
 {
        BerElement      *new;
 
@@ -373,7 +377,7 @@ ber_init( struct berval *bv )
 ** the returned berval.
 */
 int ber_flatten(
-       LDAP_CONST BerElement *ber,
+       BerElement *ber,
        struct berval **bvPtr)
 {
        struct berval *bv;
@@ -512,8 +516,9 @@ ber_get_next(
                ber->ber_tag = 0;
        }
 
-#define PTR_IN_VAR( ptr, var )\
-(((ptr)>=(char *) &(var)) && ((ptr)< (char *) &(var)+sizeof(var)))
+#undef PTR_IN_VAR
+#define PTR_IN_VAR( ptr, var ) \
+       (((ptr)>=(char *) &(var)) && ((ptr)< (char *) &(var)+sizeof(var)))
        
        if (PTR_IN_VAR(ber->ber_rwptr, ber->ber_tag)) {
                if (ber->ber_rwptr == (char *) &ber->ber_tag) {
@@ -537,10 +542,11 @@ ber_get_next(
                                ber->ber_rwptr = (char *) &ber->ber_usertag;
                                goto get_lenbyte;
                        }
-               } while (PTR_IN_VAR(ber->ber_rwptr,ber->ber_tag));
+               } while( PTR_IN_VAR(ber->ber_rwptr, ber->ber_tag ));
                errno = ERANGE; /* this is a serious error. */
                return LBER_DEFAULT;
        }
+
 get_lenbyte:
        if (ber->ber_rwptr==(char *) &ber->ber_usertag) {
                unsigned char c;
@@ -560,19 +566,28 @@ get_lenbyte:
                        goto fill_buffer;
                }
        }
+
        if (PTR_IN_VAR(ber->ber_rwptr, ber->ber_len)) {
+               unsigned char netlen[sizeof(ber_len_t)];
+
                ber_slen_t res;
                ber_slen_t to_go;
                to_go = (char *) &ber->ber_len + sizeof( ber->ber_len ) -
                        ber->ber_rwptr;
                assert( to_go > 0 );
-               res = ber_pvt_sb_read( sb, ber->ber_rwptr, to_go );
-               if (res <=0)
+               res = ber_pvt_sb_read( sb, netlen, to_go );
+               if (res <= 0) {
                        return LBER_DEFAULT;
+               }
                ber->ber_rwptr += res;
+
                if (res==to_go) {
                        /* convert length. */
-                       ber->ber_len = LBER_LEN_NTOH( ber->ber_len );
+                       ber->ber_len = 0;
+                       for( to_go = 0; to_go < res ; to_go++ ) {
+                               ber->ber_len <<= 8;
+                               ber->ber_len |= netlen[to_go];
+                       }
                        goto fill_buffer;
                } else {
 #if defined( EWOULDBLOCK )
@@ -583,6 +598,7 @@ get_lenbyte:
                        return LBER_DEFAULT;
                }
        }
+
 fill_buffer:   
        /* now fill the buffer. */
        if (ber->ber_buf==NULL) {
@@ -597,6 +613,7 @@ fill_buffer:
                ber->ber_ptr = ber->ber_buf;
                ber->ber_end = ber->ber_buf + ber->ber_len;
        }
+
        if ((ber->ber_rwptr>=ber->ber_buf) && (ber->ber_rwptr<ber->ber_end)) {
                ber_slen_t res;
                ber_slen_t to_go;