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

Extend attribute setting routines to support non-string types.

parent 8ab9025e
Loading
Loading
Loading
Loading
+28 −1
Original line number Diff line number Diff line
@@ -77,9 +77,36 @@ void ASN1_TYPE_set(ASN1_TYPE *a, int type, void *value)
		ASN1_primitive_free((ASN1_VALUE **)tmp_a, NULL);
		}
	a->type=type;
	if (type == V_ASN1_BOOLEAN)
		a->value.boolean = value ? 0xff : 0;
	else
		a->value.ptr=value;
	}

int ASN1_TYPE_set1(ASN1_TYPE *a, int type, const void *value)
	{
	if (!value || (type == V_ASN1_BOOLEAN))
		{
		ASN1_TYPE_set(a, type, (void *)value);
		}
	else if (type == V_ASN1_OBJECT)
		{
		ASN1_OBJECT *odup;
		odup = OBJ_dup(value);
		if (!odup)
			return 0;
		ASN1_TYPE_set(a, type, odup);
		}
	else
		{
		ASN1_STRING *sdup;
		sdup = ASN1_STRING_dup(sdup);
		if (!sdup)
			return 0;
		ASN1_TYPE_set(a, type, sdup);
		}
	return 1;
	}

IMPLEMENT_STACK_OF(ASN1_TYPE)
IMPLEMENT_ASN1_SET_OF(ASN1_TYPE)
+1 −0
Original line number Diff line number Diff line
@@ -759,6 +759,7 @@ DECLARE_ASN1_FUNCTIONS_fname(ASN1_TYPE, ASN1_ANY, ASN1_TYPE)

int ASN1_TYPE_get(ASN1_TYPE *a);
void ASN1_TYPE_set(ASN1_TYPE *a, int type, void *value);
int ASN1_TYPE_set1(ASN1_TYPE *a, int type, const void *value);
int            ASN1_TYPE_cmp(ASN1_TYPE *a, ASN1_TYPE *b);

ASN1_OBJECT *	ASN1_OBJECT_new(void );
+8 −2
Original line number Diff line number Diff line
@@ -281,16 +281,22 @@ int X509_ATTRIBUTE_set1_data(X509_ATTRIBUTE *attr, int attrtype, const void *dat
			return 0;
		}
		atype = stmp->type;
	} else {
	} else if (len != -1){
		if(!(stmp = ASN1_STRING_type_new(attrtype))) goto err;
		if(!ASN1_STRING_set(stmp, data, len)) goto err;
		atype = attrtype;
	}
	if(!(attr->value.set = sk_ASN1_TYPE_new_null())) goto err;
	if(!(ttmp = ASN1_TYPE_new())) goto err;
	if (len == -1)
		{
		if (!ASN1_TYPE_set1(ttmp, attrtype, data))
			goto err;
		}
	else
		ASN1_TYPE_set(ttmp, atype, stmp);
	if(!sk_ASN1_TYPE_push(attr->value.set, ttmp)) goto err;
	attr->single = 0;
	ASN1_TYPE_set(ttmp, atype, stmp);
	return 1;
	err:
	X509err(X509_F_X509_ATTRIBUTE_SET1_DATA, ERR_R_MALLOC_FAILURE);