Diff for /libraries/liblber/decode.c between versions 1.70 and 1.71

version 1.70, 2002/01/02 16:06:56 version 1.71, 2002/01/03 01:53:41
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.69 2002/01/02 07:50:07 hyc Exp $ */  /* $OpenLDAP: pkg/ldap/libraries/liblber/decode.c,v 1.70 2002/01/02 16:06:56 kurt Exp $ */
 /*  /*
  * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved.   * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved.
  * COPYING RESTRICTIONS APPLY, see COPYRIGHT file   * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
Line 278  ber_get_stringb( Line 278  ber_get_stringb(
         return tag;          return tag;
 }  }
   
   enum bgbvc { ChArray, BvArray, BvVec };
   
   typedef struct bgbvr {
           BerElement *ber;
           enum bgbvc choice;
           ber_tag_t tag;
           ber_len_t len;
           char *last;
           union {
                   char ***c;
                   BVarray *ba;
                   struct berval ***bv;
           } res;
   } bgbvr;
   
   ber_tag_t
   ber_get_stringbvr( bgbvr *b, int n )
   {
           struct berval bv;
   
           if ( n )
                   b->tag = ber_next_element( b->ber, &b->len, b->last );
           else
                   b->tag = ber_first_element( b->ber, &b->len, &b->last );
   
           if ( b->tag == LBER_DEFAULT )
           {
                   if ( n == 0 ) {
                           *b->res.c = NULL;
                           return 0;
                   }
                   /* do the allocation */
                   switch (b->choice) {
                   case ChArray:
                           *b->res.c = LBER_MALLOC( (n+1) * sizeof( char * ));
                           (*b->res.c)[n] = NULL;
                           break;
                   case BvArray:
                           *b->res.ba = LBER_MALLOC( (n+1) * sizeof( struct berval ));
                           (*b->res.ba)[n].bv_val = NULL;
                           break;
                   case BvVec:
                           *b->res.bv = LBER_MALLOC( (n+1) * sizeof( struct berval *));
                           (*b->res.bv)[n] = NULL;
                           break;
                   }
                   return 0;
           }
   
           if ( ber_get_stringbv( b->ber, &bv ) == LBER_DEFAULT )
                   return LBER_DEFAULT;
   
           b->tag = ber_get_stringbvr( b, n+1 );
           if ( b->tag == 0 )
           {
                   /* store my result */
                   switch (b->choice) {
                   case ChArray:
                           (*b->res.c)[n] = bv.bv_val;
                           break;
                   case BvArray:
                           (*b->res.ba)[n] = bv;
                           break;
                   case BvVec:
                           (*b->res.bv)[n] = ber_bvdup( &bv );
                           break;
                   }
           } else {
                   LBER_FREE( bv.bv_val );
           }
           return b->tag;
   }
   
 ber_tag_t  ber_tag_t
 ber_get_stringbv( BerElement *ber, struct berval *bv )  ber_get_stringbv( BerElement *ber, struct berval *bv )
 {  {
Line 469  ber_next_element( Line 542  ber_next_element(
 }  }
   
 /* Hopefully no one sends vectors with more elements than this */  /* Hopefully no one sends vectors with more elements than this */
 #define TMP_SLOTS       1024  /* #define      TMP_SLOTS       1024 */
   
 /* VARARGS */  /* VARARGS */
 ber_tag_t  ber_tag_t
Line 580  ber_scanf ( BerElement *ber, Line 653  ber_scanf ( BerElement *ber,
   
                 case 'v':       /* sequence of strings */                  case 'v':       /* sequence of strings */
                 {                  {
   #ifdef TMP_SLOTS
                         char *tmp[TMP_SLOTS];                          char *tmp[TMP_SLOTS];
                         sss = va_arg( ap, char *** );                          sss = va_arg( ap, char *** );
                         *sss = NULL;                          *sss = NULL;
Line 606  ber_scanf ( BerElement *ber, Line 680  ber_scanf ( BerElement *ber,
                                 for (j--; j>=0; j--)                                  for (j--; j>=0; j--)
                                         LBER_FREE(tmp[j]);                                          LBER_FREE(tmp[j]);
                         }                          }
   #else
                           bgbvr cookie = { ber, ChArray };
                           cookie.res.c = va_arg( ap, char *** );
                           rc = ber_get_stringbvr( &cookie, 0 );
   #endif
                         break;                          break;
                 }                  }
   
                 case 'V':       /* sequence of strings + lengths */                  case 'V':       /* sequence of strings + lengths */
                 {                  {
   #ifdef TMP_SLOTS
                         struct berval *tmp[TMP_SLOTS];                          struct berval *tmp[TMP_SLOTS];
                         bv = va_arg( ap, struct berval *** );                          bv = va_arg( ap, struct berval *** );
                         *bv = NULL;                          *bv = NULL;
Line 637  ber_scanf ( BerElement *ber, Line 717  ber_scanf ( BerElement *ber,
                                 for (j--; j>=0; j--)                                  for (j--; j>=0; j--)
                                         ber_bvfree(tmp[j]);                                          ber_bvfree(tmp[j]);
                         }                          }
   #else
                           bgbvr cookie = { ber, BvVec };
                           cookie.res.bv = va_arg( ap, struct berval *** );
                           rc = ber_get_stringbvr( &cookie, 0 );
   #endif
                         break;                          break;
                 }                  }
   
                 case 'W':       /* bvarray */                  case 'W':       /* bvarray */
                 {                  {
   #ifdef TMP_SLOTS
                         struct berval tmp[TMP_SLOTS];                          struct berval tmp[TMP_SLOTS];
                         bvp = va_arg( ap, struct berval ** );                          bvp = va_arg( ap, struct berval ** );
                         *bvp = NULL;                          *bvp = NULL;
Line 669  ber_scanf ( BerElement *ber, Line 755  ber_scanf ( BerElement *ber,
                                 for (j--; j>=0; j--)                                  for (j--; j>=0; j--)
                                         LBER_FREE(tmp[j].bv_val);                                          LBER_FREE(tmp[j].bv_val);
                         }                          }
   #else
                           bgbvr cookie = { ber, BvArray };
                           cookie.res.ba = va_arg( ap, struct berval ** );
                           rc = ber_get_stringbvr( &cookie, 0 );
   #endif
                         break;                          break;
                 }                  }
   

Removed from v.1.70  
changed lines
  Added in v.1.71


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