/*
* 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 */
#include <stdlib.h>
#else /* next || vms */
#include <malloc.h>
#endif /* next || vms */
#include <stdarg.h>
#else /* BC31 || _WIN32 */
#include <varargs.h>
#endif /* BC31 || _WIN32 */
#ifdef PCNFS
#include <tklib.h>
#endif /* PCNFS */
#endif /* MACOS */
#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
#endif /* NEEDPROTOS */
/* return the tag - LBER_DEFAULT returned means trouble */
unsigned int
{
unsigned char xbyte;
unsigned int tag;
char *tagp;
int i;
return( LBER_DEFAULT );
return( (unsigned int) xbyte );
for ( i = 1; i < sizeof(int); i++ ) {
return( LBER_DEFAULT );
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
{
unsigned int tag;
unsigned char lc;
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.
*/
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.
*/
return( LBER_DEFAULT );
if ( lc & 0x80 ) {
if ( noctets > sizeof(unsigned int) )
return( LBER_DEFAULT );
!= noctets )
return( LBER_DEFAULT );
} else {
}
return( tag );
}
unsigned int
{
char *save;
unsigned int tag;
return( tag );
}
static int
{ /* 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 );
return( -1 );
/* This sets the required sign extension */
for ( i = 0; i < len; i++ )
return( len );
}
unsigned int
{
return( LBER_DEFAULT );
return( LBER_DEFAULT );
else
return( tag );
}
unsigned int
{
#ifdef STR_TRANSLATION
char *transbuf;
#endif /* STR_TRANSLATION */
return( LBER_DEFAULT );
return( LBER_DEFAULT );
return( LBER_DEFAULT );
#ifdef STR_TRANSLATION
++datalen;
0 ) != 0 ) {
return( LBER_DEFAULT );
}
return( LBER_DEFAULT );
}
--datalen;
}
#endif /* STR_TRANSLATION */
return( tag );
}
unsigned int
{
return( LBER_DEFAULT );
return( LBER_DEFAULT );
return( LBER_DEFAULT );
#ifdef STR_TRANSLATION
++datalen;
!= 0 ) {
return( LBER_DEFAULT );
}
}
#endif /* STR_TRANSLATION */
return( tag );
}
unsigned int
{
return( LBER_DEFAULT );
return( LBER_DEFAULT );
return( LBER_DEFAULT );
return( LBER_DEFAULT );
#ifdef STR_TRANSLATION
++len;
&len, 1 ) != 0 ) {
return( LBER_DEFAULT );
}
}
#endif /* STR_TRANSLATION */
return( tag );
}
unsigned int
{
unsigned char unusedbits;
return( LBER_DEFAULT );
--datalen;
return( LBER_DEFAULT );
return( LBER_DEFAULT );
return( LBER_DEFAULT );
return( tag );
}
unsigned int
{
return( LBER_DEFAULT );
if ( len != 0 )
return( LBER_DEFAULT );
return( tag );
}
unsigned int
{
int longbool;
int rc;
return( rc );
}
unsigned int
{
/* skip the sequence header, use the len to mark where to stop */
return( LBER_DEFAULT );
}
return( LBER_DEFAULT );
}
}
unsigned int
{
return( LBER_DEFAULT );
}
}
/* VARARGS */
unsigned int
#else
va_alist )
#endif
{
char *fmt;
#endif
char *last;
int *i, j;
unsigned int len;
#else
#endif
#ifdef LDAP_DEBUG
if ( lber_debug & 64 ) {
}
#endif
switch ( *fmt ) {
case 'a': /* octet string - allocate storage as needed */
break;
case 'b': /* boolean */
break;
case 'e': /* enumerated */
case 'i': /* int */
break;
case 'l': /* length of next item */
break;
case 'n': /* null */
break;
case 's': /* octet string - in a buffer */
break;
case 'o': /* octet string in a supplied berval */
break;
case 'O': /* octet string - allocate & include length */
break;
case 'B': /* bit string - allocate storage as needed */
break;
case 't': /* tag of next item */
break;
case 'T': /* skip tag of next item */
break;
case 'v': /* sequence of strings */
j = 0;
2 * sizeof(char *) );
} else {
(j + 2) * sizeof(char *) );
}
j++;
}
if ( j > 0 )
break;
case 'V': /* sequence of strings + lengths */
j = 0;
2 * sizeof(struct berval *) );
} else {
(j + 2) * sizeof(struct berval *) );
}
j++;
}
if ( j > 0 )
break;
case 'x': /* skip the next element - whatever it is */
break;
break;
case '{': /* begin sequence */
case '[': /* begin set */
break;
case '}': /* end sequence */
case ']': /* end set */
break;
default:
#ifndef NO_USERINTERFACE
#endif /* NO_USERINTERFACE */
rc = (int) LBER_DEFAULT;
break;
}
}
return( rc );
}
void
{
}
void
{
int i;
ber_bvfree( bv[i] );
}
struct berval *
{
== NULL ) {
return( NULL );
}
return( NULL );
}
return( new );
}
#ifdef STR_TRANSLATION
void
{
}
#endif /* STR_TRANSLATION */
{
int len;
return (-1);
return (-1);
return (-1);
}
return (0);
}