]> git.sur5r.net Git - openldap/blobdiff - libraries/liblber/encode.c
Move schema needed by slapd to core.schema so that only one file
[openldap] / libraries / liblber / encode.c
index 8d660eb457ea4fdcc6febc7b1c0cabbf32d6f13f..6ad945d6495682a73078918c22b7dfaac08d0206 100644 (file)
@@ -1,7 +1,7 @@
 /* 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
@@ -26,9 +26,6 @@
 #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((
@@ -75,7 +72,6 @@ ber_put_tag(
        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 ) );
@@ -83,7 +79,7 @@ ber_put_tag(
        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;
        }
 
@@ -128,7 +124,6 @@ ber_put_len( BerElement *ber, ber_len_t len, int nosos )
        char            lenlen;
        ber_len_t       mask;
        unsigned char netlen[sizeof(ber_len_t)];
-       ber_len_t       xlen;
 
        assert( ber != NULL );
        assert( BER_VALID( ber ) );
@@ -166,7 +161,7 @@ ber_put_len( BerElement *ber, ber_len_t len, int nosos )
                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;
        }
 
@@ -187,7 +182,7 @@ ber_put_int_or_enum(
        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 );
@@ -232,7 +227,7 @@ ber_put_int_or_enum(
        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;
        }
 
@@ -301,8 +296,7 @@ ber_put_ostring(
 #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;
@@ -421,8 +415,8 @@ ber_put_boolean(
        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 ) );
@@ -503,7 +497,7 @@ ber_start_set( BerElement *ber, ber_tag_t tag )
 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;
@@ -535,11 +529,13 @@ ber_put_seqorset( BerElement *ber )
        }
 
        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 ) {
@@ -581,15 +577,30 @@ ber_put_seqorset( BerElement *ber )
                (*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;
                }