Commit 65d4927b authored by Ben Laurie's avatar Ben Laurie
Browse files

Another safe stack.

parent 3a1a8467
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -907,7 +907,7 @@ start: for (;;)
				min,max))
				goto err;
			}
		if (sk_num(ri->subject->entries) == 0)
		if (sk_X509_NAME_ENTRY_num(ri->subject->entries) == 0)
			{
			BIO_printf(bio_err,"error, no objects specified in config file\n");
			goto err;
+4 −0
Original line number Diff line number Diff line
@@ -154,6 +154,10 @@ err:\
		M_ASN1_D2I_get_imp_set(r,func,free_func, \
			V_ASN1_SET,V_ASN1_UNIVERSAL);

#define M_ASN1_D2I_get_set_type(type,r,func,free_func) \
		M_ASN1_D2I_get_imp_set_type(type,r,func,free_func, \
			V_ASN1_SET,V_ASN1_UNIVERSAL);

#define M_ASN1_D2I_get_set_opt(r,func,free_func) \
	if ((c.slen != 0) && (M_ASN1_next == (V_ASN1_UNIVERSAL| \
		V_ASN1_CONSTRUCTED|V_ASN1_SET)))\
+20 −18
Original line number Diff line number Diff line
@@ -113,7 +113,7 @@ int i2d_X509_NAME(X509_NAME *a, unsigned char **pp)
static int i2d_X509_NAME_entries(X509_NAME *a)
	{
	X509_NAME_ENTRY *ne,*fe=NULL;
	STACK *sk;
	STACK_OF(X509_NAME_ENTRY) *sk;
	BUF_MEM *buf=NULL;
	int set=0,r,ret=0;
	int i;
@@ -121,9 +121,9 @@ static int i2d_X509_NAME_entries(X509_NAME *a)
	int size=0;

	sk=a->entries;
	for (i=0; i<sk_num(sk); i++)
	for (i=0; i<sk_X509_NAME_ENTRY_num(sk); i++)
		{
		ne=(X509_NAME_ENTRY *)sk_value(sk,i);
		ne=sk_X509_NAME_ENTRY_value(sk,i);
		if (fe == NULL)
			{
			fe=ne;
@@ -154,9 +154,9 @@ static int i2d_X509_NAME_entries(X509_NAME *a)
	ASN1_put_object(&p,1,ret,V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL);

	set= -1;
	for (i=0; i<sk_num(sk); i++)
	for (i=0; i<sk_X509_NAME_ENTRY_num(sk); i++)
		{
		ne=(X509_NAME_ENTRY *)sk_value(sk,i);
		ne=sk_X509_NAME_ENTRY_value(sk,i);
		if (set != ne->set)
			{
			set=ne->set;
@@ -179,11 +179,11 @@ X509_NAME *d2i_X509_NAME(X509_NAME **a, unsigned char **pp, long length)
	M_ASN1_D2I_vars(a,X509_NAME *,X509_NAME_new);

	orig= *pp;
	if (sk_num(ret->entries) > 0)
	if (sk_X509_NAME_ENTRY_num(ret->entries) > 0)
		{
		while (sk_num(ret->entries) > 0)
			X509_NAME_ENTRY_free((X509_NAME_ENTRY *)
				sk_pop(ret->entries));
		while (sk_X509_NAME_ENTRY_num(ret->entries) > 0)
			X509_NAME_ENTRY_free(
				       sk_X509_NAME_ENTRY_pop(ret->entries));
		}

	M_ASN1_D2I_Init();
@@ -191,12 +191,12 @@ X509_NAME *d2i_X509_NAME(X509_NAME **a, unsigned char **pp, long length)
	for (;;)
		{
		if (M_ASN1_D2I_end_sequence()) break;
		M_ASN1_D2I_get_set(ret->entries,d2i_X509_NAME_ENTRY,
		M_ASN1_D2I_get_set_type(X509_NAME_ENTRY,ret->entries,
					d2i_X509_NAME_ENTRY,
					X509_NAME_ENTRY_free);
		for (; idx < sk_num(ret->entries); idx++)
		for (; idx < sk_X509_NAME_ENTRY_num(ret->entries); idx++)
			{
			((X509_NAME_ENTRY *)sk_value(ret->entries,idx))->set=
				set;
			sk_X509_NAME_ENTRY_value(ret->entries,idx)->set=set;
			}
		set++;
		}
@@ -216,7 +216,7 @@ X509_NAME *X509_NAME_new(void)
	ASN1_CTX c;

	M_ASN1_New_Malloc(ret,X509_NAME);
	if ((ret->entries=sk_new(NULL)) == NULL)
	if ((ret->entries=sk_X509_NAME_ENTRY_new(NULL)) == NULL)
		{ c.line=__LINE__; goto err2; }
	M_ASN1_New(ret->bytes,BUF_MEM_new);
	ret->modified=1;
@@ -244,8 +244,8 @@ void X509_NAME_free(X509_NAME *a)
	    return;

	BUF_MEM_free(a->bytes);
	sk_pop_free(a->entries,X509_NAME_ENTRY_free);
	Free((char *)a);
	sk_X509_NAME_ENTRY_pop_free(a->entries,X509_NAME_ENTRY_free);
	Free(a);
	}

void X509_NAME_ENTRY_free(X509_NAME_ENTRY *a)
@@ -253,7 +253,7 @@ void X509_NAME_ENTRY_free(X509_NAME_ENTRY *a)
	if (a == NULL) return;
	ASN1_OBJECT_free(a->object);
	ASN1_BIT_STRING_free(a->value);
	Free((char *)a);
	Free(a);
	}

int X509_NAME_set(X509_NAME **xn, X509_NAME *name)
@@ -274,3 +274,5 @@ int X509_NAME_set(X509_NAME **xn, X509_NAME *name)
	return(*xn != NULL);
	}
	
IMPLEMENT_STACK_OF(X509_NAME_ENTRY)
IMPLEMENT_ASN1_SET_OF(X509_NAME_ENTRY)
+6 −3
Original line number Diff line number Diff line
@@ -73,8 +73,9 @@ type *sk_##type##_set(STACK_OF(type) *sk,int n,type *v); \
void sk_##type##_zero(STACK_OF(type) *sk); \
int sk_##type##_push(STACK_OF(type) *sk,type *v); \
int sk_##type##_find(STACK_OF(type) *sk,type *v); \
void sk_##type##_delete(STACK_OF(type) *sk,int n); \
type *sk_##type##_delete(STACK_OF(type) *sk,int n); \
void sk_##type##_delete_ptr(STACK_OF(type) *sk,type *v); \
int sk_##type##_insert(STACK_OF(type) *sk,type *v,int n); \
void sk_##type##_set_cmp_func(STACK_OF(type) *sk,int (*cmp)(type **,type **)); \
STACK_OF(type) *sk_##type##_dup(STACK_OF(type) *sk); \
void sk_##type##_pop_free(STACK_OF(type) *sk,void (*func)(type *)); \
@@ -100,10 +101,12 @@ int sk_##type##_push(STACK_OF(type) *sk,type *v) \
    { return sk_push((STACK *)sk,(char *)v); } \
int sk_##type##_find(STACK_OF(type) *sk,type *v) \
    { return sk_find((STACK *)sk,(char *)v); } \
void sk_##type##_delete(STACK_OF(type) *sk,int n) \
    { sk_delete((STACK *)sk,n); } \
type *sk_##type##_delete(STACK_OF(type) *sk,int n) \
    { return (type *)sk_delete((STACK *)sk,n); } \
void sk_##type##_delete_ptr(STACK_OF(type) *sk,type *v) \
    { sk_delete_ptr((STACK *)sk,(char *)v); } \
int sk_##type##_insert(STACK_OF(type) *sk,type *v,int n) \
    { return sk_insert((STACK *)sk,(char *)v,n); } \
void sk_##type##_set_cmp_func(STACK_OF(type) *sk,int (*cmp)(type **,type **)) \
    { sk_set_cmp_func((STACK *)sk,cmp); } \
STACK_OF(type) *sk_##type##_dup(STACK_OF(type) *sk) \
+4 −1
Original line number Diff line number Diff line
@@ -136,10 +136,13 @@ typedef struct X509_name_entry_st
	int size; 	/* temp variable */
	} X509_NAME_ENTRY;

DECLARE_STACK_OF(X509_NAME_ENTRY)
DECLARE_ASN1_SET_OF(X509_NAME_ENTRY)

/* we always keep X509_NAMEs in 2 forms. */
typedef struct X509_name_st
	{
	STACK *entries; /* of X509_NAME_ENTRY */
	STACK_OF(X509_NAME_ENTRY) *entries;
	int modified;	/* true if 'bytes' needs to be built */
#ifdef HEADER_BUFFER_H
	BUF_MEM *bytes;
Loading