version 1.101.2.6, 2008/02/11 23:24:11
|
version 1.111, 2007/08/24 19:58:20
|
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.101.2.5 2007/08/27 10:11:31 hyc Exp $ */ |
/* $OpenLDAP: pkg/ldap/libraries/liblber/decode.c,v 1.110 2007/07/23 10:57:23 hallvard Exp $ */ |
/* This work is part of OpenLDAP Software <http://www.openldap.org/>. |
/* This work is part of OpenLDAP Software <http://www.openldap.org/>. |
* |
* |
* Copyright 1998-2008 The OpenLDAP Foundation. |
* Copyright 1998-2007 The OpenLDAP Foundation. |
* All rights reserved. |
* All rights reserved. |
* |
* |
* Redistribution and use in source and binary forms, with or without |
* Redistribution and use in source and binary forms, with or without |
Line 45 static ber_len_t ber_getnint LDAP_P((
|
Line 45 static ber_len_t ber_getnint LDAP_P((
|
ber_int_t *num, |
ber_int_t *num, |
ber_len_t len )); |
ber_len_t len )); |
|
|
|
/* out->bv_len should be the buffer size on input */ |
|
int |
|
ber_decode_oid( BerValue *in, BerValue *out ) |
|
{ |
|
const unsigned char *der; |
|
unsigned long val; |
|
unsigned val1; |
|
ber_len_t i; |
|
char *ptr; |
|
|
|
assert( in != NULL ); |
|
assert( out != NULL ); |
|
|
|
/* need 4 chars/inbyte + \0 for input={7f 7f 7f...} */ |
|
if ( !out->bv_val || (out->bv_len+3)/4 <= in->bv_len ) |
|
return -1; |
|
|
|
ptr = NULL; |
|
der = (unsigned char *) in->bv_val; |
|
val = 0; |
|
for ( i=0; i < in->bv_len; i++ ) { |
|
val |= der[i] & 0x7f; |
|
if ( !( der[i] & 0x80 )) { |
|
if ( ptr == NULL ) { |
|
/* Initial "x.y": val=x*40+y, x<=2, y<40 if x=2 */ |
|
ptr = out->bv_val; |
|
val1 = (val < 80 ? val/40 : 2); |
|
val -= val1*40; |
|
ptr += sprintf( ptr, "%u", val1 ); |
|
} |
|
ptr += sprintf( ptr, ".%lu", val ); |
|
val = 0; |
|
} else if ( val - 1UL < LBER_OID_COMPONENT_MAX >> 7 ) { |
|
val <<= 7; |
|
} else { |
|
/* val would overflow, or is 0 from invalid initial 0x80 octet */ |
|
return -1; |
|
} |
|
} |
|
if ( ptr == NULL || val != 0 ) |
|
return -1; |
|
|
|
out->bv_len = ptr - out->bv_val; |
|
return 0; |
|
} |
|
|
/* return the tag - LBER_DEFAULT returned means trouble */ |
/* return the tag - LBER_DEFAULT returned means trouble */ |
ber_tag_t |
ber_tag_t |
ber_get_tag( BerElement *ber ) |
ber_get_tag( BerElement *ber ) |
Line 437 nomem:
|
Line 483 nomem:
|
} |
} |
|
|
ber_tag_t |
ber_tag_t |
ber_get_stringbv( BerElement *ber, struct berval *bv, int alloc ) |
ber_get_stringbv( BerElement *ber, struct berval *bv, int option ) |
{ |
{ |
ber_tag_t tag; |
ber_tag_t tag; |
|
|
Line 455 ber_get_stringbv( BerElement *ber, struc
|
Line 501 ber_get_stringbv( BerElement *ber, struc
|
return LBER_DEFAULT; |
return LBER_DEFAULT; |
} |
} |
|
|
if ( alloc ) { |
if ( option & LBER_BV_ALLOC ) { |
bv->bv_val = (char *) ber_memalloc_x( bv->bv_len + 1, |
bv->bv_val = (char *) ber_memalloc_x( bv->bv_len + 1, |
ber->ber_memctx ); |
ber->ber_memctx ); |
if ( bv->bv_val == NULL ) { |
if ( bv->bv_val == NULL ) { |
Line 474 ber_get_stringbv( BerElement *ber, struc
|
Line 520 ber_get_stringbv( BerElement *ber, struc
|
ber->ber_ptr += bv->bv_len; |
ber->ber_ptr += bv->bv_len; |
} |
} |
ber->ber_tag = *(unsigned char *)ber->ber_ptr; |
ber->ber_tag = *(unsigned char *)ber->ber_ptr; |
bv->bv_val[bv->bv_len] = '\0'; |
if ( !( option & LBER_BV_NOTERM )) |
|
bv->bv_val[bv->bv_len] = '\0'; |
|
|
return tag; |
return tag; |
} |
} |
|
|
#ifdef LDAP_NULL_IS_NULL |
|
ber_tag_t |
ber_tag_t |
ber_get_stringbv_null( BerElement *ber, struct berval *bv, int alloc ) |
ber_get_stringbv_null( BerElement *ber, struct berval *bv, int option ) |
{ |
{ |
ber_tag_t tag; |
ber_tag_t tag; |
|
|
Line 505 ber_get_stringbv_null( BerElement *ber,
|
Line 551 ber_get_stringbv_null( BerElement *ber,
|
return tag; |
return tag; |
} |
} |
|
|
if ( alloc ) { |
if ( option & LBER_BV_ALLOC ) { |
bv->bv_val = (char *) ber_memalloc_x( bv->bv_len + 1, |
bv->bv_val = (char *) ber_memalloc_x( bv->bv_len + 1, |
ber->ber_memctx ); |
ber->ber_memctx ); |
if ( bv->bv_val == NULL ) { |
if ( bv->bv_val == NULL ) { |
Line 524 ber_get_stringbv_null( BerElement *ber,
|
Line 570 ber_get_stringbv_null( BerElement *ber,
|
ber->ber_ptr += bv->bv_len; |
ber->ber_ptr += bv->bv_len; |
} |
} |
ber->ber_tag = *(unsigned char *)ber->ber_ptr; |
ber->ber_tag = *(unsigned char *)ber->ber_ptr; |
bv->bv_val[bv->bv_len] = '\0'; |
if ( !( option & LBER_BV_NOTERM )) |
|
bv->bv_val[bv->bv_len] = '\0'; |
|
|
return tag; |
return tag; |
} |
} |
#endif /* LDAP_NULL_IS_NULL */ |
|
|
|
ber_tag_t |
ber_tag_t |
ber_get_stringa( BerElement *ber, char **buf ) |
ber_get_stringa( BerElement *ber, char **buf ) |
Line 538 ber_get_stringa( BerElement *ber, char *
|
Line 584 ber_get_stringa( BerElement *ber, char *
|
|
|
assert( buf != NULL ); |
assert( buf != NULL ); |
|
|
tag = ber_get_stringbv( ber, &bv, 1 ); |
tag = ber_get_stringbv( ber, &bv, LBER_BV_ALLOC ); |
*buf = bv.bv_val; |
*buf = bv.bv_val; |
|
|
return tag; |
return tag; |
} |
} |
|
|
#ifdef LDAP_NULL_IS_NULL |
|
ber_tag_t |
ber_tag_t |
ber_get_stringa_null( BerElement *ber, char **buf ) |
ber_get_stringa_null( BerElement *ber, char **buf ) |
{ |
{ |
Line 553 ber_get_stringa_null( BerElement *ber, c
|
Line 598 ber_get_stringa_null( BerElement *ber, c
|
|
|
assert( buf != NULL ); |
assert( buf != NULL ); |
|
|
tag = ber_get_stringbv_null( ber, &bv, 1 ); |
tag = ber_get_stringbv_null( ber, &bv, LBER_BV_ALLOC ); |
*buf = bv.bv_val; |
*buf = bv.bv_val; |
|
|
return tag; |
return tag; |
} |
} |
#endif /* LDAP_NULL_IS_NULL */ |
|
|
|
ber_tag_t |
ber_tag_t |
ber_get_stringal( BerElement *ber, struct berval **bv ) |
ber_get_stringal( BerElement *ber, struct berval **bv ) |
Line 574 ber_get_stringal( BerElement *ber, struc
|
Line 618 ber_get_stringal( BerElement *ber, struc
|
return LBER_DEFAULT; |
return LBER_DEFAULT; |
} |
} |
|
|
tag = ber_get_stringbv( ber, *bv, 1 ); |
tag = ber_get_stringbv( ber, *bv, LBER_BV_ALLOC ); |
if ( tag == LBER_DEFAULT ) { |
if ( tag == LBER_DEFAULT ) { |
LBER_FREE( *bv ); |
LBER_FREE( *bv ); |
*bv = NULL; |
*bv = NULL; |
Line 759 ber_scanf ( BerElement *ber,
|
Line 803 ber_scanf ( BerElement *ber,
|
rc = ber_get_stringa( ber, ss ); |
rc = ber_get_stringa( ber, ss ); |
break; |
break; |
|
|
#ifdef LDAP_NULL_IS_NULL |
|
case 'A': /* octet string - allocate storage as needed, |
case 'A': /* octet string - allocate storage as needed, |
* but return NULL if len == 0 */ |
* but return NULL if len == 0 */ |
ss = va_arg( ap, char ** ); |
ss = va_arg( ap, char ** ); |
rc = ber_get_stringa_null( ber, ss ); |
rc = ber_get_stringa_null( ber, ss ); |
break; |
break; |
#endif /* LDAP_NULL_IS_NULL */ |
|
|
|
case 'b': /* boolean */ |
case 'b': /* boolean */ |
i = va_arg( ap, ber_int_t * ); |
i = va_arg( ap, ber_int_t * ); |
Line 817 ber_scanf ( BerElement *ber,
|
Line 859 ber_scanf ( BerElement *ber,
|
|
|
case 'o': /* octet string in a supplied berval */ |
case 'o': /* octet string in a supplied berval */ |
bval = va_arg( ap, struct berval * ); |
bval = va_arg( ap, struct berval * ); |
rc = ber_get_stringbv( ber, bval, 1 ); |
rc = ber_get_stringbv( ber, bval, LBER_BV_ALLOC ); |
break; |
break; |
|
|
case 'O': /* octet string - allocate & include length */ |
case 'O': /* octet string - allocate & include length */ |
Line 846 ber_scanf ( BerElement *ber,
|
Line 888 ber_scanf ( BerElement *ber,
|
bgbvr cookie = { ChArray }; |
bgbvr cookie = { ChArray }; |
cookie.ber = ber; |
cookie.ber = ber; |
cookie.res.c = va_arg( ap, char *** ); |
cookie.res.c = va_arg( ap, char *** ); |
cookie.alloc = 1; |
cookie.alloc = LBER_BV_ALLOC; |
rc = ber_get_stringbvl( &cookie, NULL ); |
rc = ber_get_stringbvl( &cookie, NULL ); |
break; |
break; |
} |
} |
Line 856 ber_scanf ( BerElement *ber,
|
Line 898 ber_scanf ( BerElement *ber,
|
bgbvr cookie = { BvVec }; |
bgbvr cookie = { BvVec }; |
cookie.ber = ber; |
cookie.ber = ber; |
cookie.res.bv = va_arg( ap, struct berval *** ); |
cookie.res.bv = va_arg( ap, struct berval *** ); |
cookie.alloc = 1; |
cookie.alloc = LBER_BV_ALLOC; |
rc = ber_get_stringbvl( &cookie, NULL ); |
rc = ber_get_stringbvl( &cookie, NULL ); |
break; |
break; |
} |
} |
Line 866 ber_scanf ( BerElement *ber,
|
Line 908 ber_scanf ( BerElement *ber,
|
bgbvr cookie = { BvArray }; |
bgbvr cookie = { BvArray }; |
cookie.ber = ber; |
cookie.ber = ber; |
cookie.res.ba = va_arg( ap, struct berval ** ); |
cookie.res.ba = va_arg( ap, struct berval ** ); |
cookie.alloc = 1; |
cookie.alloc = LBER_BV_ALLOC; |
rc = ber_get_stringbvl( &cookie, NULL ); |
rc = ber_get_stringbvl( &cookie, NULL ); |
break; |
break; |
} |
} |
Line 920 ber_scanf ( BerElement *ber,
|
Line 962 ber_scanf ( BerElement *ber,
|
} break; |
} break; |
|
|
case 'a': /* octet string - allocate storage as needed */ |
case 'a': /* octet string - allocate storage as needed */ |
#ifdef LDAP_NULL_IS_NULL |
|
case 'A': |
case 'A': |
#endif /* LDAP_NULL_IS_NULL */ |
|
ss = va_arg( ap, char ** ); |
ss = va_arg( ap, char ** ); |
if ( *ss ) { |
if ( *ss ) { |
LBER_FREE( *ss ); |
LBER_FREE( *ss ); |