Commit ee9d7637 authored by Dr. Stephen Henson's avatar Dr. Stephen Henson
Browse files

Remove combine option from ASN.1 code.



Remove the combine option. This was used for compatibility with some
non standard behaviour in ancient versions of OpenSSL: specifically
the X509_ATTRIBUTE and DSAPublicKey handling. Since these have now
been revised it is no longer needed.

Reviewed-by: default avatarRichard Levitte <levitte@openssl.org>
parent ea6b07b5
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -973,7 +973,7 @@ void ERR_load_ASN1_strings(void);
# define ASN1_F_ASN1_INTEGER_TO_BN                        119
# define ASN1_F_ASN1_ITEM_D2I_FP                          206
# define ASN1_F_ASN1_ITEM_DUP                             191
# define ASN1_F_ASN1_ITEM_EX_COMBINE_NEW                  121
# define ASN1_F_ASN1_ITEM_EX_NEW                          121
# define ASN1_F_ASN1_ITEM_EX_D2I                          120
# define ASN1_F_ASN1_ITEM_I2D_BIO                         192
# define ASN1_F_ASN1_ITEM_I2D_FP                          193
+1 −1
Original line number Diff line number Diff line
@@ -101,7 +101,7 @@ static ERR_STRING_DATA ASN1_str_functs[] = {
    {ERR_FUNC(ASN1_F_ASN1_INTEGER_TO_BN), "ASN1_INTEGER_to_BN"},
    {ERR_FUNC(ASN1_F_ASN1_ITEM_D2I_FP), "ASN1_item_d2i_fp"},
    {ERR_FUNC(ASN1_F_ASN1_ITEM_DUP), "ASN1_item_dup"},
    {ERR_FUNC(ASN1_F_ASN1_ITEM_EX_COMBINE_NEW), "ASN1_ITEM_EX_COMBINE_NEW"},
    {ERR_FUNC(ASN1_F_ASN1_ITEM_EX_NEW), "ASN1_ITEM_EX_NEW"},
    {ERR_FUNC(ASN1_F_ASN1_ITEM_EX_D2I), "ASN1_ITEM_EX_D2I"},
    {ERR_FUNC(ASN1_F_ASN1_ITEM_I2D_BIO), "ASN1_item_i2d_bio"},
    {ERR_FUNC(ASN1_F_ASN1_ITEM_I2D_FP), "ASN1_item_i2d_fp"},
+0 −14
Original line number Diff line number Diff line
@@ -299,11 +299,6 @@ extern "C" {
        (flags), (tag), offsetof(stname, field),\
        #field, ASN1_ITEM_ref(type) }

/* used when the structure is combined with the parent */

# define ASN1_EX_COMBINE(flags, tag, type) { \
        (flags)|ASN1_TFLG_COMBINE, (tag), 0, NULL, ASN1_ITEM_ref(type) }

/* implicit and explicit helper macros */

# define ASN1_IMP_EX(stname, field, type, tag, ex) \
@@ -542,15 +537,6 @@ struct ASN1_ADB_TABLE_st {

# define ASN1_TFLG_ADB_INT       (0x1<<9)

/*
 * This flag means a parent structure is passed instead of the field: this is
 * useful is a SEQUENCE is being combined with a CHOICE for example. Since
 * this means the structure and item name will differ we need to use the
 * ASN1_CHOICE_END_name() macro for example.
 */

# define ASN1_TFLG_COMBINE       (0x1<<10)

/*
 * This flag when present in a SEQUENCE OF, SET OF or EXPLICIT causes
 * indefinite length constructed encoding to be used if required.
+7 −21
Original line number Diff line number Diff line
@@ -63,23 +63,14 @@
#include <openssl/objects.h>
#include "asn1_locl.h"

static void asn1_item_combine_free(ASN1_VALUE **pval, const ASN1_ITEM *it,
                                   int combine);

/* Free up an ASN1 structure */

void ASN1_item_free(ASN1_VALUE *val, const ASN1_ITEM *it)
{
    asn1_item_combine_free(&val, it, 0);
    ASN1_item_ex_free(&val, it);
}

void ASN1_item_ex_free(ASN1_VALUE **pval, const ASN1_ITEM *it)
{
    asn1_item_combine_free(pval, it, 0);
}

static void asn1_item_combine_free(ASN1_VALUE **pval, const ASN1_ITEM *it,
                                   int combine)
{
    const ASN1_TEMPLATE *tt = NULL, *seqtt;
    const ASN1_EXTERN_FUNCS *ef;
@@ -125,10 +116,8 @@ static void asn1_item_combine_free(ASN1_VALUE **pval, const ASN1_ITEM *it,
        }
        if (asn1_cb)
            asn1_cb(ASN1_OP_FREE_POST, pval, it, NULL);
        if (!combine) {
        OPENSSL_free(*pval);
        *pval = NULL;
        }
        break;

    case ASN1_ITYPE_EXTERN:
@@ -163,10 +152,8 @@ static void asn1_item_combine_free(ASN1_VALUE **pval, const ASN1_ITEM *it,
        }
        if (asn1_cb)
            asn1_cb(ASN1_OP_FREE_POST, pval, it, NULL);
        if (!combine) {
        OPENSSL_free(*pval);
        *pval = NULL;
        }
        break;
    }
}
@@ -180,13 +167,12 @@ void asn1_template_free(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt)
        for (i = 0; i < sk_ASN1_VALUE_num(sk); i++) {
            ASN1_VALUE *vtmp = sk_ASN1_VALUE_value(sk, i);

            asn1_item_combine_free(&vtmp, ASN1_ITEM_ptr(tt->item), 0);
            ASN1_item_ex_free(&vtmp, ASN1_ITEM_ptr(tt->item));
        }
        sk_ASN1_VALUE_free(sk);
        *pval = NULL;
    } else {
        asn1_item_combine_free(pval, ASN1_ITEM_ptr(tt->item),
                               tt->flags & ASN1_TFLG_COMBINE);
        ASN1_item_ex_free(pval, ASN1_ITEM_ptr(tt->item));
    }
}

+14 −27
Original line number Diff line number Diff line
@@ -65,8 +65,6 @@
#include <string.h>
#include "asn1_locl.h"

static int asn1_item_ex_combine_new(ASN1_VALUE **pval, const ASN1_ITEM *it,
                                    int combine);
static int asn1_primitive_new(ASN1_VALUE **pval, const ASN1_ITEM *it);
static void asn1_item_clear(ASN1_VALUE **pval, const ASN1_ITEM *it);
static int asn1_template_new(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt);
@@ -84,12 +82,6 @@ ASN1_VALUE *ASN1_item_new(const ASN1_ITEM *it)
/* Allocate an ASN1 structure */

int ASN1_item_ex_new(ASN1_VALUE **pval, const ASN1_ITEM *it)
{
    return asn1_item_ex_combine_new(pval, it, 0);
}

static int asn1_item_ex_combine_new(ASN1_VALUE **pval, const ASN1_ITEM *it,
                                    int combine)
{
    const ASN1_TEMPLATE *tt = NULL;
    const ASN1_EXTERN_FUNCS *ef;
@@ -102,7 +94,6 @@ static int asn1_item_ex_combine_new(ASN1_VALUE **pval, const ASN1_ITEM *it,
    else
        asn1_cb = 0;

    if (!combine)
    *pval = NULL;

#ifdef CRYPTO_MDEBUG
@@ -146,12 +137,10 @@ static int asn1_item_ex_combine_new(ASN1_VALUE **pval, const ASN1_ITEM *it,
                return 1;
            }
        }
        if (!combine) {
        *pval = OPENSSL_malloc(it->size);
        if (!*pval)
            goto memerr;
        memset(*pval, 0, it->size);
        }
        asn1_set_choice_selector(pval, -1, it);
        if (asn1_cb && !asn1_cb(ASN1_OP_NEW_POST, pval, it, NULL))
            goto auxerr;
@@ -171,14 +160,12 @@ static int asn1_item_ex_combine_new(ASN1_VALUE **pval, const ASN1_ITEM *it,
                return 1;
            }
        }
        if (!combine) {
        *pval = OPENSSL_malloc(it->size);
        if (!*pval)
            goto memerr;
        memset(*pval, 0, it->size);
        asn1_do_lock(pval, 0, it);
        asn1_enc_init(pval, it);
        }
        for (i = 0, tt = it->templates; i < it->tcount; tt++, i++) {
            pseqval = asn1_get_field_ptr(pval, tt);
            if (!asn1_template_new(pseqval, tt))
@@ -195,7 +182,7 @@ static int asn1_item_ex_combine_new(ASN1_VALUE **pval, const ASN1_ITEM *it,
    return 1;

 memerr:
    ASN1err(ASN1_F_ASN1_ITEM_EX_COMBINE_NEW, ERR_R_MALLOC_FAILURE);
    ASN1err(ASN1_F_ASN1_ITEM_EX_NEW, ERR_R_MALLOC_FAILURE);
#ifdef CRYPTO_MDEBUG
    if (it->sname)
        CRYPTO_pop_info();
@@ -203,7 +190,7 @@ static int asn1_item_ex_combine_new(ASN1_VALUE **pval, const ASN1_ITEM *it,
    return 0;

 auxerr:
    ASN1err(ASN1_F_ASN1_ITEM_EX_COMBINE_NEW, ASN1_R_AUX_ERROR);
    ASN1err(ASN1_F_ASN1_ITEM_EX_NEW, ASN1_R_AUX_ERROR);
    ASN1_item_ex_free(pval, it);
#ifdef CRYPTO_MDEBUG
    if (it->sname)
@@ -278,7 +265,7 @@ static int asn1_template_new(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt)
        goto done;
    }
    /* Otherwise pass it back to the item routine */
    ret = asn1_item_ex_combine_new(pval, it, tt->flags & ASN1_TFLG_COMBINE);
    ret = ASN1_item_ex_new(pval, it);
 done:
#ifdef CRYPTO_MDEBUG
    if (it->sname)
Loading