version 1.120, 2009/07/29 20:10:45
|
version 1.121, 2009/07/29 20:38:19
|
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.119 2009/07/29 19:47:54 hallvard Exp $ */ |
/* $OpenLDAP: pkg/ldap/libraries/liblber/decode.c,v 1.120 2009/07/29 20:10:45 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-2009 The OpenLDAP Foundation. |
* Copyright 1998-2009 The OpenLDAP Foundation. |
Line 686 ber_scanf ( BerElement *ber,
|
Line 686 ber_scanf ( BerElement *ber,
|
{ |
{ |
va_list ap; |
va_list ap; |
LDAP_CONST char *fmt_reset; |
LDAP_CONST char *fmt_reset; |
char *s, **ss; |
char *s, **ss, ***sss; |
struct berval **bvp, *bval; |
struct berval *bval, **bvp, ***bvpp; |
ber_int_t *i; |
ber_int_t *i; |
ber_len_t *l; |
ber_len_t *l; |
ber_tag_t *t; |
ber_tag_t *t; |
Line 893 ber_scanf ( BerElement *ber,
|
Line 893 ber_scanf ( BerElement *ber,
|
case 'a': /* octet string - allocate storage as needed */ |
case 'a': /* octet string - allocate storage as needed */ |
case 'A': |
case 'A': |
ss = va_arg( ap, char ** ); |
ss = va_arg( ap, char ** ); |
if ( *ss ) { |
ber_memfree_x( *ss, ber->ber_memctx ); |
ber_memfree_x( *ss, ber->ber_memctx ); |
*ss = NULL; |
*ss = NULL; |
|
} |
|
break; |
break; |
|
|
case 'b': /* boolean */ |
case 'b': /* boolean */ |
Line 906 ber_scanf ( BerElement *ber,
|
Line 904 ber_scanf ( BerElement *ber,
|
break; |
break; |
|
|
case 'l': /* length of next item */ |
case 'l': /* length of next item */ |
(void) va_arg( ap, ber_len_t * ); |
*(va_arg( ap, ber_len_t * )) = 0; |
|
break; |
|
|
|
case 'm': /* berval in-place */ |
|
bval = va_arg( ap, struct berval * ); |
|
BER_BVZERO( bval ); |
|
break; |
|
|
|
case 'M': /* BVoff array in-place */ |
|
bvp = va_arg( ap, struct berval ** ); |
|
ber_memfree_x( bvp, ber->ber_memctx ); |
|
*bvp = NULL; |
|
*(va_arg( ap, ber_len_t * )) = 0; |
|
(void) va_arg( ap, ber_len_t ); |
break; |
break; |
|
|
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 * ); |
if ( bval->bv_val != NULL ) { |
ber_memfree_x( bval->bv_val, ber->ber_memctx ); |
ber_memfree_x( bval->bv_val, ber->ber_memctx ); |
BER_BVZERO( bval ); |
bval->bv_val = NULL; |
|
} |
|
bval->bv_len = 0; |
|
break; |
break; |
|
|
case 'O': /* octet string - allocate & include length */ |
case 'O': /* octet string - allocate & include length */ |
bvp = va_arg( ap, struct berval ** ); |
bvp = va_arg( ap, struct berval ** ); |
if ( *bvp ) { |
ber_bvfree_x( *bvp, ber->ber_memctx ); |
ber_bvfree( *bvp ); |
*bvp = NULL; |
*bvp = NULL; |
|
} |
|
break; |
break; |
|
|
case 's': /* octet string - in a buffer */ |
case 's': /* octet string - in a buffer */ |
(void) va_arg( ap, char * ); |
(void) va_arg( ap, char * ); |
(void) va_arg( ap, ber_len_t * ); |
*(va_arg( ap, ber_len_t * )) = 0; |
break; |
break; |
|
|
case 't': /* tag of next item */ |
case 't': /* tag of next item */ |
Line 938 ber_scanf ( BerElement *ber,
|
Line 944 ber_scanf ( BerElement *ber,
|
|
|
case 'B': /* bit string - allocate storage as needed */ |
case 'B': /* bit string - allocate storage as needed */ |
ss = va_arg( ap, char ** ); |
ss = va_arg( ap, char ** ); |
if ( *ss ) { |
ber_memfree_x( *ss, ber->ber_memctx ); |
ber_memfree_x( *ss, ber->ber_memctx ); |
*ss = NULL; |
*ss = NULL; |
|
} |
|
*(va_arg( ap, ber_len_t * )) = 0; /* for length, in bits */ |
*(va_arg( ap, ber_len_t * )) = 0; /* for length, in bits */ |
break; |
break; |
|
|
case 'm': /* berval in-place */ |
|
case 'M': /* BVoff array in-place */ |
|
case 'n': /* null */ |
|
case 'v': /* sequence of strings */ |
case 'v': /* sequence of strings */ |
|
sss = va_arg( ap, char *** ); |
|
ber_memvfree_x( (void **) *sss, ber->ber_memctx ); |
|
*sss = NULL; |
|
break; |
|
|
case 'V': /* sequence of strings + lengths */ |
case 'V': /* sequence of strings + lengths */ |
|
bvpp = va_arg( ap, struct berval *** ); |
|
ber_bvecfree_x( *bvpp, ber->ber_memctx ); |
|
*bvpp = NULL; |
|
break; |
|
|
case 'W': /* BerVarray */ |
case 'W': /* BerVarray */ |
|
bvp = va_arg( ap, struct berval ** ); |
|
ber_bvarray_free_x( *bvp, ber->ber_memctx ); |
|
*bvp = NULL; |
|
break; |
|
|
|
case 'n': /* null */ |
case 'x': /* skip the next element - whatever it is */ |
case 'x': /* skip the next element - whatever it is */ |
case '{': /* begin sequence */ |
case '{': /* begin sequence */ |
case '[': /* begin set */ |
case '[': /* begin set */ |