int asn1_do_lock(ASN1_VALUE **pval, int op, const ASN1_ITEM *it) { const ASN1_AUX *aux; int *lck, ret; CRYPTO_RWLOCK **lock; if ((it->itype != ASN1_ITYPE_SEQUENCE) && (it->itype != ASN1_ITYPE_NDEF_SEQUENCE)) return 0; aux = it->funcs; if (!aux || !(aux->flags & ASN1_AFLG_REFCOUNT)) return 0; lck = offset2ptr(*pval, aux->ref_offset); lock = offset2ptr(*pval, aux->ref_lock); if (op == 0) { *lck = 1; *lock = CRYPTO_THREAD_lock_new(); if (*lock == NULL) return 0; return 1; } CRYPTO_atomic_add(lck, op, &ret, *lock); #ifdef REF_PRINT fprintf(stderr, "%p:%4d:%s\n", it, *lck, it->sname); #endif REF_ASSERT_ISNT(ret < 0); if (ret == 0) CRYPTO_THREAD_lock_free(*lock); return ret; }
int asn1_do_lock(ASN1_VALUE **pval, int op, const ASN1_ITEM *it) { const ASN1_AUX *aux; int *lck, ret; CRYPTO_MUTEX **lock; if ((it->itype != ASN1_ITYPE_SEQUENCE) && (it->itype != ASN1_ITYPE_NDEF_SEQUENCE)) return 0; aux = it->funcs; if (!aux || !(aux->flags & ASN1_AFLG_REFCOUNT)) return 0; lck = offset2ptr(*pval, aux->ref_offset); lock = offset2ptr(*pval, aux->ref_lock); if (op == 0) { *lck = 1; *lock = CRYPTO_thread_new(); if (*lock == NULL) return 0; return 1; } CRYPTO_atomic_add(lck, op, &ret, *lock); if (ret == 0) CRYPTO_thread_cleanup(*lock); return ret; }
int asn1_do_lock(ASN1_VALUE **pval, int op, const ASN1_ITEM *it) { const ASN1_AUX *aux; int *lck, ret; if ((it->itype != ASN1_ITYPE_SEQUENCE) && (it->itype != ASN1_ITYPE_NDEF_SEQUENCE)) return 0; aux = it->funcs; if (!aux || !(aux->flags & ASN1_AFLG_REFCOUNT)) return 0; lck = offset2ptr(*pval, aux->ref_offset); if (op == 0) { *lck = 1; return 1; } ret = CRYPTO_add(lck, op, aux->ref_lock); #ifdef REF_PRINT fprintf(stderr, "%s: Reference Count: %d\n", it->sname, *lck); #endif #ifdef REF_CHECK if (ret < 0) fprintf(stderr, "%s, bad reference count\n", it->sname); #endif return ret; }
const ASN1_TEMPLATE * asn1_do_adb(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt, int nullerr) { const ASN1_ADB *adb; const ASN1_ADB_TABLE *atbl; long selector; ASN1_VALUE **sfld; int i; if (!(tt->flags & ASN1_TFLG_ADB_MASK)) return tt; /* Else ANY DEFINED BY ... get the table */ adb = ASN1_ADB_ptr(tt->item); /* Get the selector field */ sfld = offset2ptr(*pval, adb->offset); /* Check if NULL */ if (!sfld) { if (!adb->null_tt) goto err; return adb->null_tt; } /* Convert type to a long: * NB: don't check for NID_undef here because it * might be a legitimate value in the table */ if (tt->flags & ASN1_TFLG_ADB_OID) selector = OBJ_obj2nid((ASN1_OBJECT *)*sfld); else selector = ASN1_INTEGER_get((ASN1_INTEGER *)*sfld); /* Try to find matching entry in table * Maybe should check application types first to * allow application override? Might also be useful * to have a flag which indicates table is sorted and * we can do a binary search. For now stick to a * linear search. */ for (atbl = adb->tbl, i = 0; i < adb->tblcount; i++, atbl++) if (atbl->value == selector) return &atbl->tt; /* FIXME: need to search application table too */ /* No match, return default type */ if (!adb->default_tt) goto err; return adb->default_tt; err: /* FIXME: should log the value or OID of unsupported type */ if (nullerr) ASN1err(ASN1_F_ASN1_DO_ADB, ASN1_R_UNSUPPORTED_ANY_DEFINED_BY_TYPE); return NULL; }
int asn1_set_choice_selector(ASN1_VALUE **pval, int value, const ASN1_ITEM *it) { int *sel, ret; sel = offset2ptr(*pval, it->utype); ret = *sel; *sel = value; return ret; }
static ASN1_ENCODING *asn1_get_enc_ptr(ASN1_VALUE **pval, const ASN1_ITEM *it) { const ASN1_AUX *aux; if(!pval || !*pval) return NULL; aux = it->funcs; if(!aux || !(aux->flags & ASN1_AFLG_ENCODING)) return NULL; return offset2ptr(*pval, aux->enc_offset); }
static CRYPTO_refcount_t *asn1_get_references(ASN1_VALUE **pval, const ASN1_ITEM *it) { if (it->itype != ASN1_ITYPE_SEQUENCE && it->itype != ASN1_ITYPE_NDEF_SEQUENCE) { return NULL; } const ASN1_AUX *aux = it->funcs; if (!aux || !(aux->flags & ASN1_AFLG_REFCOUNT)) { return NULL; } return offset2ptr(*pval, aux->ref_offset); }
const ASN1_TEMPLATE *asn1_do_adb(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt,int nullerr) { const ASN1_ADB *adb; const ASN1_ADB_TABLE *atbl; long selector = 0; ASN1_VALUE **sfld; int i; if (!(tt->flags & ASN1_TFLG_ADB_MASK)) return tt;//?? adb = ASN1_ADB_ptr(tt->item); sfld = offset2ptr(*pval, adb->offset); if (!sfld) { if (!adb->null_tt) goto err; return adb->null_tt; } if (tt->flags & ASN1_TFLG_ADB_OID) selector = OBJ_obj2nid((ASN1_OBJECT *)*sfld); else //selector = ASN1_INTEGER_get((ASN1_INTEGER *)*sfld); ; for (atbl = adb->tbl, i = 0; i < adb->tblcount; i++, atbl++) if (atbl->value == selector) return &atbl->tt; if (!adb->default_tt) goto err; return adb->default_tt; err: if (nullerr) ASN1err(ASN1_F_ASN1_DO_ADB, ASN1_R_UNSUPPORTED_ANY_DEFINED_BY_TYPE); return NULL; }
/* 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 refrence count or 0 if no * reference count exists. */ int asn1_do_lock(ASN1_VALUE **pval, int op, const ASN1_ITEM *it) { const ASN1_AUX *aux; int *lck, ret; if (it->itype != ASN1_ITYPE_SEQUENCE && it->itype != ASN1_ITYPE_NDEF_SEQUENCE) { return 0; } aux = it->funcs; if (!aux || !(aux->flags & ASN1_AFLG_REFCOUNT)) { return 0; } lck = offset2ptr(*pval, aux->ref_offset); if (op == 0) { *lck = 1; return 1; } ret = CRYPTO_add(lck, op, aux->ref_lock); return ret; }
int asn1_get_choice_selector(ASN1_VALUE **pval, const ASN1_ITEM *it) { int *sel = offset2ptr(*pval, it->utype); return *sel; }