Commit 3aceb94b authored by Dr. Stephen Henson's avatar Dr. Stephen Henson
Browse files

Safe stack reorganisation in terms of function casts.

After some messing around this seems to work but needs
a few more tests. Working out the syntax for sk_set_cmp_func()
(cast it to a function that itself returns a function pointer)
was painful :-(

Needs some testing to see what other compilers think of this
syntax.

Also needs similar stuff for ASN1_SET_OF etc etc.
parent fb3e1eeb
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -4,6 +4,19 @@

 Changes between 0.9.5a and 0.9.6  [xx XXX 2000]

  *) Reorganisation of the stack code. The macros are now all 
     collected in safestack.h . Each macro is defined in terms of
     a "stack macro" of the form SKM_<name>(type, a, b). The 
     DEBUG_SAFESTACK is now handled in terms of function casts,
     this has the advantage of retaining type safety without the
     use of additional functions. If DEBUG_SAFESTACK is not defined
     then the non typesafe macros are used instead. Also modified the
     mkstack.pl script to handle the new form. Needs testing to see
     if which (if any) compilers it chokes and maybe make DEBUG_SAFESTACK
     the default if no major problems. Also need analagous stuff for
     ASN1_SET_OF etc.
     [Steve Henson]

  *) When some versions of IIS use the 'NET' form of private key the
     key derivation algorithm is different. Normally MD5(password) is
     used as a 128 bit RC4 key. In the modified case
+0 −124
Original line number Diff line number Diff line
@@ -248,37 +248,6 @@ typedef struct asn1_string_table_st {
} ASN1_STRING_TABLE;

DECLARE_STACK_OF(ASN1_STRING_TABLE)
/* This block of defines is updated by a perl script, please do not touch! */
#ifndef DEBUG_SAFESTACK
	#define sk_ASN1_STRING_TABLE_new(a) sk_new((int (*) \
		(const char * const *, const char * const *))(a))
	#define sk_ASN1_STRING_TABLE_new_null() sk_new_null()
	#define sk_ASN1_STRING_TABLE_free(a) sk_free(a)
	#define sk_ASN1_STRING_TABLE_num(a) sk_num(a)
	#define sk_ASN1_STRING_TABLE_value(a,b) ((ASN1_STRING_TABLE *) \
		sk_value((a),(b)))
	#define sk_ASN1_STRING_TABLE_set(a,b,c) ((ASN1_STRING_TABLE *) \
		sk_set((a),(b),(char *)(c)))
	#define sk_ASN1_STRING_TABLE_zero(a) sk_zero(a)
	#define sk_ASN1_STRING_TABLE_push(a,b) sk_push((a),(char *)(b))
	#define sk_ASN1_STRING_TABLE_unshift(a,b) sk_unshift((a),(b))
	#define sk_ASN1_STRING_TABLE_find(a,b) sk_find((a), (char *)(b))
	#define sk_ASN1_STRING_TABLE_delete(a,b) ((ASN1_STRING_TABLE *) \
		sk_delete((a),(b)))
	#define sk_ASN1_STRING_TABLE_delete_ptr(a,b) ((ASN1_STRING_TABLE *) \
		sk_delete_ptr((a),(char *)(b)))
	#define sk_ASN1_STRING_TABLE_insert(a,b,c) sk_insert((a),(char *)(b),(c))
	#define sk_ASN1_STRING_TABLE_set_cmp_func(a,b) ((int (*) \
		(const ASN1_STRING_TABLE * const *,const ASN1_STRING_TABLE * const *)) \
		sk_set_cmp_func((a),(int (*) \
		(const char * const *, const char * const *))(b)))
	#define sk_ASN1_STRING_TABLE_dup(a) sk_dup(a)
	#define sk_ASN1_STRING_TABLE_pop_free(a,b) sk_pop_free((a),(void (*)(void *))(b))
	#define sk_ASN1_STRING_TABLE_shift(a) ((ASN1_STRING_TABLE *)sk_shift(a))
	#define sk_ASN1_STRING_TABLE_pop(a) ((ASN1_STRING_TABLE *)sk_pop(a))
	#define sk_ASN1_STRING_TABLE_sort(a) sk_sort(a)
#endif /* !DEBUG_SAFESTACK */
/* End of perl script block, you may now edit :-) */

/* size limits: this stuff is taken straight from RFC2459 */

@@ -328,37 +297,6 @@ typedef struct asn1_string_st ASN1_UTF8STRING;
typedef int ASN1_NULL;

DECLARE_STACK_OF(ASN1_INTEGER)
/* This block of defines is updated by a perl script, please do not touch! */
#ifndef DEBUG_SAFESTACK
	#define sk_ASN1_INTEGER_new(a) sk_new((int (*) \
		(const char * const *, const char * const *))(a))
	#define sk_ASN1_INTEGER_new_null() sk_new_null()
	#define sk_ASN1_INTEGER_free(a) sk_free(a)
	#define sk_ASN1_INTEGER_num(a) sk_num(a)
	#define sk_ASN1_INTEGER_value(a,b) ((ASN1_INTEGER *) \
		sk_value((a),(b)))
	#define sk_ASN1_INTEGER_set(a,b,c) ((ASN1_INTEGER *) \
		sk_set((a),(b),(char *)(c)))
	#define sk_ASN1_INTEGER_zero(a) sk_zero(a)
	#define sk_ASN1_INTEGER_push(a,b) sk_push((a),(char *)(b))
	#define sk_ASN1_INTEGER_unshift(a,b) sk_unshift((a),(b))
	#define sk_ASN1_INTEGER_find(a,b) sk_find((a), (char *)(b))
	#define sk_ASN1_INTEGER_delete(a,b) ((ASN1_INTEGER *) \
		sk_delete((a),(b)))
	#define sk_ASN1_INTEGER_delete_ptr(a,b) ((ASN1_INTEGER *) \
		sk_delete_ptr((a),(char *)(b)))
	#define sk_ASN1_INTEGER_insert(a,b,c) sk_insert((a),(char *)(b),(c))
	#define sk_ASN1_INTEGER_set_cmp_func(a,b) ((int (*) \
		(const ASN1_INTEGER * const *,const ASN1_INTEGER * const *)) \
		sk_set_cmp_func((a),(int (*) \
		(const char * const *, const char * const *))(b)))
	#define sk_ASN1_INTEGER_dup(a) sk_dup(a)
	#define sk_ASN1_INTEGER_pop_free(a,b) sk_pop_free((a),(void (*)(void *))(b))
	#define sk_ASN1_INTEGER_shift(a) ((ASN1_INTEGER *)sk_shift(a))
	#define sk_ASN1_INTEGER_pop(a) ((ASN1_INTEGER *)sk_pop(a))
	#define sk_ASN1_INTEGER_sort(a) sk_sort(a)
#endif /* !DEBUG_SAFESTACK */
/* End of perl script block, you may now edit :-) */
DECLARE_ASN1_SET_OF(ASN1_INTEGER)

typedef struct asn1_type_st
@@ -390,37 +328,6 @@ typedef struct asn1_type_st
	} ASN1_TYPE;

DECLARE_STACK_OF(ASN1_TYPE)
/* This block of defines is updated by a perl script, please do not touch! */
#ifndef DEBUG_SAFESTACK
	#define sk_ASN1_TYPE_new(a) sk_new((int (*) \
		(const char * const *, const char * const *))(a))
	#define sk_ASN1_TYPE_new_null() sk_new_null()
	#define sk_ASN1_TYPE_free(a) sk_free(a)
	#define sk_ASN1_TYPE_num(a) sk_num(a)
	#define sk_ASN1_TYPE_value(a,b) ((ASN1_TYPE *) \
		sk_value((a),(b)))
	#define sk_ASN1_TYPE_set(a,b,c) ((ASN1_TYPE *) \
		sk_set((a),(b),(char *)(c)))
	#define sk_ASN1_TYPE_zero(a) sk_zero(a)
	#define sk_ASN1_TYPE_push(a,b) sk_push((a),(char *)(b))
	#define sk_ASN1_TYPE_unshift(a,b) sk_unshift((a),(b))
	#define sk_ASN1_TYPE_find(a,b) sk_find((a), (char *)(b))
	#define sk_ASN1_TYPE_delete(a,b) ((ASN1_TYPE *) \
		sk_delete((a),(b)))
	#define sk_ASN1_TYPE_delete_ptr(a,b) ((ASN1_TYPE *) \
		sk_delete_ptr((a),(char *)(b)))
	#define sk_ASN1_TYPE_insert(a,b,c) sk_insert((a),(char *)(b),(c))
	#define sk_ASN1_TYPE_set_cmp_func(a,b) ((int (*) \
		(const ASN1_TYPE * const *,const ASN1_TYPE * const *)) \
		sk_set_cmp_func((a),(int (*) \
		(const char * const *, const char * const *))(b)))
	#define sk_ASN1_TYPE_dup(a) sk_dup(a)
	#define sk_ASN1_TYPE_pop_free(a,b) sk_pop_free((a),(void (*)(void *))(b))
	#define sk_ASN1_TYPE_shift(a) ((ASN1_TYPE *)sk_shift(a))
	#define sk_ASN1_TYPE_pop(a) ((ASN1_TYPE *)sk_pop(a))
	#define sk_ASN1_TYPE_sort(a) sk_sort(a)
#endif /* !DEBUG_SAFESTACK */
/* End of perl script block, you may now edit :-) */
DECLARE_ASN1_SET_OF(ASN1_TYPE)

typedef struct asn1_method_st
@@ -642,37 +549,6 @@ ASN1_OBJECT * d2i_ASN1_OBJECT(ASN1_OBJECT **a,unsigned char **pp,
			long length);

DECLARE_STACK_OF(ASN1_OBJECT)
/* This block of defines is updated by a perl script, please do not touch! */
#ifndef DEBUG_SAFESTACK
	#define sk_ASN1_OBJECT_new(a) sk_new((int (*) \
		(const char * const *, const char * const *))(a))
	#define sk_ASN1_OBJECT_new_null() sk_new_null()
	#define sk_ASN1_OBJECT_free(a) sk_free(a)
	#define sk_ASN1_OBJECT_num(a) sk_num(a)
	#define sk_ASN1_OBJECT_value(a,b) ((ASN1_OBJECT *) \
		sk_value((a),(b)))
	#define sk_ASN1_OBJECT_set(a,b,c) ((ASN1_OBJECT *) \
		sk_set((a),(b),(char *)(c)))
	#define sk_ASN1_OBJECT_zero(a) sk_zero(a)
	#define sk_ASN1_OBJECT_push(a,b) sk_push((a),(char *)(b))
	#define sk_ASN1_OBJECT_unshift(a,b) sk_unshift((a),(b))
	#define sk_ASN1_OBJECT_find(a,b) sk_find((a), (char *)(b))
	#define sk_ASN1_OBJECT_delete(a,b) ((ASN1_OBJECT *) \
		sk_delete((a),(b)))
	#define sk_ASN1_OBJECT_delete_ptr(a,b) ((ASN1_OBJECT *) \
		sk_delete_ptr((a),(char *)(b)))
	#define sk_ASN1_OBJECT_insert(a,b,c) sk_insert((a),(char *)(b),(c))
	#define sk_ASN1_OBJECT_set_cmp_func(a,b) ((int (*) \
		(const ASN1_OBJECT * const *,const ASN1_OBJECT * const *)) \
		sk_set_cmp_func((a),(int (*) \
		(const char * const *, const char * const *))(b)))
	#define sk_ASN1_OBJECT_dup(a) sk_dup(a)
	#define sk_ASN1_OBJECT_pop_free(a,b) sk_pop_free((a),(void (*)(void *))(b))
	#define sk_ASN1_OBJECT_shift(a) ((ASN1_OBJECT *)sk_shift(a))
	#define sk_ASN1_OBJECT_pop(a) ((ASN1_OBJECT *)sk_pop(a))
	#define sk_ASN1_OBJECT_sort(a) sk_sort(a)
#endif /* !DEBUG_SAFESTACK */
/* End of perl script block, you may now edit :-) */
DECLARE_ASN1_SET_OF(ASN1_OBJECT)

ASN1_STRING *	ASN1_STRING_new(void);
+0 −31
Original line number Diff line number Diff line
@@ -264,37 +264,6 @@ struct bio_st
	};

DECLARE_STACK_OF(BIO)
/* This block of defines is updated by a perl script, please do not touch! */
#ifndef DEBUG_SAFESTACK
	#define sk_BIO_new(a) sk_new((int (*) \
		(const char * const *, const char * const *))(a))
	#define sk_BIO_new_null() sk_new_null()
	#define sk_BIO_free(a) sk_free(a)
	#define sk_BIO_num(a) sk_num(a)
	#define sk_BIO_value(a,b) ((BIO *) \
		sk_value((a),(b)))
	#define sk_BIO_set(a,b,c) ((BIO *) \
		sk_set((a),(b),(char *)(c)))
	#define sk_BIO_zero(a) sk_zero(a)
	#define sk_BIO_push(a,b) sk_push((a),(char *)(b))
	#define sk_BIO_unshift(a,b) sk_unshift((a),(b))
	#define sk_BIO_find(a,b) sk_find((a), (char *)(b))
	#define sk_BIO_delete(a,b) ((BIO *) \
		sk_delete((a),(b)))
	#define sk_BIO_delete_ptr(a,b) ((BIO *) \
		sk_delete_ptr((a),(char *)(b)))
	#define sk_BIO_insert(a,b,c) sk_insert((a),(char *)(b),(c))
	#define sk_BIO_set_cmp_func(a,b) ((int (*) \
		(const BIO * const *,const BIO * const *)) \
		sk_set_cmp_func((a),(int (*) \
		(const char * const *, const char * const *))(b)))
	#define sk_BIO_dup(a) sk_dup(a)
	#define sk_BIO_pop_free(a,b) sk_pop_free((a),(void (*)(void *))(b))
	#define sk_BIO_shift(a) ((BIO *)sk_shift(a))
	#define sk_BIO_pop(a) ((BIO *)sk_pop(a))
	#define sk_BIO_sort(a) sk_sort(a)
#endif /* !DEBUG_SAFESTACK */
/* End of perl script block, you may now edit :-) */

typedef struct bio_f_buffer_ctx_struct
	{
+0 −31
Original line number Diff line number Diff line
@@ -77,37 +77,6 @@ typedef struct
	} CONF_VALUE;

DECLARE_STACK_OF(CONF_VALUE)
/* This block of defines is updated by a perl script, please do not touch! */
#ifndef DEBUG_SAFESTACK
	#define sk_CONF_VALUE_new(a) sk_new((int (*) \
		(const char * const *, const char * const *))(a))
	#define sk_CONF_VALUE_new_null() sk_new_null()
	#define sk_CONF_VALUE_free(a) sk_free(a)
	#define sk_CONF_VALUE_num(a) sk_num(a)
	#define sk_CONF_VALUE_value(a,b) ((CONF_VALUE *) \
		sk_value((a),(b)))
	#define sk_CONF_VALUE_set(a,b,c) ((CONF_VALUE *) \
		sk_set((a),(b),(char *)(c)))
	#define sk_CONF_VALUE_zero(a) sk_zero(a)
	#define sk_CONF_VALUE_push(a,b) sk_push((a),(char *)(b))
	#define sk_CONF_VALUE_unshift(a,b) sk_unshift((a),(b))
	#define sk_CONF_VALUE_find(a,b) sk_find((a), (char *)(b))
	#define sk_CONF_VALUE_delete(a,b) ((CONF_VALUE *) \
		sk_delete((a),(b)))
	#define sk_CONF_VALUE_delete_ptr(a,b) ((CONF_VALUE *) \
		sk_delete_ptr((a),(char *)(b)))
	#define sk_CONF_VALUE_insert(a,b,c) sk_insert((a),(char *)(b),(c))
	#define sk_CONF_VALUE_set_cmp_func(a,b) ((int (*) \
		(const CONF_VALUE * const *,const CONF_VALUE * const *)) \
		sk_set_cmp_func((a),(int (*) \
		(const char * const *, const char * const *))(b)))
	#define sk_CONF_VALUE_dup(a) sk_dup(a)
	#define sk_CONF_VALUE_pop_free(a,b) sk_pop_free((a),(void (*)(void *))(b))
	#define sk_CONF_VALUE_shift(a) ((CONF_VALUE *)sk_shift(a))
	#define sk_CONF_VALUE_pop(a) ((CONF_VALUE *)sk_pop(a))
	#define sk_CONF_VALUE_sort(a) sk_sort(a)
#endif /* !DEBUG_SAFESTACK */
/* End of perl script block, you may now edit :-) */

struct conf_st;
typedef struct conf_st CONF;
+0 −31
Original line number Diff line number Diff line
@@ -201,37 +201,6 @@ typedef struct crypto_ex_data_func_st
	} CRYPTO_EX_DATA_FUNCS;

DECLARE_STACK_OF(CRYPTO_EX_DATA_FUNCS)
/* This block of defines is updated by a perl script, please do not touch! */
#ifndef DEBUG_SAFESTACK
	#define sk_CRYPTO_EX_DATA_FUNCS_new(a) sk_new((int (*) \
		(const char * const *, const char * const *))(a))
	#define sk_CRYPTO_EX_DATA_FUNCS_new_null() sk_new_null()
	#define sk_CRYPTO_EX_DATA_FUNCS_free(a) sk_free(a)
	#define sk_CRYPTO_EX_DATA_FUNCS_num(a) sk_num(a)
	#define sk_CRYPTO_EX_DATA_FUNCS_value(a,b) ((CRYPTO_EX_DATA_FUNCS *) \
		sk_value((a),(b)))
	#define sk_CRYPTO_EX_DATA_FUNCS_set(a,b,c) ((CRYPTO_EX_DATA_FUNCS *) \
		sk_set((a),(b),(char *)(c)))
	#define sk_CRYPTO_EX_DATA_FUNCS_zero(a) sk_zero(a)
	#define sk_CRYPTO_EX_DATA_FUNCS_push(a,b) sk_push((a),(char *)(b))
	#define sk_CRYPTO_EX_DATA_FUNCS_unshift(a,b) sk_unshift((a),(b))
	#define sk_CRYPTO_EX_DATA_FUNCS_find(a,b) sk_find((a), (char *)(b))
	#define sk_CRYPTO_EX_DATA_FUNCS_delete(a,b) ((CRYPTO_EX_DATA_FUNCS *) \
		sk_delete((a),(b)))
	#define sk_CRYPTO_EX_DATA_FUNCS_delete_ptr(a,b) ((CRYPTO_EX_DATA_FUNCS *) \
		sk_delete_ptr((a),(char *)(b)))
	#define sk_CRYPTO_EX_DATA_FUNCS_insert(a,b,c) sk_insert((a),(char *)(b),(c))
	#define sk_CRYPTO_EX_DATA_FUNCS_set_cmp_func(a,b) ((int (*) \
		(const CRYPTO_EX_DATA_FUNCS * const *,const CRYPTO_EX_DATA_FUNCS * const *)) \
		sk_set_cmp_func((a),(int (*) \
		(const char * const *, const char * const *))(b)))
	#define sk_CRYPTO_EX_DATA_FUNCS_dup(a) sk_dup(a)
	#define sk_CRYPTO_EX_DATA_FUNCS_pop_free(a,b) sk_pop_free((a),(void (*)(void *))(b))
	#define sk_CRYPTO_EX_DATA_FUNCS_shift(a) ((CRYPTO_EX_DATA_FUNCS *)sk_shift(a))
	#define sk_CRYPTO_EX_DATA_FUNCS_pop(a) ((CRYPTO_EX_DATA_FUNCS *)sk_pop(a))
	#define sk_CRYPTO_EX_DATA_FUNCS_sort(a) sk_sort(a)
#endif /* !DEBUG_SAFESTACK */
/* End of perl script block, you may now edit :-) */

/* Per class, we have a STACK of CRYPTO_EX_DATA_FUNCS for each CRYPTO_EX_DATA
 * entry.
Loading