/* encode.c - ber output encoding routines */
/* $OpenLDAP$ */
/*
- * Copyright 1998-1999 The OpenLDAP Foundation, All Rights Reserved.
+ * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved.
* COPYING RESTRICTIONS APPLY, see COPYRIGHT file
*/
/* Portions
#include <ac/socket.h>
#include <ac/string.h>
-#undef LDAP_F_PRE
-#define LDAP_F_PRE LDAP_F_EXPORT
-
#include "lber-int.h"
static int ber_put_len LDAP_P((
ber_len_t taglen;
ber_len_t i;
unsigned char nettag[sizeof(ber_tag_t)];
- ber_tag_t xtag;
assert( ber != NULL );
assert( BER_VALID( ber ) );
taglen = ber_calc_taglen( tag );
for( i=0; i<taglen; i++ ) {
- nettag[(sizeof(ber_tag_t)-1) - i] = tag & 0xffU;
+ nettag[(sizeof(ber_tag_t)-1) - i] = (unsigned char)(tag & 0xffU);
tag >>= 8;
}
char lenlen;
ber_len_t mask;
unsigned char netlen[sizeof(ber_len_t)];
- ber_len_t xlen;
assert( ber != NULL );
assert( BER_VALID( ber ) );
return( -1 );
for( j=0; j<i; j++) {
- netlen[(sizeof(ber_len_t)-1) - j] = len & 0xffU;
+ netlen[(sizeof(ber_len_t)-1) - j] = (unsigned char)(len & 0xffU);
len >>= 8;
}
int rc;
int i, j, sign;
ber_len_t len, lenlen, taglen;
- ber_uint_t unum, xnum, mask;
+ ber_uint_t unum, mask;
unsigned char netnum[sizeof(ber_uint_t)];
assert( ber != NULL );
i++;
for( j=0; j<i; j++ ) {
- netnum[(sizeof(ber_int_t)-1) - j] = unum & 0xffU;
+ netnum[(sizeof(ber_int_t)-1) - j] = (unsigned char)(unum & 0xffU);
unum >>= 8;
}
#ifdef STR_TRANSLATION
if ( len > 0 && ( ber->ber_options & LBER_TRANSLATE_STRINGS ) != 0 &&
ber->ber_encode_translate_proc ) {
- if ( (*(ber->ber_encode_translate_proc))( &str, &len, 0 )
- != 0 ) {
+ if ( (*(ber->ber_encode_translate_proc))( &str, &len, 0 ) != 0 ) {
return( -1 );
}
free_str = 1;
ber_tag_t tag )
{
ber_len_t taglen;
- unsigned char trueval = 0xFFU;
- unsigned char falseval = 0x00U;
+ unsigned char trueval = (unsigned char) -1;
+ unsigned char falseval = 0;
assert( ber != NULL );
assert( BER_VALID( ber ) );
static int
ber_put_seqorset( BerElement *ber )
{
- int rc, i;
+ int rc;
ber_len_t len;
unsigned char netlen[sizeof(ber_len_t)];
ber_len_t taglen, lenlen;
}
if( lenlen > 1 ) {
+ ber_len_t i;
for( i=0; i < lenlen-1; i++ ) {
- netlen[(sizeof(ber_len_t)-1) - i] = (len >> i*8) & 0xffU;
+ netlen[(sizeof(ber_len_t)-1) - i] =
+ (unsigned char)((len >> i*8) & 0xffU);
}
} else {
- netlen[sizeof(ber_len_t)-1] = len & 0x7fU;
+ netlen[sizeof(ber_len_t)-1] = (unsigned char)(len & 0x7fU);
}
if ( (next = (*sos)->sos_next) == NULL ) {
(*sos)->sos_ber->ber_ptr += len;
} else {
- int i;
+ ber_len_t i;
unsigned char nettag[sizeof(ber_tag_t)];
ber_tag_t tmptag = (*sos)->sos_tag;
+ if( ber->ber_sos->sos_ptr > ber->ber_end ) {
+ /* The sos_ptr exceeds the end of the BerElement
+ * this can happen, for example, when the sos_ptr
+ * is near the end and no data was written for the
+ * 'V'. We must realloc the BerElement to ensure
+ * we don't overwrite the buffer when writing
+ * the tag and length fields.
+ */
+ ber_len_t ext = ber->ber_sos->sos_ptr - ber->ber_end;
+
+ if( ber_realloc( ber, ext ) != 0 ) {
+ return -1;
+ }
+ }
+
/* the tag */
taglen = ber_calc_taglen( tmptag );
for( i = 0; i < taglen; i++ ) {
- nettag[(sizeof(ber_tag_t)-1) - i] = tmptag & 0xffU;
+ nettag[(sizeof(ber_tag_t)-1) - i] = (unsigned char)(tmptag & 0xffU);
tmptag >>= 8;
}