diff options
| author | John Sonnenschein <johns@joyent.com> | 2012-07-30 18:55:21 +0000 | 
|---|---|---|
| committer | John Sonnenschein <johns@joyent.com> | 2012-07-30 18:55:21 +0000 | 
| commit | 3f12efe73c075bbfe7e254714e8fabfb50f86af0 (patch) | |
| tree | f429351c58a9955c46f03b8789bce1e152d32660 /usr/src/lib/libldap4/ber/decode.c | |
| parent | 2453263d59c2317dbe88d1c9e12893a32abd91b8 (diff) | |
| parent | 5ada8a07255938930de285f1d55b0ef0bdba90ff (diff) | |
| download | illumos-joyent-3f12efe73c075bbfe7e254714e8fabfb50f86af0.tar.gz | |
Illumos Sync
Merge github.com:illumos/illumos-gate
Conflicts:
	exception_lists/check_rtime
	usr/src/Makefile.master
	usr/src/Makefile.master.64
	usr/src/cmd/Makefile
	usr/src/cmd/lms/Makefile
	usr/src/cmd/lp/Makefile.lp
	usr/src/cmd/mdb/Makefile.mdb
	usr/src/cmd/mdb/common/mdb/mdb_cmds.c
	usr/src/cmd/mdb/common/mdb/mdb_print.c
	usr/src/cmd/mdb/common/mdb/mdb_print.h
	usr/src/cmd/mdb/common/mdb/mdb_tab.c
	usr/src/cmd/mdb/common/mdb/mdb_termio.c
	usr/src/cmd/mdb/common/mdb/mdb_whatis.c
	usr/src/cmd/svc/svccfg/svccfg_libscf.c
	usr/src/cmd/zpool/zpool_main.c
	usr/src/lib/Makefile
	usr/src/lib/libc/inc/thr_inlines.h
	usr/src/lib/libc/port/mapfile-vers
	usr/src/lib/libc/sparc/Makefile.com
	usr/src/lib/libc/sparc/crt/_rtld.c
	usr/src/lib/libc/sparcv9/Makefile.com
	usr/src/lib/libdtrace/common/dt_open.c
	usr/src/lib/libdtrace/common/dt_options.c
	usr/src/lib/libumem/common/envvar.c
	usr/src/lib/libumem/common/vmem_base.c
	usr/src/lib/libzfs/common/libzfs_impl.h
	usr/src/lib/libzfs/common/libzfs_iter.c
	usr/src/lib/libzfs/common/libzfs_util.c
	usr/src/lib/libzfs/common/mapfile-vers
	usr/src/lib/sun_fc/Makefile.com
	usr/src/lib/sun_fc/amd64/Makefile
	usr/src/lib/sun_fc/sparcv9/Makefile
	usr/src/man/man1m/Makefile
	usr/src/uts/common/Makefile.files
	usr/src/uts/common/dtrace/dtrace.c
	usr/src/uts/common/fs/zfs/arc.c
	usr/src/uts/common/fs/zfs/dmu.c
	usr/src/uts/common/fs/zfs/dsl_dataset.c
	usr/src/uts/common/fs/zfs/dsl_pool.c
	usr/src/uts/common/fs/zfs/sys/zio.h
	usr/src/uts/common/io/fibre-channel/fca/fcoei/fcoei_eth.c
	usr/src/uts/common/io/fibre-channel/fca/fcoei/fcoei_lv.c
	usr/src/uts/common/sys/dtrace.h
Diffstat (limited to 'usr/src/lib/libldap4/ber/decode.c')
| -rw-r--r-- | usr/src/lib/libldap4/ber/decode.c | 630 | 
1 files changed, 0 insertions, 630 deletions
| diff --git a/usr/src/lib/libldap4/ber/decode.c b/usr/src/lib/libldap4/ber/decode.c deleted file mode 100644 index 5117b3249a..0000000000 --- a/usr/src/lib/libldap4/ber/decode.c +++ /dev/null @@ -1,630 +0,0 @@ -/* - * Copyright 2004 Sun Microsystems, Inc.  All rights reserved. - * Use is subject to license terms. - */ - -#pragma ident	"%Z%%M%	%I%	%E% SMI" - -/* decode.c - ber input decoding routines */ -/* - * Copyright (c) 1990 Regents of the University of Michigan. - * All rights reserved. - * - * Redistribution and use in source and binary forms are permitted - * provided that this notice is preserved and that due credit is given - * to the University of Michigan at Ann Arbor. The name of the University - * may not be used to endorse or promote products derived from this - * software without specific prior written permission. This software - * is provided ``as is'' without express or implied warranty. - */ - -#include <stdio.h> -#ifdef MACOS -#include <stdlib.h> -#include <stdarg.h> -#include "macos.h" -#else /* MACOS */ -#if defined(NeXT) || defined(VMS) -#include <stdlib.h> -#else /* next || vms */ -#include <malloc.h> -#endif /* next || vms */ -#if defined(BC31) || defined(_WIN32) || defined(__sun) -#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" -#include "ldap.h" -#include "ldap-private.h" -#include "ldap-int.h" - -#ifdef LDAP_DEBUG -int	lber_debug; -#endif - -#ifdef NEEDPROTOS -static int ber_getnint( BerElement *ber, int *num, int len ); -#endif /* NEEDPROTOS */ - - -/* return the tag - LBER_DEFAULT returned means trouble */ -unsigned int -ber_get_tag( BerElement *ber ) -{ -	unsigned char	xbyte; -	unsigned int	tag; -	char		*tagp; -	int		i; - -	if ( ber_read( ber, (char *) &xbyte, 1 ) != 1 ) -		return( LBER_DEFAULT ); - -	if ( (xbyte & LBER_BIG_TAG_MASK) != LBER_BIG_TAG_MASK ) -		return( (unsigned int) xbyte ); - -	tagp = (char *) &tag; -	tagp[0] = xbyte; -	for ( i = 1; i < sizeof(int); i++ ) { -		if ( ber_read( ber, (char *) &xbyte, 1 ) != 1 ) -			return( LBER_DEFAULT ); - -		tagp[i] = xbyte; - -		if ( ! (xbyte & LBER_MORE_TAG_MASK) ) -			break; -	} - -	/* tag too big! */ -	if ( i == sizeof(int) ) -		return( LBER_DEFAULT ); - -	/* want leading, not trailing 0's */ -	return( tag >> (sizeof(int) - i - 1) ); -} - -unsigned int -ber_skip_tag( BerElement *ber, unsigned int *len ) -{ -	unsigned int	tag; -	unsigned char	lc; -	int		noctets, diff; -	unsigned int	netlen; - -	/* -	 * Any ber element looks like this: tag length contents. -	 * Assuming everything's ok, we return the tag byte (we -	 * can assume a single byte), and return the length in len. -	 * -	 * Assumptions: -	 *	1) definite lengths -	 *	2) primitive encodings used whenever possible -	 */ - -	/* -	 * First, we read the tag. -	 */ - -	if ( (tag = ber_get_tag( ber )) == LBER_DEFAULT ) -		return( LBER_DEFAULT ); - -	/* -	 * Next, read the length.  The first byte contains the length of -	 * the length.  If bit 8 is set, the length is the int form, -	 * otherwise it's the short form.  We don't allow a length that's -	 * greater than what we can hold in an unsigned int. -	 */ - -	*len = netlen = 0; -	if ( ber_read( ber, (char *) &lc, 1 ) != 1 ) -		return( LBER_DEFAULT ); -	if ( lc & 0x80 ) { -		noctets = (lc & 0x7f); -		if ( noctets > sizeof(unsigned int) ) -			return( LBER_DEFAULT ); -		diff = (int)sizeof(unsigned int) - noctets; -		if ( ber_read( ber, (char *) &netlen + diff, noctets ) -		    != noctets ) -			return( LBER_DEFAULT ); -		*len = LBER_NTOHL( netlen ); -	} else { -		*len = lc; -	} - -	return( tag ); -} - -unsigned int -ber_peek_tag( BerElement *ber, unsigned int *len ) -{ -	char		*save; -	unsigned int	tag; - -	save = ber->ber_ptr; -	tag = ber_skip_tag( ber, len ); -	ber->ber_ptr = save; - -	return( tag ); -} - -static int -ber_getnint( BerElement *ber, int *num, int len ) -{	/* New patch much cleaner, from David Wilson, Isode. Old code not kept*/ - 	int	i; - 	unsigned char buffer[sizeof(int)]; - 	int	value; -   -  	/* -  	 * The tag and length have already been stripped off.  We should -  	 * be sitting right before len bytes of 2's complement integer, - 	 * ready to be read straight into an int. -  	 */ -	 -  	if ( len > sizeof(int) ) -  		return( -1 ); -   - 	if ( ber_read( ber, (char *) buffer, len ) != len ) -  		return( -1 ); -   - 	/* This sets the required sign extension */ - 	value = 0x80 & buffer[0] ? (-1) : 0; -  - 	for ( i = 0; i < len; i++ ) - 	    value = (value << 8) | buffer[i]; - -	*num = value; -	 -  	return( len ); -} - -unsigned int -ber_get_int( BerElement *ber, int *num ) -{ -	unsigned int	tag, len; - -	if ( (tag = ber_skip_tag( ber, &len )) == LBER_DEFAULT ) -		return( LBER_DEFAULT ); - -	if ( ber_getnint( ber, num, (int)len ) != len ) -		return( LBER_DEFAULT ); -	else -		return( tag ); -} - -unsigned int -ber_get_stringb( BerElement *ber, char *buf, unsigned int *len ) -{ -	unsigned int	datalen, tag; -#ifdef STR_TRANSLATION -	char		*transbuf; -#endif /* STR_TRANSLATION */ - -	if ( (tag = ber_skip_tag( ber, &datalen )) == LBER_DEFAULT ) -		return( LBER_DEFAULT ); -	if ( datalen > (*len - 1) ) -		return( LBER_DEFAULT ); - -	if ( ber_read( ber, buf, datalen ) != datalen ) -		return( LBER_DEFAULT ); - -	buf[datalen] = '\0'; - -#ifdef STR_TRANSLATION -	if ( datalen > 0 && ( ber->ber_options & LBER_TRANSLATE_STRINGS ) != 0 -	    && ber->ber_decode_translate_proc != NULL ) { -		transbuf = buf; -		++datalen; -		if ( (*(ber->ber_decode_translate_proc))( &transbuf, &datalen, -		    0 ) != 0 ) { -			return( LBER_DEFAULT ); -		} -		if ( datalen > *len ) { -			free( transbuf ); -			return( LBER_DEFAULT ); -		} -		(void) SAFEMEMCPY( buf, transbuf, datalen ); -		free( transbuf ); -		--datalen; -	} -#endif /* STR_TRANSLATION */ - -	*len = datalen; -	return( tag ); -} - -unsigned int -ber_get_stringa( BerElement *ber, char **buf ) -{ -	unsigned int	datalen, tag; - -	if ( (tag = ber_skip_tag( ber, &datalen )) == LBER_DEFAULT ) -		return( LBER_DEFAULT ); - -	if ( (*buf = (char *) malloc( (size_t)datalen + 1 )) == NULL ) -		return( LBER_DEFAULT ); - -	if ( ber_read( ber, *buf, datalen ) != datalen ) -		return( LBER_DEFAULT ); -	(*buf)[datalen] = '\0'; - -#ifdef STR_TRANSLATION -	if ( datalen > 0 && ( ber->ber_options & LBER_TRANSLATE_STRINGS ) != 0 -	    && ber->ber_decode_translate_proc != NULL ) { -		++datalen; -		if ( (*(ber->ber_decode_translate_proc))( buf, &datalen, 1 ) -		    != 0 ) { -			free( *buf ); -			return( LBER_DEFAULT ); -		} -	} -#endif /* STR_TRANSLATION */ - -	return( tag ); -} - -unsigned int -ber_get_stringal( BerElement *ber, struct berval **bv ) -{ -	unsigned int	len, tag; - -	if ( (*bv = (struct berval *) malloc( sizeof(struct berval) )) == NULL ) -		return( LBER_DEFAULT ); - -	if ( (tag = ber_skip_tag( ber, &len )) == LBER_DEFAULT ) -		return( LBER_DEFAULT ); - -	if ( ((*bv)->bv_val = (char *) malloc( (size_t)len + 1 )) == NULL ) -		return( LBER_DEFAULT ); - -	if ( ber_read( ber, (*bv)->bv_val, len ) != len ) -		return( LBER_DEFAULT ); -	((*bv)->bv_val)[len] = '\0'; -	(*bv)->bv_len = len; - -#ifdef STR_TRANSLATION -	if ( len > 0 && ( ber->ber_options & LBER_TRANSLATE_STRINGS ) != 0 -	    && ber->ber_decode_translate_proc != NULL ) { -		++len; -		if ( (*(ber->ber_decode_translate_proc))( &((*bv)->bv_val), -		    &len, 1 ) != 0 ) { -			free( (*bv)->bv_val ); -			return( LBER_DEFAULT ); -		} -		(*bv)->bv_len = len - 1; -	} -#endif /* STR_TRANSLATION */ - -	return( tag ); -} - -unsigned int -ber_get_bitstringa( BerElement *ber, char **buf, unsigned int *blen ) -{ -	unsigned int	datalen, tag; -	unsigned char	unusedbits; - -	if ( (tag = ber_skip_tag( ber, &datalen )) == LBER_DEFAULT ) -		return( LBER_DEFAULT ); -	--datalen; - -	if ( (*buf = (char *) malloc( (size_t)datalen )) == NULL ) -		return( LBER_DEFAULT ); - -	if ( ber_read( ber, (char *)&unusedbits, 1 ) != 1 ) -		return( LBER_DEFAULT ); - -	if ( ber_read( ber, *buf, datalen ) != datalen ) -		return( LBER_DEFAULT ); - -	*blen = datalen * 8 - unusedbits; -	return( tag ); -} - -unsigned int -ber_get_null( BerElement *ber ) -{ -	unsigned int	len, tag; - -	if ( (tag = ber_skip_tag( ber, &len )) == LBER_DEFAULT ) -		return( LBER_DEFAULT ); - -	if ( len != 0 ) -		return( LBER_DEFAULT ); - -	return( tag ); -} - -unsigned int -ber_get_boolean( BerElement *ber, int *boolval ) -{ -	int	longbool; -	int	rc; - -	rc = ber_get_int( ber, &longbool ); -	*boolval = longbool; - -	return( rc ); -} - -unsigned int -ber_first_element( BerElement *ber, unsigned int *len, char **last ) -{ -	/* skip the sequence header, use the len to mark where to stop */ -	if ( ber_skip_tag( ber, len ) == LBER_DEFAULT ) { -		return( LBER_DEFAULT ); -	} - -	*last = ber->ber_ptr + *len; - -	if ( *last == ber->ber_ptr ) { -		return( LBER_DEFAULT ); -	} - -	return( ber_peek_tag( ber, len ) ); -} - -unsigned int -ber_next_element( BerElement *ber, unsigned int *len, char *last ) -{ -	if ( ber->ber_ptr == last ) { -		return( LBER_DEFAULT ); -	} - -	return( ber_peek_tag( ber, len ) ); -} - -/* VARARGS */ -unsigned int -ber_scanf( -#if defined(MACOS) || defined(BC31) || defined(_WIN32) || defined(__sun) -	BerElement *ber, char *fmt, ... ) -#else -	va_alist ) -va_dcl -#endif -{ -	va_list		ap; -#if !defined(MACOS) && !defined(BC31) && !defined(_WIN32) && !defined(__sun) -	BerElement	*ber; -	char		*fmt; -#endif -	char		*last; -	char		*s, **ss, ***sss; -	struct berval 	***bv, **bvp, *bval; -	int		*i, j; -	int		*l, rc, tag; -	unsigned int	len; - -#if defined(MACOS) || defined(BC31) || defined(_WIN32) || defined(__sun) -	va_start( ap, fmt ); -#else -	va_start( ap ); -	ber = va_arg( ap, BerElement * ); -	fmt = va_arg( ap, char * ); -#endif - -#ifdef LDAP_DEBUG -	if ( lber_debug & 64 ) { -		(void) fprintf( stderr, catgets(slapdcat, 1, 73, "ber_scanf fmt (%s) ber:\n"), fmt ); -		ber_dump( ber, 1 ); -	} -#endif - -	for ( rc = 0; *fmt && rc != LBER_DEFAULT; fmt++ ) { -		switch ( *fmt ) { -		case 'a':	/* octet string - allocate storage as needed */ -			ss = va_arg( ap, char ** ); -			rc = ber_get_stringa( ber, ss ); -			break; - -		case 'b':	/* boolean */ -			i = va_arg( ap, int * ); -			rc = ber_get_boolean( ber, i ); -			break; - -		case 'e':	/* enumerated */ -		case 'i':	/* int */ -			l = va_arg( ap, int * ); -			rc = ber_get_int( ber, l ); -			break; - -		case 'l':	/* length of next item */ -			l = va_arg( ap, int * ); -			rc = ber_peek_tag( ber, (unsigned int *)l ); -			break; - -		case 'n':	/* null */ -			rc = ber_get_null( ber ); -			break; - -		case 's':	/* octet string - in a buffer */ -			s = va_arg( ap, char * ); -			l = va_arg( ap, int * ); -			rc = ber_get_stringb( ber, s, (unsigned int *)l ); -			break; - -		case 'o':	/* octet string in a supplied berval */ -			bval = va_arg( ap, struct berval * ); -			ber_peek_tag( ber, &bval->bv_len ); -			rc = ber_get_stringa( ber, &bval->bv_val ); -			break; - -		case 'O':	/* octet string - allocate & include length */ -			bvp = va_arg( ap, struct berval ** ); -			rc = ber_get_stringal( ber, bvp ); -			break; - -		case 'B':	/* bit string - allocate storage as needed */ -			ss = va_arg( ap, char ** ); -			l = va_arg( ap, int * ); /* for length, in bits */ -			rc = ber_get_bitstringa( ber, ss, (unsigned int *)l ); -			break; - -		case 't':	/* tag of next item */ -			i = va_arg( ap, int * ); -			*i = rc = ber_peek_tag( ber, &len ); -			break; - -		case 'T':	/* skip tag of next item */ -			i = va_arg( ap, int * ); -			*i = rc = ber_skip_tag( ber, &len ); -			break; - -		case 'v':	/* sequence of strings */ -			sss = va_arg( ap, char *** ); -			*sss = NULL; -			j = 0; -			for ( tag = ber_first_element( ber, &len, &last ); -			    tag != LBER_DEFAULT && rc != LBER_DEFAULT; -			    tag = ber_next_element( ber, &len, last ) ) { -				if ( *sss == NULL ) { -					*sss = (char **) malloc( -					    2 * sizeof(char *) ); -				} else { -					*sss = (char **) realloc( *sss, -					    (j + 2) * sizeof(char *) ); -				} -				rc = ber_get_stringa( ber, &((*sss)[j]) ); -				j++; -			} -			if ( j > 0 ) -				(*sss)[j] = NULL; -			break; - -		case 'V':	/* sequence of strings + lengths */ -			bv = va_arg( ap, struct berval *** ); -			*bv = NULL; -			j = 0; -			for ( tag = ber_first_element( ber, &len, &last ); -			    tag != LBER_DEFAULT && rc != LBER_DEFAULT; -			    tag = ber_next_element( ber, &len, last ) ) { -				if ( *bv == NULL ) { -					*bv = (struct berval **) malloc( -					    2 * sizeof(struct berval *) ); -				} else { -					*bv = (struct berval **) realloc( *bv, -					    (j + 2) * sizeof(struct berval *) ); -				} -				rc = ber_get_stringal( ber, &((*bv)[j]) ); -				j++; -			} -			if ( j > 0 ) -				(*bv)[j] = NULL; -			break; - -		case 'x':	/* skip the next element - whatever it is */ -			if ( (rc = ber_skip_tag( ber, &len )) == LBER_DEFAULT ) -				break; -			ber->ber_ptr += len; -			break; - -		case '{':	/* begin sequence */ -		case '[':	/* begin set */ -			if ( *(fmt + 1) != 'v' && *(fmt + 1) != 'V' ) -				rc = ber_skip_tag( ber, &len ); -			break; - -		case '}':	/* end sequence */ -		case ']':	/* end set */ -			break; - -		default: -#ifndef NO_USERINTERFACE -			(void) fprintf( stderr, catgets(slapdcat, 1, 74, "unknown fmt %c\n"), *fmt ); -#endif /* NO_USERINTERFACE */ -			rc = (int) LBER_DEFAULT; -			break; -		} -	} - -	va_end( ap ); - -	return( rc ); -} - -void -ber_bvfree( struct berval *bv ) -{ -	if ( bv->bv_val != NULL ) -		free( bv->bv_val ); -	free( (char *) bv ); -} - -void -ber_bvecfree( struct berval **bv ) -{ -	int	i; - -	for ( i = 0; bv[i] != NULL; i++ ) -		ber_bvfree( bv[i] ); -	free( (char *) bv ); -} - -struct berval * -ber_bvdup( struct berval *bv ) -{ -	struct berval	*new; - -	if ( (new = (struct berval *) malloc( sizeof(struct berval) )) -	    == NULL ) { -		return( NULL ); -	} -	if ( (new->bv_val = (char *) malloc( bv->bv_len + 1 )) == NULL ) { -		free(new); -		return( NULL ); -	} -	SAFEMEMCPY( new->bv_val, bv->bv_val, (size_t) bv->bv_len ); -	new->bv_val[bv->bv_len] = '\0'; -	new->bv_len = bv->bv_len; - -	return( new ); -} - - -#ifdef STR_TRANSLATION -void -ber_set_string_translators( BerElement *ber, BERTranslateProc encode_proc, -	BERTranslateProc decode_proc ) -{ -    ber->ber_encode_translate_proc = encode_proc; -    ber->ber_decode_translate_proc = decode_proc; -} -#endif /* STR_TRANSLATION */ - -int ber_flatten(BerElement *ber, struct berval **bvPtr) -{ -	struct berval * bv; -	int len; - -	if ((ber == NULL) || (ber->ber_buf == NULL)) -		return (-1); - -	len = ber->ber_ptr - ber->ber_buf; - -	if ((bv = (struct berval *)malloc(sizeof(struct berval))) == NULL) -		return (-1); -	if ((bv->bv_val = (char *) malloc(len + 1)) == NULL) { -		free(bv); -		return (-1); -	} - -	SAFEMEMCPY(bv->bv_val, ber->ber_buf, (size_t)len); -	bv->bv_val[len] = '\0'; -	bv->bv_len = len; - -	*bvPtr = bv; -	return (0); -} | 
