]> git.sur5r.net Git - openldap/blobdiff - libraries/liblber/decode.c
Use getpassphrase() instead of getpass() if available.
[openldap] / libraries / liblber / decode.c
index e8b889d2e78a8e0fa69951fcb4b101fd0199984c..ca24e89c3887ce58416fd44c5863d51a674ecd55 100644 (file)
@@ -1,7 +1,7 @@
 /* decode.c - ber input decoding routines */
 /* $OpenLDAP$ */
 /*
- * Copyright 1998-1999 The OpenLDAP Foundation, All Rights Reserved.
+ * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved.
  * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
  */
 /* Portions
@@ -26,9 +26,6 @@
 #include <ac/string.h>
 #include <ac/socket.h>
 
-#undef LDAP_F_PRE
-#define LDAP_F_PRE LDAP_F_EXPORT
-
 #include "lber-int.h"
 
 static ber_len_t ber_getnint LDAP_P((
@@ -42,7 +39,6 @@ ber_get_tag( BerElement *ber )
 {
        unsigned char   xbyte;
        ber_tag_t       tag;
-       char            *tagp;
        unsigned int    i;
 
        assert( ber != NULL );
@@ -51,16 +47,17 @@ ber_get_tag( BerElement *ber )
        if ( ber_read( ber, (char *) &xbyte, 1 ) != 1 )
                return( LBER_DEFAULT );
 
+       tag = xbyte;
+
        if ( (xbyte & LBER_BIG_TAG_MASK) != LBER_BIG_TAG_MASK )
-               return( (ber_tag_t) xbyte );
+               return tag;
 
-       tagp = (char *) &tag;
-       tagp[0] = xbyte;
        for ( i = 1; i < sizeof(ber_tag_t); i++ ) {
                if ( ber_read( ber, (char *) &xbyte, 1 ) != 1 )
                        return( LBER_DEFAULT );
 
-               tagp[i] = xbyte;
+               tag <<= 8;
+               tag |= 0x00ffUL & (ber_tag_t) xbyte;
 
                if ( ! (xbyte & LBER_MORE_TAG_MASK) )
                        break;
@@ -70,8 +67,7 @@ ber_get_tag( BerElement *ber )
        if ( i == sizeof(ber_tag_t) )
                return( LBER_DEFAULT );
 
-       /* want leading, not trailing 0's */
-       return( tag >> (sizeof(ber_tag_t) - i - 1) );
+       return tag;
 }
 
 ber_tag_t
@@ -79,9 +75,8 @@ ber_skip_tag( BerElement *ber, ber_len_t *len )
 {
        ber_tag_t       tag;
        unsigned char   lc;
-       ber_len_t       noctets;
-       int             diff;
-       ber_len_t       netlen;
+       ber_len_t       i, noctets;
+       unsigned char netlen[sizeof(ber_len_t)];
 
        assert( ber != NULL );
        assert( len != NULL );
@@ -97,6 +92,8 @@ ber_skip_tag( BerElement *ber, ber_len_t *len )
         *      2) primitive encodings used whenever possible
         */
 
+       *len = 0;
+
        /*
         * First, we read the tag.
         */
@@ -111,18 +108,25 @@ ber_skip_tag( BerElement *ber, ber_len_t *len )
         * greater than what we can hold in a ber_len_t.
         */
 
-       *len = netlen = 0;
        if ( ber_read( ber, (char *) &lc, 1 ) != 1 )
                return( LBER_DEFAULT );
+
        if ( lc & 0x80U ) {
                noctets = (lc & 0x7fU);
-               if ( noctets > sizeof(ber_len_t) )
+
+               if ( noctets > sizeof(ber_len_t) ) {
                        return( LBER_DEFAULT );
-               diff = sizeof(ber_len_t) - noctets;
-               if ( (unsigned) ber_read( ber, (char *) &netlen + diff, noctets )
-                   != noctets )
+               }
+
+               if( (unsigned) ber_read( ber, netlen, noctets ) != noctets ) {
                        return( LBER_DEFAULT );
-               *len = LBER_LEN_NTOH( netlen );
+               }
+
+               for( i = 0; i < noctets; i++ ) {
+                       *len <<= 8;
+                       *len |= netlen[i];
+               }
+
        } else {
                *len = lc;
        }
@@ -135,21 +139,25 @@ ber_peek_tag(
        BerElement *ber_in,
        ber_len_t *len )
 {
-       char*   save;
+       ber_tag_t       tag;
        BerElement *ber;
-       ber_tag_t tag;
 
        assert( ber_in != NULL );
        assert( BER_VALID( ber_in ) );
 
-       /* save state */
-       save = ber->ber_ptr;
+       *len = 0;
 
-       tag = ber_skip_tag( ber, len );
+       ber = ber_dup( ber_in );
 
-       /* restore state */
-       ber->ber_ptr = save;
+       if( ber == NULL ) {
+               return LBER_ERROR;
+       }
+
+       assert( BER_VALID( ber ) );
 
+       tag = ber_skip_tag( ber, len );
+
+       ber_free( ber, 0 );
        return( tag );
 }
 
@@ -220,6 +228,14 @@ ber_get_int(
                return( tag );
 }
 
+ber_tag_t
+ber_get_enum(
+       BerElement *ber,
+       ber_int_t *num )
+{
+       return ber_get_int( ber, num );
+}
+
 ber_tag_t
 ber_get_stringb(
        BerElement *ber,
@@ -451,7 +467,8 @@ ber_first_element(
 
        /* skip the sequence header, use the len to mark where to stop */
        if ( ber_skip_tag( ber, len ) == LBER_DEFAULT ) {
-               return( LBER_ERROR );
+               *last = NULL;
+               return( LBER_DEFAULT );
        }
 
        *last = ber->ber_ptr + *len;
@@ -476,7 +493,6 @@ ber_next_element(
        assert( BER_VALID( ber ) );
 
        if ( ber->ber_ptr == last ) {
-               /* set last to NULL on end of SEQUENCE */
                return( LBER_DEFAULT );
        }