version 1.34, 1999/06/18 21:53:07
|
version 1.48, 2000/05/12 22:02:36
|
Line 1
|
Line 1
|
/* decode.c - ber input decoding routines */ |
/* decode.c - ber input decoding routines */ |
|
/* $OpenLDAP: pkg/ldap/libraries/liblber/decode.c,v 1.47 2000/04/26 07:17:05 kurt Exp $ */ |
/* |
/* |
* Copyright 1998-1999 The OpenLDAP Foundation, All Rights Reserved. |
* Copyright 1998-1999 The OpenLDAP Foundation, All Rights Reserved. |
* COPYING RESTRICTIONS APPLY, see COPYRIGHT file |
* COPYING RESTRICTIONS APPLY, see COPYRIGHT file |
Line 25
|
Line 26
|
#include <ac/string.h> |
#include <ac/string.h> |
#include <ac/socket.h> |
#include <ac/socket.h> |
|
|
#undef LDAP_F_PRE |
|
#define LDAP_F_PRE LDAP_F_EXPORT |
|
|
|
#include "lber-int.h" |
#include "lber-int.h" |
|
|
static ber_tag_t ber_getnint LDAP_P(( |
static ber_len_t ber_getnint LDAP_P(( |
BerElement *ber, |
BerElement *ber, |
ber_int_t *num, |
ber_int_t *num, |
ber_len_t len )); |
ber_len_t len )); |
Line 41 ber_get_tag( BerElement *ber )
|
Line 39 ber_get_tag( BerElement *ber )
|
{ |
{ |
unsigned char xbyte; |
unsigned char xbyte; |
ber_tag_t tag; |
ber_tag_t tag; |
char *tagp; |
|
unsigned int i; |
unsigned int i; |
|
|
assert( ber != NULL ); |
assert( ber != NULL ); |
Line 50 ber_get_tag( BerElement *ber )
|
Line 47 ber_get_tag( BerElement *ber )
|
if ( ber_read( ber, (char *) &xbyte, 1 ) != 1 ) |
if ( ber_read( ber, (char *) &xbyte, 1 ) != 1 ) |
return( LBER_DEFAULT ); |
return( LBER_DEFAULT ); |
|
|
|
tag = xbyte; |
|
|
if ( (xbyte & LBER_BIG_TAG_MASK) != LBER_BIG_TAG_MASK ) |
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++ ) { |
for ( i = 1; i < sizeof(ber_tag_t); i++ ) { |
if ( ber_read( ber, (char *) &xbyte, 1 ) != 1 ) |
if ( ber_read( ber, (char *) &xbyte, 1 ) != 1 ) |
return( LBER_DEFAULT ); |
return( LBER_DEFAULT ); |
|
|
tagp[i] = xbyte; |
tag <<= 8; |
|
tag |= 0x00ffUL & (ber_tag_t) xbyte; |
|
|
if ( ! (xbyte & LBER_MORE_TAG_MASK) ) |
if ( ! (xbyte & LBER_MORE_TAG_MASK) ) |
break; |
break; |
Line 69 ber_get_tag( BerElement *ber )
|
Line 67 ber_get_tag( BerElement *ber )
|
if ( i == sizeof(ber_tag_t) ) |
if ( i == sizeof(ber_tag_t) ) |
return( LBER_DEFAULT ); |
return( LBER_DEFAULT ); |
|
|
/* want leading, not trailing 0's */ |
return tag; |
return( tag >> (sizeof(ber_tag_t) - i - 1) ); |
|
} |
} |
|
|
ber_tag_t |
ber_tag_t |
Line 78 ber_skip_tag( BerElement *ber, ber_len_t
|
Line 75 ber_skip_tag( BerElement *ber, ber_len_t
|
{ |
{ |
ber_tag_t tag; |
ber_tag_t tag; |
unsigned char lc; |
unsigned char lc; |
ber_len_t noctets; |
ber_len_t i, noctets; |
int diff; |
unsigned char netlen[sizeof(ber_len_t)]; |
ber_len_t netlen; |
|
|
|
assert( ber != NULL ); |
assert( ber != NULL ); |
assert( len != NULL ); |
assert( len != NULL ); |
Line 96 ber_skip_tag( BerElement *ber, ber_len_t
|
Line 92 ber_skip_tag( BerElement *ber, ber_len_t
|
* 2) primitive encodings used whenever possible |
* 2) primitive encodings used whenever possible |
*/ |
*/ |
|
|
|
*len = 0; |
|
|
/* |
/* |
* First, we read the tag. |
* First, we read the tag. |
*/ |
*/ |
Line 107 ber_skip_tag( BerElement *ber, ber_len_t
|
Line 105 ber_skip_tag( BerElement *ber, ber_len_t
|
* Next, read the length. The first byte contains the length of |
* Next, read the length. The first byte contains the length of |
* the length. If bit 8 is set, the length is the long form, |
* the length. If bit 8 is set, the length is the long form, |
* otherwise it's the short form. We don't allow a length that's |
* otherwise it's the short form. We don't allow a length that's |
* greater than what we can hold in an unsigned long. |
* greater than what we can hold in a ber_len_t. |
*/ |
*/ |
|
|
*len = netlen = 0; |
|
if ( ber_read( ber, (char *) &lc, 1 ) != 1 ) |
if ( ber_read( ber, (char *) &lc, 1 ) != 1 ) |
return( LBER_DEFAULT ); |
return( LBER_DEFAULT ); |
|
|
if ( lc & 0x80U ) { |
if ( lc & 0x80U ) { |
noctets = (lc & 0x7fU); |
noctets = (lc & 0x7fU); |
if ( noctets > sizeof(ber_len_t) ) |
|
|
if ( noctets > sizeof(ber_len_t) ) { |
return( LBER_DEFAULT ); |
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 ); |
return( LBER_DEFAULT ); |
*len = LBER_LEN_NTOH( netlen ); |
} |
|
|
|
for( i = 0; i < noctets; i++ ) { |
|
*len <<= 8; |
|
*len |= netlen[i]; |
|
} |
|
|
} else { |
} else { |
*len = lc; |
*len = lc; |
} |
} |
Line 131 ber_skip_tag( BerElement *ber, ber_len_t
|
Line 136 ber_skip_tag( BerElement *ber, ber_len_t
|
|
|
ber_tag_t |
ber_tag_t |
ber_peek_tag( |
ber_peek_tag( |
LDAP_CONST BerElement *ber_in, |
BerElement *ber_in, |
ber_len_t *len ) |
ber_len_t *len ) |
{ |
{ |
ber_tag_t tag; |
ber_tag_t tag; |
Line 140 ber_peek_tag(
|
Line 145 ber_peek_tag(
|
assert( ber_in != NULL ); |
assert( ber_in != NULL ); |
assert( BER_VALID( ber_in ) ); |
assert( BER_VALID( ber_in ) ); |
|
|
|
*len = 0; |
|
|
ber = ber_dup( ber_in ); |
ber = ber_dup( ber_in ); |
|
|
if( ber == NULL ) { |
if( ber == NULL ) { |
Line 154 ber_peek_tag(
|
Line 161 ber_peek_tag(
|
return( tag ); |
return( tag ); |
} |
} |
|
|
static ber_tag_t |
static ber_len_t |
ber_getnint( |
ber_getnint( |
BerElement *ber, |
BerElement *ber, |
ber_int_t *num, |
ber_int_t *num, |
Line 178 ber_getnint(
|
Line 185 ber_getnint(
|
return( -1 ); |
return( -1 ); |
|
|
/* read into the low-order bytes of our buffer */ |
/* read into the low-order bytes of our buffer */ |
if ( (ber_len_t) ber_read( ber, buf, len ) != len ) { |
if ( (ber_len_t) ber_read( ber, (char *) buf, len ) != len ) { |
return( -1 ); |
return( -1 ); |
} |
} |
|
|
Line 215 ber_get_int(
|
Line 222 ber_get_int(
|
if ( (tag = ber_skip_tag( ber, &len )) == LBER_DEFAULT ) |
if ( (tag = ber_skip_tag( ber, &len )) == LBER_DEFAULT ) |
return( LBER_DEFAULT ); |
return( LBER_DEFAULT ); |
|
|
if ( (unsigned long) ber_getnint( ber, num, len ) != len ) |
if ( ber_getnint( ber, num, len ) != len ) |
return( LBER_DEFAULT ); |
return( LBER_DEFAULT ); |
else |
else |
return( tag ); |
return( tag ); |
Line 242 ber_get_stringb(
|
Line 249 ber_get_stringb(
|
if ( datalen > (*len - 1) ) |
if ( datalen > (*len - 1) ) |
return( LBER_DEFAULT ); |
return( LBER_DEFAULT ); |
|
|
if ( (unsigned long) ber_read( ber, buf, datalen ) != datalen ) |
if ( (ber_len_t) ber_read( ber, buf, datalen ) != datalen ) |
return( LBER_DEFAULT ); |
return( LBER_DEFAULT ); |
|
|
buf[datalen] = '\0'; |
buf[datalen] = '\0'; |
Line 289 ber_get_stringa( BerElement *ber, char *
|
Line 296 ber_get_stringa( BerElement *ber, char *
|
if ( (*buf = (char *) LBER_MALLOC( datalen + 1 )) == NULL ) |
if ( (*buf = (char *) LBER_MALLOC( datalen + 1 )) == NULL ) |
return( LBER_DEFAULT ); |
return( LBER_DEFAULT ); |
|
|
if ( (unsigned long) ber_read( ber, *buf, datalen ) != datalen ) { |
if ( (ber_len_t) ber_read( ber, *buf, datalen ) != datalen ) { |
LBER_FREE( *buf ); |
LBER_FREE( *buf ); |
*buf = NULL; |
*buf = NULL; |
return( LBER_DEFAULT ); |
return( LBER_DEFAULT ); |
Line 393 ber_get_bitstringa(
|
Line 400 ber_get_bitstringa(
|
return( LBER_DEFAULT ); |
return( LBER_DEFAULT ); |
} |
} |
|
|
if ( (unsigned long) ber_read( ber, *buf, datalen ) != datalen ) { |
if ( (ber_len_t) ber_read( ber, *buf, datalen ) != datalen ) { |
LBER_FREE( buf ); |
LBER_FREE( buf ); |
*buf = NULL; |
*buf = NULL; |
return( LBER_DEFAULT ); |
return( LBER_DEFAULT ); |
Line 469 ber_tag_t
|
Line 476 ber_tag_t
|
ber_next_element( |
ber_next_element( |
BerElement *ber, |
BerElement *ber, |
ber_len_t *len, |
ber_len_t *len, |
char *last ) |
LDAP_CONST char *last ) |
{ |
{ |
assert( ber != NULL ); |
assert( ber != NULL ); |
assert( len != NULL ); |
assert( len != NULL ); |
Line 486 ber_next_element(
|
Line 493 ber_next_element(
|
|
|
/* VARARGS */ |
/* VARARGS */ |
ber_tag_t |
ber_tag_t |
ber_scanf |
ber_scanf ( BerElement *ber, |
#if HAVE_STDARG |
|
( BerElement *ber, |
|
LDAP_CONST char *fmt, |
LDAP_CONST char *fmt, |
... ) |
... ) |
#else |
|
( va_alist ) |
|
va_dcl |
|
#endif |
|
{ |
{ |
va_list ap; |
va_list ap; |
#ifndef HAVE_STDARG |
|
BerElement *ber; |
|
char *fmt; |
|
#endif |
|
LDAP_CONST char *fmt_reset; |
LDAP_CONST char *fmt_reset; |
char *last; |
char *last; |
char *s, **ss, ***sss; |
char *s, **ss, ***sss; |
Line 512 va_dcl
|
Line 509 va_dcl
|
ber_tag_t rc, tag; |
ber_tag_t rc, tag; |
ber_len_t len; |
ber_len_t len; |
|
|
#ifdef HAVE_STDARG |
|
va_start( ap, fmt ); |
va_start( ap, fmt ); |
#else |
|
va_start( ap ); |
|
ber = va_arg( ap, BerElement * ); |
|
fmt = va_arg( ap, char * ); |
|
#endif |
|
|
|
assert( ber != NULL ); |
assert( ber != NULL ); |
assert( fmt != NULL ); |
assert( fmt != NULL ); |
Line 672 va_dcl
|
Line 663 va_dcl
|
* Error. Reclaim malloced memory that was given to the caller. |
* Error. Reclaim malloced memory that was given to the caller. |
* Set allocated pointers to NULL, "data length" outvalues to 0. |
* Set allocated pointers to NULL, "data length" outvalues to 0. |
*/ |
*/ |
#ifdef HAVE_STDARG |
|
va_start( ap, fmt ); |
va_start( ap, fmt ); |
#else |
|
va_start( ap ); |
|
(void) va_arg( ap, BerElement * ); |
|
(void) va_arg( ap, char * ); |
|
#endif |
|
|
|
for ( ; fmt_reset < fmt; fmt_reset++ ) { |
for ( ; fmt_reset < fmt; fmt_reset++ ) { |
switch ( *fmt_reset ) { |
switch ( *fmt_reset ) { |