version 1.1.3.1.2.1, 1998/08/09 01:40:29
|
version 1.12, 1998/12/22 00:34:02
|
Line 11
|
Line 11
|
* is provided ``as is'' without express or implied warranty. |
* is provided ``as is'' without express or implied warranty. |
*/ |
*/ |
|
|
|
#include "portable.h" |
|
|
#include <stdio.h> |
#include <stdio.h> |
#ifdef MACOS |
|
#include <stdlib.h> |
|
#include <stdarg.h> |
|
#include "macos.h" |
|
#else /* MACOS */ |
|
#if defined(NeXT) || defined(VMS) |
|
#include <stdlib.h> |
#include <stdlib.h> |
#else /* next || vms */ |
|
#include <malloc.h> |
|
#endif /* next || vms */ |
|
#if defined(BC31) || defined(_WIN32) |
|
#include <stdarg.h> |
|
#else /* BC31 || _WIN32 */ |
|
#include <varargs.h> |
|
#endif /* BC31 || _WIN32 */ |
|
#include <sys/types.h> |
|
#include <sys/socket.h> |
|
#include <netinet/in.h> |
|
#ifdef PCNFS |
|
#include <tklib.h> |
|
#endif /* PCNFS */ |
|
#endif /* MACOS */ |
|
|
|
#if defined( DOS ) || defined( _WIN32 ) |
|
#include "msdos.h" |
|
#endif /* DOS */ |
|
|
|
#include <string.h> |
|
#include "lber.h" |
|
|
|
#ifdef LDAP_DEBUG |
|
int lber_debug; |
|
#endif |
|
|
|
#ifdef NEEDPROTOS |
|
static int ber_getnint( BerElement *ber, long *num, int len ); |
|
#endif /* NEEDPROTOS */ |
|
|
|
|
#include <ac/stdarg.h> |
|
|
|
#include <ac/string.h> |
|
#include <ac/socket.h> |
|
|
|
#include "lber-int.h" |
|
|
|
static int ber_getnint LDAP_P(( BerElement *ber, long *num, int len )); |
|
|
/* return the tag - LBER_DEFAULT returned means trouble */ |
/* return the tag - LBER_DEFAULT returned means trouble */ |
unsigned long |
unsigned long |
Line 58 ber_get_tag( BerElement *ber )
|
Line 32 ber_get_tag( BerElement *ber )
|
unsigned char xbyte; |
unsigned char xbyte; |
unsigned long tag; |
unsigned long tag; |
char *tagp; |
char *tagp; |
int i; |
unsigned int i; |
|
|
if ( ber_read( ber, (char *) &xbyte, 1 ) != 1 ) |
if ( ber_read( ber, (char *) &xbyte, 1 ) != 1 ) |
return( LBER_DEFAULT ); |
return( LBER_DEFAULT ); |
Line 129 ber_skip_tag( BerElement *ber, unsigned
|
Line 103 ber_skip_tag( BerElement *ber, unsigned
|
if ( ber_read( ber, (char *) &netlen + diff, noctets ) |
if ( ber_read( ber, (char *) &netlen + diff, noctets ) |
!= noctets ) |
!= noctets ) |
return( LBER_DEFAULT ); |
return( LBER_DEFAULT ); |
*len = LBER_NTOHL( netlen ); |
*len = AC_NTOHL( netlen ); |
} else { |
} else { |
*len = lc; |
*len = lc; |
} |
} |
Line 178 ber_getnint( BerElement *ber, long *num,
|
Line 152 ber_getnint( BerElement *ber, long *num,
|
sign = (0x80 & *(p+diff) ); |
sign = (0x80 & *(p+diff) ); |
if ( sign && len < sizeof(long) ) { |
if ( sign && len < sizeof(long) ) { |
for ( i = 0; i < diff; i++ ) { |
for ( i = 0; i < diff; i++ ) { |
*(p+i) = 0xff; |
*(p+i) = (unsigned char) 0xff; |
} |
} |
} |
} |
*num = LBER_NTOHL( netnum ); |
*num = AC_NTOHL( netnum ); |
|
|
return( len ); |
return( len ); |
} |
} |
Line 194 ber_get_int( BerElement *ber, long *num
|
Line 168 ber_get_int( BerElement *ber, long *num
|
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 ( ber_getnint( ber, num, (int)len ) != len ) |
if ( (unsigned long) ber_getnint( ber, num, (int)len ) != len ) |
return( LBER_DEFAULT ); |
return( LBER_DEFAULT ); |
else |
else |
return( tag ); |
return( tag ); |
Line 213 ber_get_stringb( BerElement *ber, char *
|
Line 187 ber_get_stringb( BerElement *ber, char *
|
if ( datalen > (*len - 1) ) |
if ( datalen > (*len - 1) ) |
return( LBER_DEFAULT ); |
return( LBER_DEFAULT ); |
|
|
if ( ber_read( ber, buf, datalen ) != datalen ) |
if ( (unsigned long) ber_read( ber, buf, datalen ) != datalen ) |
return( LBER_DEFAULT ); |
return( LBER_DEFAULT ); |
|
|
buf[datalen] = '\0'; |
buf[datalen] = '\0'; |
Line 252 ber_get_stringa( BerElement *ber, char *
|
Line 226 ber_get_stringa( BerElement *ber, char *
|
if ( (*buf = (char *) malloc( (size_t)datalen + 1 )) == NULL ) |
if ( (*buf = (char *) malloc( (size_t)datalen + 1 )) == NULL ) |
return( LBER_DEFAULT ); |
return( LBER_DEFAULT ); |
|
|
if ( ber_read( ber, *buf, datalen ) != datalen ) |
if ( (unsigned long) ber_read( ber, *buf, datalen ) != datalen ) |
return( LBER_DEFAULT ); |
return( LBER_DEFAULT ); |
(*buf)[datalen] = '\0'; |
(*buf)[datalen] = '\0'; |
|
|
Line 285 ber_get_stringal( BerElement *ber, struc
|
Line 259 ber_get_stringal( BerElement *ber, struc
|
if ( ((*bv)->bv_val = (char *) malloc( (size_t)len + 1 )) == NULL ) |
if ( ((*bv)->bv_val = (char *) malloc( (size_t)len + 1 )) == NULL ) |
return( LBER_DEFAULT ); |
return( LBER_DEFAULT ); |
|
|
if ( ber_read( ber, (*bv)->bv_val, len ) != len ) |
if ( (unsigned long) ber_read( ber, (*bv)->bv_val, len ) != len ) |
return( LBER_DEFAULT ); |
return( LBER_DEFAULT ); |
((*bv)->bv_val)[len] = '\0'; |
((*bv)->bv_val)[len] = '\0'; |
(*bv)->bv_len = len; |
(*bv)->bv_len = len; |
Line 322 ber_get_bitstringa( BerElement *ber, cha
|
Line 296 ber_get_bitstringa( BerElement *ber, cha
|
if ( ber_read( ber, (char *)&unusedbits, 1 ) != 1 ) |
if ( ber_read( ber, (char *)&unusedbits, 1 ) != 1 ) |
return( LBER_DEFAULT ); |
return( LBER_DEFAULT ); |
|
|
if ( ber_read( ber, *buf, datalen ) != datalen ) |
if ( (unsigned long) ber_read( ber, *buf, datalen ) != datalen ) |
return( LBER_DEFAULT ); |
return( LBER_DEFAULT ); |
|
|
*blen = datalen * 8 - unusedbits; |
*blen = datalen * 8 - unusedbits; |
Line 366 ber_first_element( BerElement *ber, unsi
|
Line 340 ber_first_element( BerElement *ber, unsi
|
*last = ber->ber_ptr + *len; |
*last = ber->ber_ptr + *len; |
|
|
if ( *last == ber->ber_ptr ) { |
if ( *last == ber->ber_ptr ) { |
|
#ifdef LBER_END_SEQORSET |
|
return( LBER_END_SEQORSET ); |
|
#else |
return( LBER_DEFAULT ); |
return( LBER_DEFAULT ); |
|
#endif |
} |
} |
|
|
return( ber_peek_tag( ber, len ) ); |
return( ber_peek_tag( ber, len ) ); |
Line 376 unsigned long
|
Line 354 unsigned long
|
ber_next_element( BerElement *ber, unsigned long *len, char *last ) |
ber_next_element( BerElement *ber, unsigned long *len, char *last ) |
{ |
{ |
if ( ber->ber_ptr == last ) { |
if ( ber->ber_ptr == last ) { |
|
#ifdef LBER_END_SEQORSET |
|
return( LBER_END_SEQORSET ); |
|
#else |
return( LBER_DEFAULT ); |
return( LBER_DEFAULT ); |
|
#endif |
} |
} |
|
|
return( ber_peek_tag( ber, len ) ); |
return( ber_peek_tag( ber, len ) ); |
Line 384 ber_next_element( BerElement *ber, unsig
|
Line 366 ber_next_element( BerElement *ber, unsig
|
|
|
/* VARARGS */ |
/* VARARGS */ |
unsigned long |
unsigned long |
ber_scanf( |
ber_scanf |
#if defined( MACOS ) || defined( BC31 ) || defined( _WIN32 ) |
#if HAVE_STDARG |
BerElement *ber, char *fmt, ... ) |
( BerElement *ber, char *fmt, ... ) |
#else |
#else |
va_alist ) |
( va_alist ) |
va_dcl |
va_dcl |
#endif |
#endif |
{ |
{ |
va_list ap; |
va_list ap; |
#if !defined( MACOS ) && !defined( BC31 ) && !defined( _WIN32 ) |
#ifndef HAVE_STDARG |
BerElement *ber; |
BerElement *ber; |
char *fmt; |
char *fmt; |
#endif |
#endif |
Line 401 va_dcl
|
Line 383 va_dcl
|
char *s, **ss, ***sss; |
char *s, **ss, ***sss; |
struct berval ***bv, **bvp, *bval; |
struct berval ***bv, **bvp, *bval; |
int *i, j; |
int *i, j; |
long *l, rc, tag; |
long *l; |
unsigned long len; |
unsigned long rc, tag, len; |
|
|
#if defined( MACOS ) || defined( BC31 ) || defined( _WIN32 ) |
#ifdef HAVE_STDARG |
va_start( ap, fmt ); |
va_start( ap, fmt ); |
#else |
#else |
va_start( ap ); |
va_start( ap ); |
Line 412 va_dcl
|
Line 394 va_dcl
|
fmt = va_arg( ap, char * ); |
fmt = va_arg( ap, char * ); |
#endif |
#endif |
|
|
#ifdef LDAP_DEBUG |
if ( ber->ber_debug ) { |
if ( lber_debug & 64 ) { |
lber_log_printf( LDAP_DEBUG_TRACE, ber->ber_debug, |
fprintf( stderr, "ber_scanf fmt (%s) ber:\n", fmt ); |
"ber_scanf fmt (%s) ber:\n", fmt ); |
ber_dump( ber, 1 ); |
lber_log_dump( LDAP_DEBUG_BER, ber->ber_debug, ber, 1 ); |
} |
} |
#endif |
|
|
|
for ( rc = 0; *fmt && rc != LBER_DEFAULT; fmt++ ) { |
for ( rc = 0; *fmt && rc != LBER_DEFAULT; fmt++ ) { |
switch ( *fmt ) { |
switch ( *fmt ) { |
Line 484 va_dcl
|
Line 465 va_dcl
|
*sss = NULL; |
*sss = NULL; |
j = 0; |
j = 0; |
for ( tag = ber_first_element( ber, &len, &last ); |
for ( tag = ber_first_element( ber, &len, &last ); |
tag != LBER_DEFAULT && rc != LBER_DEFAULT; |
tag != LBER_DEFAULT && |
tag = ber_next_element( ber, &len, last ) ) { |
#ifdef LDAP_END_SEQORSET |
|
tag != LBER_END_SEQORSET && |
|
#endif |
|
rc != LBER_DEFAULT; |
|
tag = ber_next_element( ber, &len, last ) ) |
|
{ |
if ( *sss == NULL ) { |
if ( *sss == NULL ) { |
*sss = (char **) malloc( |
*sss = (char **) malloc( |
2 * sizeof(char *) ); |
2 * sizeof(char *) ); |
Line 496 va_dcl
|
Line 482 va_dcl
|
rc = ber_get_stringa( ber, &((*sss)[j]) ); |
rc = ber_get_stringa( ber, &((*sss)[j]) ); |
j++; |
j++; |
} |
} |
|
#ifdef LDAP_END_SEQORSET |
|
if (rc != LBER_DEFAULT && |
|
tag != LBER_END_SEQORSET ) |
|
{ |
|
rc = LBER_DEFAULT; |
|
} |
|
#endif |
if ( j > 0 ) |
if ( j > 0 ) |
(*sss)[j] = NULL; |
(*sss)[j] = NULL; |
break; |
break; |
Line 505 va_dcl
|
Line 498 va_dcl
|
*bv = NULL; |
*bv = NULL; |
j = 0; |
j = 0; |
for ( tag = ber_first_element( ber, &len, &last ); |
for ( tag = ber_first_element( ber, &len, &last ); |
tag != LBER_DEFAULT && rc != LBER_DEFAULT; |
tag != LBER_DEFAULT && |
tag = ber_next_element( ber, &len, last ) ) { |
#ifdef LDAP_END_SEQORSET |
|
tag != LBER_END_SEQORSET && |
|
#endif |
|
rc != LBER_DEFAULT; |
|
tag = ber_next_element( ber, &len, last ) ) |
|
{ |
if ( *bv == NULL ) { |
if ( *bv == NULL ) { |
*bv = (struct berval **) malloc( |
*bv = (struct berval **) malloc( |
2 * sizeof(struct berval *) ); |
2 * sizeof(struct berval *) ); |
Line 517 va_dcl
|
Line 515 va_dcl
|
rc = ber_get_stringal( ber, &((*bv)[j]) ); |
rc = ber_get_stringal( ber, &((*bv)[j]) ); |
j++; |
j++; |
} |
} |
|
#ifdef LDAP_END_SEQORSET |
|
if (rc != LBER_DEFAULT && |
|
tag != LBER_END_SEQORSET ) |
|
{ |
|
rc = LBER_DEFAULT; |
|
} |
|
#endif |
if ( j > 0 ) |
if ( j > 0 ) |
(*bv)[j] = NULL; |
(*bv)[j] = NULL; |
break; |
break; |
Line 538 va_dcl
|
Line 543 va_dcl
|
break; |
break; |
|
|
default: |
default: |
#ifndef NO_USERINTERFACE |
if( ber->ber_debug ) { |
fprintf( stderr, "unknown fmt %c\n", *fmt ); |
lber_log_printf( LDAP_DEBUG_ANY, ber->ber_debug, |
#endif /* NO_USERINTERFACE */ |
"ber_scanf: unknown fmt %c\n", *fmt ); |
|
} |
rc = LBER_DEFAULT; |
rc = LBER_DEFAULT; |
break; |
break; |
} |
} |
Line 554 va_dcl
|
Line 560 va_dcl
|
void |
void |
ber_bvfree( struct berval *bv ) |
ber_bvfree( struct berval *bv ) |
{ |
{ |
|
#ifdef LBER_ASSERT |
|
assert(bv != NULL); /* bv damn better point to something */ |
|
#endif |
if ( bv->bv_val != NULL ) |
if ( bv->bv_val != NULL ) |
free( bv->bv_val ); |
free( bv->bv_val ); |
free( (char *) bv ); |
free( (char *) bv ); |
Line 564 ber_bvecfree( struct berval **bv )
|
Line 573 ber_bvecfree( struct berval **bv )
|
{ |
{ |
int i; |
int i; |
|
|
|
#ifdef LBER_ASSERT |
|
assert(bv != NULL); /* bv damn better point to something */ |
|
#endif |
for ( i = 0; bv[i] != NULL; i++ ) |
for ( i = 0; bv[i] != NULL; i++ ) |
ber_bvfree( bv[i] ); |
ber_bvfree( bv[i] ); |
free( (char *) bv ); |
free( (char *) bv ); |
Line 578 ber_bvdup( struct berval *bv )
|
Line 590 ber_bvdup( struct berval *bv )
|
== NULL ) { |
== NULL ) { |
return( NULL ); |
return( NULL ); |
} |
} |
|
|
|
if ( bv->bv_val == NULL ) { |
|
new->bv_val = NULL; |
|
new->bv_len = 0; |
|
return ( new ); |
|
} |
|
|
if ( (new->bv_val = (char *) malloc( bv->bv_len + 1 )) == NULL ) { |
if ( (new->bv_val = (char *) malloc( bv->bv_len + 1 )) == NULL ) { |
|
free( new ); |
return( NULL ); |
return( NULL ); |
} |
} |
|
|
SAFEMEMCPY( new->bv_val, bv->bv_val, (size_t) bv->bv_len ); |
SAFEMEMCPY( new->bv_val, bv->bv_val, (size_t) bv->bv_len ); |
new->bv_val[bv->bv_len] = '\0'; |
new->bv_val[bv->bv_len] = '\0'; |
new->bv_len = bv->bv_len; |
new->bv_len = bv->bv_len; |