]> 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 57a2eceb4b9a5607d140ddc79663837097fe5795..e153cc997cb334d29aec08dcf39ed398579d5e36 100644 (file)
@@ -32,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((
@@ -42,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... */
@@ -140,7 +133,7 @@ ber_write(
        }
 }
 
-static int
+int
 ber_realloc( BerElement *ber, ber_len_t len )
 {
        ber_len_t       need, have, total;
@@ -523,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) {
@@ -548,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;
@@ -571,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 )
@@ -594,6 +598,7 @@ get_lenbyte:
                        return LBER_DEFAULT;
                }
        }
+
 fill_buffer:   
        /* now fill the buffer. */
        if (ber->ber_buf==NULL) {
@@ -608,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;