Diff for /libraries/liblber/encode.c between versions 1.61 and 1.61.2.3

version 1.61, 2004/09/04 02:54:28 version 1.61.2.3, 2006/01/03 22:16:07
Line 1 Line 1
 /* encode.c - ber output encoding routines */  /* encode.c - ber output encoding routines */
 /* $OpenLDAP: pkg/ldap/libraries/liblber/encode.c,v 1.60 2004/06/30 20:28:15 kurt Exp $ */  /* $OpenLDAP: pkg/ldap/libraries/liblber/encode.c,v 1.61.2.2 2005/09/28 00:30:28 kurt Exp $ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.  /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *   *
  * Copyright 1998-2004 The OpenLDAP Foundation.   * Copyright 1998-2006 The OpenLDAP Foundation.
  * All rights reserved.   * All rights reserved.
  *   *
  * Redistribution and use in source and binary forms, with or without   * Redistribution and use in source and binary forms, with or without
Line 56  static int ber_put_int_or_enum LDAP_P(( Line 56  static int ber_put_int_or_enum LDAP_P((
         ber_int_t num,          ber_int_t num,
         ber_tag_t tag ));          ber_tag_t tag ));
   
   #define BER_TOP_BYTE(type)      (sizeof(type)-1)
   #define BER_TOP_MASK(type)      ((type)0xffU << (BER_TOP_BYTE(type)*8))
   
 static int  static int
 ber_calc_taglen( ber_tag_t tag )  ber_calc_taglen( ber_tag_t tag )
 {  {
         int     i;          int     i = BER_TOP_BYTE(ber_tag_t);
         ber_tag_t       mask;          ber_tag_t       mask = BER_TOP_MASK(ber_tag_t);
   
         /* find the first non-all-zero byte in the tag */          /* find the first non-all-zero byte in the tag */
         for ( i = sizeof(ber_tag_t) - 1; i > 0; i-- ) {          for ( ; i > 0; i-- ) {
                 mask = ((ber_tag_t)0xffU << (i * 8));  
                 /* not all zero */                  /* not all zero */
                 if ( tag & mask ) break;                  if ( tag & mask ) break;
                   mask >>= 8;
         }          }
   
         return i + 1;          return i + 1;
Line 80  ber_put_tag( Line 82  ber_put_tag(
         int nosos )          int nosos )
 {  {
         int rc;          int rc;
         int     taglen;          int taglen;
         int     i;          int     i;
         unsigned char nettag[sizeof(ber_tag_t)];          unsigned char nettag[sizeof(ber_tag_t)];
   
Line 89  ber_put_tag( Line 91  ber_put_tag(
   
         taglen = ber_calc_taglen( tag );          taglen = ber_calc_taglen( tag );
   
         for( i=0; i<taglen; i++ ) {          for( i=taglen-1; i>=0; i-- ) {
                 nettag[(sizeof(ber_tag_t)-1) - i] = (unsigned char)(tag & 0xffU);                  nettag[i] = (unsigned char)(tag & 0xffU);
                 tag >>= 8;                  tag >>= 8;
         }          }
   
         rc = ber_write( ber,          rc = ber_write( ber, (char *) nettag, taglen, nosos );
                 (char *) &nettag[sizeof(ber_tag_t) - taglen],  
             taglen, nosos );  
   
         return rc;          return rc;
 }  }
Line 151  ber_put_len( BerElement *ber, ber_len_t Line 151  ber_put_len( BerElement *ber, ber_len_t
          */           */
   
         /* find the first non-all-zero byte */          /* find the first non-all-zero byte */
         for ( i = sizeof(ber_len_t) - 1; i > 0; i-- ) {          i = BER_TOP_BYTE(ber_len_t);
                 mask = ((ber_len_t)0xffU << (i * 8));          mask = BER_TOP_MASK(ber_len_t);
           for ( ; i > 0; i-- ) {
                 /* not all zero */                  /* not all zero */
                 if ( len & mask ) break;                  if ( len & mask ) break;
                   mask >>= 8;
         }          }
         lenlen = (unsigned char) ++i;          lenlen = (unsigned char) ++i;
         if ( lenlen > 4 ) return -1;          if ( lenlen > 4 ) return -1;
Line 164  ber_put_len( BerElement *ber, ber_len_t Line 166  ber_put_len( BerElement *ber, ber_len_t
         /* write the length of the length */          /* write the length of the length */
         if ( ber_write( ber, &lenlen, 1, nosos ) != 1 ) return -1;          if ( ber_write( ber, &lenlen, 1, nosos ) != 1 ) return -1;
   
         for( j=0; j<i; j++) {          for( j=i-1; j>=0; j-- ) {
                 netlen[(sizeof(ber_len_t)-1) - j] = (unsigned char)(len & 0xffU);                  netlen[j] = (unsigned char)(len & 0xffU);
                 len >>= 8;                  len >>= 8;
         }          }
   
         /* write the length itself */          /* write the length itself */
         rc = ber_write( ber,          rc = ber_write( ber, (char *) netlen, i, nosos );
                 (char *) &netlen[sizeof(ber_len_t)-i],  
                 i, nosos );  
   
         return rc == i ?  i+1 : -1;          return rc == i ?  i+1 : -1;
 }  }
Line 199  ber_put_int_or_enum( Line 199  ber_put_int_or_enum(
          * high bit is set - look for first non-all-one byte           * high bit is set - look for first non-all-one byte
          * high bit is clear - look for first non-all-zero byte           * high bit is clear - look for first non-all-zero byte
          */           */
         for ( i = sizeof(ber_int_t) - 1; i > 0; i-- ) {          i = BER_TOP_BYTE(ber_int_t);
                 mask = ((ber_uint_t)0xffU << (i * 8));          mask = BER_TOP_MASK(ber_uint_t);
           for ( ; i > 0; i-- ) {
                 if ( sign ) {                  if ( sign ) {
                         /* not all ones */                          /* not all ones */
                         if ( (unum & mask) != mask ) break;                          if ( (unum & mask) != mask ) break;
Line 209  ber_put_int_or_enum( Line 209  ber_put_int_or_enum(
                         /* not all zero */                          /* not all zero */
                         if ( unum & mask ) break;                          if ( unum & mask ) break;
                 }                  }
                   mask >>= 8;
         }          }
   
         /*          /*
Line 231  ber_put_int_or_enum( Line 232  ber_put_int_or_enum(
         }          }
         i++;          i++;
   
         for( j=0; j<i; j++ ) {          for( j=i-1; j>=0; j-- ) {
                 netnum[(sizeof(ber_int_t)-1) - j] = (unsigned char)(unum & 0xffU);                  netnum[j] = (unsigned char)(unum & 0xffU);
                 unum >>= 8;                  unum >>= 8;
         }          }
   
         rc = ber_write( ber,          rc = ber_write( ber, (char *) netnum, i, 0 );
                 (char *) &netnum[sizeof(ber_int_t) - i],  
                 i, 0 );  
   
         /* length of tag + length + contents */          /* length of tag + length + contents */
         return rc == i ? taglen + lenlen + i : -1;          return rc == i ? taglen + lenlen + i : -1;
Line 536  ber_put_seqorset( BerElement *ber ) Line 535  ber_put_seqorset( BerElement *ber )
         }          }
   
         if( lenlen > 1 ) {          if( lenlen > 1 ) {
                 ber_len_t i;                  int i;
                 for( i=0; i < lenlen-1; i++ ) {                  ber_len_t j = len;
                         netlen[(sizeof(ber_len_t)-1) - i] =                   for( i=lenlen-2; i >= 0; i-- ) {
                                 (unsigned char)((len >> i*8) & 0xffU);                          netlen[i] = j & 0xffU;
                           j >>= 8;
                 }                  }
         } else {          } else {
                 netlen[sizeof(ber_len_t)-1] = (unsigned char)(len & 0x7fU);                  netlen[0] = (unsigned char)(len & 0x7fU);
         }          }
   
         if ( (next = (*sos)->sos_next) == NULL ) {          if ( (next = (*sos)->sos_next) == NULL ) {
Line 575  ber_put_seqorset( BerElement *ber ) Line 575  ber_put_seqorset( BerElement *ber )
                         }                          }
   
                         /* the length itself */                          /* the length itself */
                         rc  = ber_write( ber,                          rc  = ber_write( ber, (char *) netlen, FOUR_BYTE_LEN-1, 1 );
                                 (char *) &netlen[sizeof(ber_len_t) - (FOUR_BYTE_LEN-1)],  
                                 FOUR_BYTE_LEN-1, 1 );  
   
                         if( rc != FOUR_BYTE_LEN - 1 ) {                          if( rc != FOUR_BYTE_LEN - 1 ) {
                                 return -1;                                  return -1;
Line 609  ber_put_seqorset( BerElement *ber ) Line 607  ber_put_seqorset( BerElement *ber )
                 /* the tag */                  /* the tag */
                 taglen = ber_calc_taglen( tmptag );                  taglen = ber_calc_taglen( tmptag );
   
                 for( i = 0; i < taglen; i++ ) {                  for( i = taglen-1; i >= 0; i-- ) {
                         nettag[(sizeof(ber_tag_t)-1) - i] = (unsigned char)(tmptag & 0xffU);                          nettag[i] = (unsigned char)(tmptag & 0xffU);
                         tmptag >>= 8;                          tmptag >>= 8;
                 }                  }
   
                 AC_FMEMCPY( (*sos)->sos_first,                  AC_FMEMCPY( (*sos)->sos_first, nettag, taglen );
                         &nettag[sizeof(ber_tag_t) - taglen],  
                         taglen );  
   
                 if ( ber->ber_options & LBER_USE_DER ) {                  if ( ber->ber_options & LBER_USE_DER ) {
                         ltag = (lenlen == 1)                          ltag = (lenlen == 1)
Line 630  ber_put_seqorset( BerElement *ber ) Line 626  ber_put_seqorset( BerElement *ber )
                 if ( ber->ber_options & LBER_USE_DER ) {                  if ( ber->ber_options & LBER_USE_DER ) {
                         if (lenlen > 1) {                          if (lenlen > 1) {
                                 /* Write the length itself */                                  /* Write the length itself */
                                 AC_FMEMCPY( (*sos)->sos_first + 2,                                  AC_FMEMCPY( (*sos)->sos_first + 2, netlen, lenlen - 1 );
                                     &netlen[sizeof(ber_len_t) - (lenlen - 1)],  
                                         lenlen - 1 );  
                         }                          }
                         if (lenlen != FOUR_BYTE_LEN) {                          if (lenlen != FOUR_BYTE_LEN) {
                                 /*                                  /*
Line 647  ber_put_seqorset( BerElement *ber ) Line 641  ber_put_seqorset( BerElement *ber )
                 } else {                  } else {
                         /* the length itself */                          /* the length itself */
                         AC_FMEMCPY( (*sos)->sos_first + taglen + 1,                          AC_FMEMCPY( (*sos)->sos_first + taglen + 1,
                             &netlen[sizeof(ber_len_t) - (FOUR_BYTE_LEN - 1)],                              netlen, FOUR_BYTE_LEN - 1 );
                                 FOUR_BYTE_LEN - 1 );  
                 }                  }
   
                 next->sos_clen += (taglen + lenlen + len);                  next->sos_clen += (taglen + lenlen + len);

Removed from v.1.61  
changed lines
  Added in v.1.61.2.3


______________
© Copyright 1998-2020, OpenLDAP Foundation, info@OpenLDAP.org