X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=libraries%2Fliblber%2Fencode.c;h=85ad0367d8bb4feb8a63e33928031af06de7f89f;hb=879d3dbc5eb5cdbc45c12afca1bada8207039246;hp=434eedc3e545acc1c2b3c8ea448a7a611b3e77a2;hpb=1bcec8bf6a17a65396b2c947faed846d20428db9;p=openldap diff --git a/libraries/liblber/encode.c b/libraries/liblber/encode.c index 434eedc3e5..85ad0367d8 100644 --- a/libraries/liblber/encode.c +++ b/libraries/liblber/encode.c @@ -18,35 +18,44 @@ #include "portable.h" #include -#include + +#include #include #include #include +#undef LDAP_F_PRE +#define LDAP_F_PRE LDAP_F_EXPORT + #include "lber-int.h" -static int ber_put_len LDAP_P(( BerElement *ber, - unsigned long len, int nosos )); +static int ber_put_len LDAP_P(( + BerElement *ber, + ber_len_t len, + int nosos )); -static int ber_start_seqorset LDAP_P(( BerElement *ber, - unsigned long tag )); +static int ber_start_seqorset LDAP_P(( + BerElement *ber, + ber_tag_t tag )); static int ber_put_seqorset LDAP_P(( BerElement *ber )); -static int ber_put_int_or_enum LDAP_P(( BerElement *ber, - long num, unsigned long tag )); +static int ber_put_int_or_enum LDAP_P(( + BerElement *ber, + ber_int_t num, + ber_tag_t tag )); -static int -ber_calc_taglen( unsigned long tag ) +static ber_len_t +ber_calc_taglen( ber_tag_t tag ) { int i; - unsigned long mask; + ber_tag_t mask; /* find the first non-all-zero byte in the tag */ - for ( i = sizeof(long) - 1; i > 0; i-- ) { - mask = (0xffUL << (i * 8)); + for ( i = sizeof(ber_tag_t) - 1; i > 0; i-- ) { + mask = ((ber_tag_t)0xffU << (i * 8)); /* not all zero */ if ( tag & mask ) break; @@ -56,31 +65,38 @@ ber_calc_taglen( unsigned long tag ) } static int -ber_put_tag( BerElement *ber, unsigned long tag, int nosos ) +ber_put_tag( + BerElement *ber, + ber_tag_t tag, + int nosos ) { - int taglen; - unsigned long ntag; + int rc; + ber_len_t taglen; + ber_tag_t ntag; assert( ber != NULL ); assert( BER_VALID( ber ) ); taglen = ber_calc_taglen( tag ); - ntag = AC_HTONL( tag ); + ntag = LBER_TAG_HTON( tag ); + + rc = ber_write( ber, + ((char *) &ntag) + sizeof(ber_tag_t) - taglen, + taglen, nosos ); - return( ber_write( ber, ((char *) &ntag) + sizeof(long) - taglen, - taglen, nosos ) ); + return rc; } -static int -ber_calc_lenlen( unsigned long len ) +static ber_len_t +ber_calc_lenlen( ber_len_t len ) { /* * short len if it's less than 128 - one byte giving the len, * with bit 8 0. */ - if ( len <= 0x7FUL ) + if ( len <= (ber_len_t) 0x7FU ) return( 1 ); /* @@ -88,23 +104,23 @@ ber_calc_lenlen( unsigned long len ) * length of the length, followed by the length itself. */ - if ( len <= 0xffUL ) + if ( len <= (ber_len_t) 0xffU ) return( 2 ); - if ( len <= 0xffffUL ) + if ( len <= (ber_len_t) 0xffffU ) return( 3 ); - if ( len <= 0xffffffUL ) + if ( len <= (ber_len_t) 0xffffffU ) return( 4 ); return( 5 ); } static int -ber_put_len( BerElement *ber, unsigned long len, int nosos ) +ber_put_len( BerElement *ber, ber_len_t len, int nosos ) { int i; char lenlen; - unsigned long mask; - unsigned long netlen; + ber_len_t mask; + ber_len_t netlen; assert( ber != NULL ); assert( BER_VALID( ber ) ); @@ -115,9 +131,8 @@ ber_put_len( BerElement *ber, unsigned long len, int nosos ) */ if ( len <= 127 ) { - netlen = AC_HTONL( len ); - return( ber_write( ber, (char *) &netlen + sizeof(long) - 1, - 1, nosos ) ); + char length_byte = (char) len; + return( ber_write( ber, &length_byte, 1, nosos ) ); } /* @@ -126,8 +141,8 @@ ber_put_len( BerElement *ber, unsigned long len, int nosos ) */ /* find the first non-all-zero byte */ - for ( i = sizeof(long) - 1; i > 0; i-- ) { - mask = (0xffUL << (i * 8)); + for ( i = sizeof(ber_len_t) - 1; i > 0; i-- ) { + mask = ((ber_len_t)0xffU << (i * 8)); /* not all zero */ if ( len & mask ) break; @@ -142,8 +157,8 @@ ber_put_len( BerElement *ber, unsigned long len, int nosos ) return( -1 ); /* write the length itself */ - netlen = AC_HTONL( len ); - if ( ber_write( ber, (char *) &netlen + (sizeof(long) - i), i, nosos ) + netlen = LBER_LEN_HTON( len ); + if ( ber_write( ber, (char *) &netlen + (sizeof(ber_len_t) - i), i, nosos ) != i ) return( -1 ); @@ -151,31 +166,35 @@ ber_put_len( BerElement *ber, unsigned long len, int nosos ) } static int -ber_put_int_or_enum( BerElement *ber, long num, unsigned long tag ) +ber_put_int_or_enum( + BerElement *ber, + ber_int_t num, + ber_tag_t tag ) { - int i, sign, taglen; - int len, lenlen; - long netnum, mask; + int i, sign; + ber_len_t len, lenlen, taglen; + ber_uint_t unum, netnum, mask; assert( ber != NULL ); assert( BER_VALID( ber ) ); sign = (num < 0); + unum = num; /* Bit fiddling should be done with unsigned values */ /* * high bit is set - look for first non-all-one byte * high bit is clear - look for first non-all-zero byte */ - for ( i = sizeof(long) - 1; i > 0; i-- ) { - mask = (0xffUL << (i * 8)); + for ( i = sizeof(ber_int_t) - 1; i > 0; i-- ) { + mask = ((ber_uint_t)0xffU << (i * 8)); if ( sign ) { /* not all ones */ - if ( (num & mask) != mask ) + if ( (unum & mask) != mask ) break; } else { /* not all zero */ - if ( num & mask ) + if ( unum & mask ) break; } } @@ -184,7 +203,7 @@ ber_put_int_or_enum( BerElement *ber, long num, unsigned long tag ) * we now have the "leading byte". if the high bit on this * byte matches the sign bit, we need to "back up" a byte. */ - mask = (num & (0x80UL << (i * 8))); + mask = (unum & ((ber_uint_t)0x80U << (i * 8))); if ( (mask && !sign) || (sign && !mask) ) i++; @@ -196,8 +215,8 @@ ber_put_int_or_enum( BerElement *ber, long num, unsigned long tag ) if ( (lenlen = ber_put_len( ber, len, 0 )) == -1 ) return( -1 ); i++; - netnum = AC_HTONL( num ); - if ( ber_write( ber, (char *) &netnum + (sizeof(long) - i), i, 0 ) + netnum = LBER_INT_HTON( unum ); + if ( ber_write( ber, (char *) &netnum + (sizeof(ber_int_t) - i), i, 0 ) != i ) return( -1 ); @@ -206,7 +225,10 @@ ber_put_int_or_enum( BerElement *ber, long num, unsigned long tag ) } int -ber_put_enum( BerElement *ber, long num, unsigned long tag ) +ber_put_enum( + BerElement *ber, + ber_int_t num, + ber_tag_t tag ) { assert( ber != NULL ); assert( BER_VALID( ber ) ); @@ -218,7 +240,10 @@ ber_put_enum( BerElement *ber, long num, unsigned long tag ) } int -ber_put_int( BerElement *ber, long num, unsigned long tag ) +ber_put_int( + BerElement *ber, + ber_int_t num, + ber_tag_t tag ) { assert( ber != NULL ); assert( BER_VALID( ber ) ); @@ -233,10 +258,11 @@ int ber_put_ostring( BerElement *ber, LDAP_CONST char *str, - unsigned long len, - unsigned long tag ) + ber_len_t len, + ber_tag_t tag ) { - int taglen, lenlen, rc; + ber_len_t taglen, lenlen; + int rc; #ifdef STR_TRANSLATION int free_str; #endif /* STR_TRANSLATION */ @@ -266,7 +292,7 @@ ber_put_ostring( #endif /* STR_TRANSLATION */ if ( (lenlen = ber_put_len( ber, len, 0 )) == -1 || - (unsigned long) ber_write( ber, str, len, 0 ) != len ) { + (ber_len_t) ber_write( ber, str, len, 0 ) != len ) { rc = -1; } else { /* return length of tag + length + contents */ @@ -281,19 +307,18 @@ ber_put_ostring( return( rc ); } + int ber_put_berval( BerElement *ber, LDAP_CONST struct berval *bv, - unsigned long tag ) + ber_tag_t tag ) { assert( ber != NULL ); - assert( bv != NULL ); - assert( BER_VALID( ber ) ); - if( bv == NULL ) { - return -1; + if( bv == NULL || bv->bv_len == 0 ) { + return ber_put_ostring( ber, "", (ber_len_t) 0, tag ); } return ber_put_ostring( ber, bv->bv_val, bv->bv_len, tag ); @@ -303,7 +328,7 @@ int ber_put_string( BerElement *ber, LDAP_CONST char *str, - unsigned long tag ) + ber_tag_t tag ) { assert( ber != NULL ); assert( str != NULL ); @@ -317,10 +342,10 @@ int ber_put_bitstring( BerElement *ber, LDAP_CONST char *str, - unsigned long blen /* in bits */, - unsigned long tag ) + ber_len_t blen /* in bits */, + ber_tag_t tag ) { - int taglen, lenlen, len; + ber_len_t taglen, lenlen, len; unsigned char unusedbits; assert( ber != NULL ); @@ -342,7 +367,7 @@ ber_put_bitstring( if ( ber_write( ber, (char *)&unusedbits, 1, 0 ) != 1 ) return( -1 ); - if ( ber_write( ber, str, len, 0 ) != len ) + if ( (ber_len_t) ber_write( ber, str, len, 0 ) != len ) return( -1 ); /* return length of tag + length + unused bit count + contents */ @@ -350,9 +375,9 @@ ber_put_bitstring( } int -ber_put_null( BerElement *ber, unsigned long tag ) +ber_put_null( BerElement *ber, ber_tag_t tag ) { - int taglen; + ber_len_t taglen; assert( ber != NULL ); assert( BER_VALID( ber ) ); @@ -370,10 +395,13 @@ ber_put_null( BerElement *ber, unsigned long tag ) } int -ber_put_boolean( BerElement *ber, int boolval, unsigned long tag ) +ber_put_boolean( + BerElement *ber, + ber_int_t boolval, + ber_tag_t tag ) { - int taglen; - unsigned char trueval = 0xffU; + ber_len_t taglen; + unsigned char trueval = 0xFFU; unsigned char falseval = 0x00U; assert( ber != NULL ); @@ -398,7 +426,9 @@ ber_put_boolean( BerElement *ber, int boolval, unsigned long tag ) #define FOUR_BYTE_LEN 5 static int -ber_start_seqorset( BerElement *ber, unsigned long tag ) +ber_start_seqorset( + BerElement *ber, + ber_tag_t tag ) { Seqorset *new; @@ -407,11 +437,11 @@ ber_start_seqorset( BerElement *ber, unsigned long tag ) new = (Seqorset *) LBER_CALLOC( 1, sizeof(Seqorset) ); - if ( new == NULLSEQORSET ) + if ( new == NULL ) return( -1 ); new->sos_ber = ber; - if ( ber->ber_sos == NULLSEQORSET ) + if ( ber->ber_sos == NULL ) new->sos_first = ber->ber_ptr; else new->sos_first = ber->ber_sos->sos_ptr; @@ -427,7 +457,7 @@ ber_start_seqorset( BerElement *ber, unsigned long tag ) } int -ber_start_seq( BerElement *ber, unsigned long tag ) +ber_start_seq( BerElement *ber, ber_tag_t tag ) { assert( ber != NULL ); assert( BER_VALID( ber ) ); @@ -439,7 +469,7 @@ ber_start_seq( BerElement *ber, unsigned long tag ) } int -ber_start_set( BerElement *ber, unsigned long tag ) +ber_start_set( BerElement *ber, ber_tag_t tag ) { assert( ber != NULL ); assert( BER_VALID( ber ) ); @@ -453,8 +483,8 @@ ber_start_set( BerElement *ber, unsigned long tag ) static int ber_put_seqorset( BerElement *ber ) { - unsigned long len, netlen; - int taglen, lenlen; + ber_len_t len, netlen; + ber_len_t taglen, lenlen; unsigned char ltag = 0x80U + FOUR_BYTE_LEN - 1; Seqorset *next; Seqorset **sos = &ber->ber_sos; @@ -471,8 +501,8 @@ ber_put_seqorset( BerElement *ber ) */ len = (*sos)->sos_clen; - netlen = AC_HTONL( len ); - if ( sizeof(long) > 4 && len > 0xffffffffUL ) + netlen = LBER_LEN_HTON( len ); + if ( sizeof(ber_len_t) > 4 && len > 0xffffffffUL ) return( -1 ); if ( ber->ber_options & LBER_USE_DER ) { @@ -481,7 +511,7 @@ ber_put_seqorset( BerElement *ber ) lenlen = FOUR_BYTE_LEN; } - if ( (next = (*sos)->sos_next) == NULLSEQORSET ) { + if ( (next = (*sos)->sos_next) == NULL ) { /* write the tag */ if ( (taglen = ber_put_tag( ber, (*sos)->sos_tag, 1 )) == -1 ) return( -1 ); @@ -508,7 +538,7 @@ ber_put_seqorset( BerElement *ber ) return( -1 ); /* the length itself */ - if ( ber_write( ber, (char *) &netlen + sizeof(long) + if ( ber_write( ber, (char *) (&netlen + 1) - (FOUR_BYTE_LEN - 1), FOUR_BYTE_LEN - 1, 1 ) != FOUR_BYTE_LEN - 1 ) return( -1 ); @@ -516,18 +546,18 @@ ber_put_seqorset( BerElement *ber ) /* The ber_ptr is at the set/seq start - move it to the end */ (*sos)->sos_ber->ber_ptr += len; } else { - unsigned long ntag; + ber_tag_t ntag; /* the tag */ taglen = ber_calc_taglen( (*sos)->sos_tag ); - ntag = AC_HTONL( (*sos)->sos_tag ); + ntag = LBER_TAG_HTON( (*sos)->sos_tag ); SAFEMEMCPY( (*sos)->sos_first, (char *) &ntag + - sizeof(long) - taglen, taglen ); + sizeof(ber_tag_t) - taglen, taglen ); if ( ber->ber_options & LBER_USE_DER ) { ltag = (lenlen == 1) ? (unsigned char) len - : (unsigned char) (0x80UL + (lenlen - 1)); + : (unsigned char) (0x80U + (lenlen - 1)); } /* one byte of length length */ @@ -537,7 +567,7 @@ ber_put_seqorset( BerElement *ber ) if (lenlen > 1) { /* Write the length itself */ SAFEMEMCPY( (*sos)->sos_first + 2, - (char *)&netlen + sizeof(unsigned long) - + (char *)&netlen + sizeof(ber_len_t) - (lenlen - 1), lenlen - 1 ); } @@ -554,7 +584,7 @@ ber_put_seqorset( BerElement *ber ) } else { /* the length itself */ SAFEMEMCPY( (*sos)->sos_first + taglen + 1, - (char *) &netlen + sizeof(long) - + (char *) &netlen + sizeof(ber_len_t) - (FOUR_BYTE_LEN - 1), FOUR_BYTE_LEN - 1 ); } @@ -589,39 +619,22 @@ ber_put_set( BerElement *ber ) /* VARARGS */ int -ber_printf -#ifdef HAVE_STDARG - ( BerElement *ber, - LDAP_CONST char *fmt, - ... ) -#else - ( va_alist ) -va_dcl -#endif +ber_printf( BerElement *ber, LDAP_CONST char *fmt, ... ) { va_list ap; -#ifndef HAVE_STDARG - BerElement *ber; - char *fmt; -#endif char *s, **ss; struct berval *bv, **bvp; - int rc, i; - unsigned long len; - -#ifdef HAVE_STDARG - va_start( ap, fmt ); -#else - va_start( ap ); - ber = va_arg( ap, BerElement * ); - fmt = va_arg( ap, char * ); -#endif + int rc; + ber_int_t i; + ber_len_t len; assert( ber != NULL ); assert( fmt != NULL ); assert( BER_VALID( ber ) ); + va_start( ap, fmt ); + for ( rc = 0; *fmt && rc != -1; fmt++ ) { switch ( *fmt ) { case '!': { /* hook */ @@ -635,17 +648,17 @@ va_dcl } break; case 'b': /* boolean */ - i = va_arg( ap, int ); + i = va_arg( ap, ber_int_t ); rc = ber_put_boolean( ber, i, ber->ber_tag ); break; case 'i': /* int */ - i = va_arg( ap, int ); + i = va_arg( ap, ber_int_t ); rc = ber_put_int( ber, i, ber->ber_tag ); break; case 'e': /* enumeration */ - i = va_arg( ap, int ); + i = va_arg( ap, ber_int_t ); rc = ber_put_enum( ber, i, ber->ber_tag ); break; @@ -655,7 +668,7 @@ va_dcl case 'o': /* octet string (non-null terminated) */ s = va_arg( ap, char * ); - len = va_arg( ap, int ); + len = va_arg( ap, ber_len_t ); rc = ber_put_ostring( ber, s, len, ber->ber_tag ); break; @@ -677,7 +690,7 @@ va_dcl break; case 't': /* tag for the next element */ - ber->ber_tag = va_arg( ap, unsigned long ); + ber->ber_tag = va_arg( ap, ber_tag_t ); ber->ber_usertag = 1; break; @@ -695,8 +708,8 @@ va_dcl if ( (bvp = va_arg( ap, struct berval ** )) == NULL ) break; for ( i = 0; bvp[i] != NULL; i++ ) { - if ( (rc = ber_put_ostring( ber, bvp[i]->bv_val, - bvp[i]->bv_len, ber->ber_tag )) == -1 ) + if ( (rc = ber_put_berval( ber, bvp[i], + ber->ber_tag )) == -1 ) break; } break;