if(!c2i_ASN1_INTEGER((ASN1_INTEGER **)pval, &cont, len)) goto err;
tint = (ASN1_INTEGER **)pval; if(!c2i_ASN1_INTEGER(tint, &cont, len)) goto err;  (*tint)->type = utype | ((*tint)->type & V_ASN1_NEG);
int asn1_ex_c2i(ASN1_VALUE **pval, unsigned char *cont, int len, int utype, char *free_cont, const ASN1_ITEM *it){	ASN1_STRING *stmp;	ASN1_TYPE *typ = NULL;	int ret = 0;	const ASN1_PRIMITIVE_FUNCS *pf;	pf = it->funcs;	if(pf && pf->prim_c2i) return pf->prim_c2i(pval, cont, len, utype, free_cont, it);	/* If ANY type clear type and set pointer to internal value */	if(it->utype == V_ASN1_ANY) {		if(!*pval) {			typ = ASN1_TYPE_new();			*pval = (ASN1_VALUE *)typ;		} else typ = (ASN1_TYPE *)*pval;		if(utype != typ->type) ASN1_TYPE_set(typ, utype, NULL);		pval = (ASN1_VALUE **)&typ->value.ptr;	}	switch(utype) {		case V_ASN1_OBJECT:		if(!c2i_ASN1_OBJECT((ASN1_OBJECT **)pval, &cont, len)) goto err;		break;		case V_ASN1_NULL:		if(len) {			ASN1err(ASN1_F_ASN1_D2I_EX_PRIMITIVE, ASN1_R_NULL_IS_WRONG_LENGTH);			goto err;		}		*pval = (ASN1_VALUE *)1;		break;		case V_ASN1_BOOLEAN:		if(len != 1) {			ASN1err(ASN1_F_ASN1_D2I_EX_PRIMITIVE, ASN1_R_BOOLEAN_IS_WRONG_LENGTH);			goto err;		} else {			ASN1_BOOLEAN *tbool;			tbool = (ASN1_BOOLEAN *)pval;			*tbool = *cont;		}		break;		case V_ASN1_BIT_STRING:		if(!c2i_ASN1_BIT_STRING((ASN1_BIT_STRING **)pval, &cont, len)) goto err;		break;		case V_ASN1_INTEGER:		case V_ASN1_NEG_INTEGER:		case V_ASN1_ENUMERATED:		case V_ASN1_NEG_ENUMERATED:		if(!c2i_ASN1_INTEGER((ASN1_INTEGER **)pval, &cont, len)) goto err;		break;		case V_ASN1_OCTET_STRING:		case V_ASN1_NUMERICSTRING:		case V_ASN1_PRINTABLESTRING:		case V_ASN1_T61STRING:		case V_ASN1_VIDEOTEXSTRING:		case V_ASN1_IA5STRING:		case V_ASN1_UTCTIME:		case V_ASN1_GENERALIZEDTIME:		case V_ASN1_GRAPHICSTRING:		case V_ASN1_VISIBLESTRING:		case V_ASN1_GENERALSTRING:		case V_ASN1_UNIVERSALSTRING:		case V_ASN1_BMPSTRING:		case V_ASN1_UTF8STRING:		case V_ASN1_OTHER:		case V_ASN1_SET:		case V_ASN1_SEQUENCE:		default:		/* All based on ASN1_STRING and handled the same */		if(!*pval) {			stmp = ASN1_STRING_type_new(utype);			if(!stmp) {				ASN1err(ASN1_F_ASN1_D2I_EX_PRIMITIVE, ERR_R_MALLOC_FAILURE);				goto err;			}			*pval = (ASN1_VALUE *)stmp;		} else {			stmp = (ASN1_STRING *)*pval;			stmp->type = utype;		}		/* If we've already allocated a buffer use it */		if(*free_cont) {			if(stmp->data) OPENSSL_free(stmp->data);			stmp->data = cont;			stmp->length = len;			*free_cont = 0;		} else {			if(!ASN1_STRING_set(stmp, cont, len)) {				ASN1err(ASN1_F_ASN1_D2I_EX_PRIMITIVE, ERR_R_MALLOC_FAILURE);				ASN1_STRING_free(stmp);					*pval = NULL;				goto err;			}		}		break;	}	/* If ASN1_ANY and NULL type fix up value */	if(typ && utype==V_ASN1_NULL) typ->value.ptr = NULL;	ret = 1;	err:	if(!ret) ASN1_TYPE_free(typ);	return ret;}