Commit 687b4868 authored by FdaSilvaYY's avatar FdaSilvaYY Committed by Matt Caswell
Browse files

Rework error handling from asn1_do_lock method.

parent b58614d7
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -89,7 +89,7 @@ static void asn1_item_embed_free(ASN1_VALUE **pval, const ASN1_ITEM *it,

    case ASN1_ITYPE_NDEF_SEQUENCE:
    case ASN1_ITYPE_SEQUENCE:
        if (asn1_do_lock(pval, -1, it) > 0)
        if (asn1_do_lock(pval, -1, it) != 0) /* if error or ref-counter > 0 */
            return;
        if (asn1_cb) {
            i = asn1_cb(ASN1_OP_FREE_PRE, pval, it, NULL);
+3 −1
Original line number Diff line number Diff line
@@ -123,7 +123,9 @@ int asn1_item_embed_new(ASN1_VALUE **pval, const ASN1_ITEM *it, int embed)
            if (*pval == NULL)
                goto memerr;
        }
        asn1_do_lock(pval, 0, it);
        /* 0 : init. lock */
        if (asn1_do_lock(pval, 0, it) < 0)
            goto memerr;
        asn1_enc_init(pval, it);
        for (i = 0, tt = it->templates; i < it->tcount; tt++, i++) {
            pseqval = asn1_get_field_ptr(pval, tt);
+14 −10
Original line number Diff line number Diff line
@@ -46,13 +46,14 @@ int asn1_set_choice_selector(ASN1_VALUE **pval, int value,
}

/*
 * Do reference counting. The value 'op' decides what to do. if it is +1
 * then the count is incremented. If op is 0 count is set to 1. If op is -1
 * count is decremented and the return value is the current reference count
 * or 0 if no reference count exists.
 * FIXME: return and manage any error from inside this method
 * Do atomic reference counting. The value 'op' decides what to do.
 * If it is +1 then the count is incremented.
 * If |op| is 0, lock is initialised and count is set to 1.
 * If |op| is -1, count is decremented and the return value is the current
 * reference count or 0 if no reference count is active.
 * It returns -1 on initialisation error.
 * Used by ASN1_SEQUENCE construct of X509, X509_REQ, X509_CRL objects
 */

int asn1_do_lock(ASN1_VALUE **pval, int op, const ASN1_ITEM *it)
{
    const ASN1_AUX *aux;
@@ -70,18 +71,21 @@ int asn1_do_lock(ASN1_VALUE **pval, int op, const ASN1_ITEM *it)
        *lck = 1;
        *lock = CRYPTO_THREAD_lock_new();
        if (*lock == NULL) {
            /* FIXME: should report an error (-1) at this point */
            return 0;
            ASN1err(ASN1_F_ASN1_DO_LOCK, ERR_R_MALLOC_FAILURE);
            return -1;
        }
        return 1;
    }
    CRYPTO_atomic_add(lck, op, &ret, *lock);
    if (CRYPTO_atomic_add(lck, op, &ret, *lock) < 0)
        return -1;  /* failed */
#ifdef REF_PRINT
    fprintf(stderr, "%p:%4d:%s\n", it, *lck, it->sname);
#endif
    REF_ASSERT_ISNT(ret < 0);
    if (ret == 0)
    if (ret == 0) {
        CRYPTO_THREAD_lock_free(*lock);
        *lock = NULL;
    }
    return ret;
}

+1 −0
Original line number Diff line number Diff line
@@ -885,6 +885,7 @@ void ERR_load_ASN1_strings(void);
# define ASN1_F_ASN1_D2I_READ_BIO                         107
# define ASN1_F_ASN1_DIGEST                               184
# define ASN1_F_ASN1_DO_ADB                               110
# define ASN1_F_ASN1_DO_LOCK                              233
# define ASN1_F_ASN1_DUP                                  111
# define ASN1_F_ASN1_EX_C2I                               204
# define ASN1_F_ASN1_FIND_END                             190
+3 −3

File changed.

Contains only whitespace changes.