Diff for /libraries/liblber/decode.c between versions 1.105.2.11 and 1.126

version 1.105.2.11, 2010/04/13 20:22:53 version 1.126, 2009/08/07 17:26:11
Line 1 Line 1
 /* decode.c - ber input decoding routines */  /* decode.c - ber input decoding routines */
 /* $OpenLDAP: pkg/ldap/libraries/liblber/decode.c,v 1.105.2.10 2009/11/04 16:08:50 quanah Exp $ */  /* $OpenLDAP: pkg/ldap/libraries/liblber/decode.c,v 1.125 2009/08/07 17:15:26 hallvard 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-2010 The OpenLDAP Foundation.   * Copyright 1998-2009 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 219  ber_peek_element( const BerElement *ber, Line 219  ber_peek_element( const BerElement *ber,
   
 /* Move past next element, point *bv at it in-place, and return its tag.  /* Move past next element, point *bv at it in-place, and return its tag.
  * The caller may \0-terminate *bv, as next octet is saved in ber->ber_tag.   * The caller may \0-terminate *bv, as next octet is saved in ber->ber_tag.
  * Similar to ber_get_stringbv(ber, bv, LBER_BV_NOTERM) except on error.   * See ber_get_stringbv(ber, bv, LBER_BV_NOTERM) for an exported wrapper.
  */   */
 ber_tag_t  static ber_tag_t
 ber_skip_element( BerElement *ber, struct berval *bv )  ber_skip_element( BerElement *ber, struct berval *bv )
 {  {
         ber_tag_t tag = ber_peek_element( ber, bv );          ber_tag_t tag = ber_peek_element( ber, bv );
Line 345  enum bgbvc { ChArray, BvArray, BvVec, Bv Line 345  enum bgbvc { ChArray, BvArray, BvVec, Bv
  */   */
 typedef struct bgbvr {  typedef struct bgbvr {
         const enum bgbvc choice;          const enum bgbvc choice;
         const int option;       /* (ALLOC unless BvOff) | (STRING if ChArray) */          const int alloc;        /* choice == BvOff ? 0 : LBER_ALLOC */
         ber_len_t siz;          /* input array element size, output count */          ber_len_t siz;          /* input array element size, output count */
         ber_len_t off;          /* BvOff offset to the struct berval */          ber_len_t off;          /* BvOff offset to the struct berval */
         void *result;          void *result;
Line 418  ber_get_stringbvl( BerElement *ber, bgbv Line 418  ber_get_stringbvl( BerElement *ber, bgbv
   
         n = 0;          n = 0;
         do {          do {
                 tag = ber_get_stringbv( ber, &bv, b->option );                  tag = ber_get_stringbv( ber, &bv, b->alloc );
                 if ( tag == LBER_DEFAULT ) {                  if ( tag == LBER_DEFAULT ) {
                         goto failed;                          goto nomem;
                 }                  }
   
                 /* store my result */                  /* store my result */
Line 436  ber_get_stringbvl( BerElement *ber, bgbv Line 436  ber_get_stringbvl( BerElement *ber, bgbv
                                 ber->ber_memctx );                                  ber->ber_memctx );
                         if ( !bvp ) {                          if ( !bvp ) {
                                 ber_memfree_x( bv.bv_val, ber->ber_memctx );                                  ber_memfree_x( bv.bv_val, ber->ber_memctx );
                                 goto failed;                                  goto nomem;
                         }                          }
                         res.bv[n] = bvp;                          res.bv[n] = bvp;
                         *bvp = bv;                          *bvp = bv;
Line 449  ber_get_stringbvl( BerElement *ber, bgbv Line 449  ber_get_stringbvl( BerElement *ber, bgbv
         } while (++n < i);          } while (++n < i);
         return tag;          return tag;
   
 failed:  nomem:
         if (b->choice != BvOff) { /* BvOff does not have LBER_BV_ALLOC set */          if (b->choice != BvOff) {       /* BvOff does not have b->alloc set */
                 while (--n >= 0) {                  while (--n >= 0) {
                         switch(b->choice) {                          switch(b->choice) {
                         case ChArray:                          case ChArray:
Line 480  ber_get_stringbv( BerElement *ber, struc Line 480  ber_get_stringbv( BerElement *ber, struc
         char            *data;          char            *data;
   
         tag = ber_skip_element( ber, bv );          tag = ber_skip_element( ber, bv );
         if ( tag == LBER_DEFAULT ||          if ( tag == LBER_DEFAULT ) {
                 (( option & LBER_BV_STRING ) &&  
                  bv->bv_len && memchr( bv->bv_val, 0, bv->bv_len - 1 )))  
         {  
                 bv->bv_val = NULL;                  bv->bv_val = NULL;
                 return LBER_DEFAULT;                  return tag;
         }          }
   
         data = bv->bv_val;          data = bv->bv_val;
Line 519  ber_get_stringbv_null( BerElement *ber, Line 516  ber_get_stringbv_null( BerElement *ber,
                 return tag;                  return tag;
         }          }
   
         if (( option & LBER_BV_STRING ) &&  
                 memchr( bv->bv_val, 0, bv->bv_len - 1 ))  
         {  
                 bv->bv_val = NULL;  
                 return LBER_DEFAULT;  
         }  
   
         data = bv->bv_val;          data = bv->bv_val;
         if ( option & LBER_BV_ALLOC ) {          if ( option & LBER_BV_ALLOC ) {
                 bv->bv_val = (char *) ber_memalloc_x( bv->bv_len + 1,                  bv->bv_val = (char *) ber_memalloc_x( bv->bv_len + 1,
Line 551  ber_get_stringa( BerElement *ber, char * Line 541  ber_get_stringa( BerElement *ber, char *
   
         assert( buf != NULL );          assert( buf != NULL );
   
         tag = ber_get_stringbv( ber, &bv, LBER_BV_ALLOC | LBER_BV_STRING );          tag = ber_get_stringbv( ber, &bv, LBER_BV_ALLOC );
         *buf = bv.bv_val;          *buf = bv.bv_val;
   
         return tag;          return tag;
Line 565  ber_get_stringa_null( BerElement *ber, c Line 555  ber_get_stringa_null( BerElement *ber, c
   
         assert( buf != NULL );          assert( buf != NULL );
   
         tag = ber_get_stringbv_null( ber, &bv, LBER_BV_ALLOC | LBER_BV_STRING );          tag = ber_get_stringbv_null( ber, &bv, LBER_BV_ALLOC );
         *buf = bv.bv_val;          *buf = bv.bv_val;
   
         return tag;          return tag;
Line 618  ber_get_bitstringa( Line 608  ber_get_bitstringa(
                 goto fail;                  goto fail;
         }          }
   
         if ( memchr( data.bv_val, 0, data.bv_len )) {  
                 goto fail;  
         }  
   
         *buf = (char *) ber_memalloc_x( data.bv_len, ber->ber_memctx );          *buf = (char *) ber_memalloc_x( data.bv_len, ber->ber_memctx );
         if ( *buf == NULL ) {          if ( *buf == NULL ) {
                 return LBER_DEFAULT;                  return LBER_DEFAULT;
Line 825  ber_scanf ( BerElement *ber, Line 811  ber_scanf ( BerElement *ber,
                 case 'v':       /* sequence of strings */                  case 'v':       /* sequence of strings */
                 {                  {
                         bgbvr cookie = {                          bgbvr cookie = {
                                 ChArray, LBER_BV_ALLOC | LBER_BV_STRING, sizeof( char * )                                  ChArray, LBER_BV_ALLOC, sizeof( char * )
                         };                          };
                         rc = ber_get_stringbvl( ber, &cookie );                          rc = ber_get_stringbvl( ber, &cookie );
                         *(va_arg( ap, char *** )) = cookie.result;                          *(va_arg( ap, char *** )) = cookie.result;

Removed from v.1.105.2.11  
changed lines
  Added in v.1.126


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