Add EX_DATA support to X509.
Fix a bug in the X509_get_d2i() functions which didn't check if crit was NULL.
diff --git a/CHANGES b/CHANGES
index 7cbe4de..12abb95 100644
--- a/CHANGES
+++ b/CHANGES
@@ -4,6 +4,10 @@
 
  Changes between 0.9.4 and 0.9.5  [xx XXX 1999]
 
+  *) Add a CRYPTO_EX_DATA to X509 certificate structure and associated
+     functions.
+     [Steve Henson]
+
   *) New X509V3_{X509,CRL,REVOKED}_get_d2i() functions. These will search
      for, obtain and decode and extension and obtain its critical flag.
      This allows all the necessary extension code to be handled in a
diff --git a/crypto/asn1/x_x509.c b/crypto/asn1/x_x509.c
index 7abf6b2..c428997 100644
--- a/crypto/asn1/x_x509.c
+++ b/crypto/asn1/x_x509.c
@@ -62,6 +62,9 @@
 #include <openssl/asn1_mac.h>
 #include <openssl/x509.h>
 
+static int x509_meth_num = 0;
+static STACK *x509_meth = NULL;
+
 static ASN1_METHOD meth={
 	(int (*)())  i2d_X509,
 	(char *(*)())d2i_X509,
@@ -117,6 +120,7 @@
 	M_ASN1_New(ret->cert_info,X509_CINF_new);
 	M_ASN1_New(ret->sig_alg,X509_ALGOR_new);
 	M_ASN1_New(ret->signature,ASN1_BIT_STRING_new);
+	CRYPTO_new_ex_data(x509_meth, (char *)ret, &ret->ex_data);
 	return(ret);
 	M_ASN1_New_Error(ASN1_F_X509_NEW);
 	}
@@ -140,7 +144,7 @@
 		}
 #endif
 
-	/* CRYPTO_free_ex_data(bio_meth,(char *)a,&a->ex_data); */
+	CRYPTO_free_ex_data(x509_meth,(char *)a,&a->ex_data);
 	X509_CINF_free(a->cert_info);
 	X509_ALGOR_free(a->sig_alg);
 	ASN1_BIT_STRING_free(a->signature);
@@ -149,3 +153,21 @@
 	Free((char *)a);
 	}
 
+int X509_get_ex_new_index(long argl, char *argp, int (*new_func)(),
+	     int (*dup_func)(), void (*free_func)())
+        {
+	x509_meth_num++;
+	return(CRYPTO_get_ex_new_index(x509_meth_num-1,
+		&x509_meth,argl,argp,new_func,dup_func,free_func));
+        }
+
+int X509_set_ex_data(X509 *r, int idx, char *arg)
+	{
+	return(CRYPTO_set_ex_data(&r->ex_data,idx,arg));
+	}
+
+char *X509_get_ex_data(X509 *r, int idx)
+	{
+	return(CRYPTO_get_ex_data(&r->ex_data,idx));
+	}
+
diff --git a/crypto/x509/x509.h b/crypto/x509/x509.h
index 17319fe..36772b5 100644
--- a/crypto/x509/x509.h
+++ b/crypto/x509/x509.h
@@ -238,6 +238,7 @@
 	int valid;
 	int references;
 	char *name;
+	CRYPTO_EX_DATA ex_data;
 	} X509;
 
 DECLARE_STACK_OF(X509)
@@ -724,6 +725,10 @@
 void		X509_free(X509 *a);
 int		i2d_X509(X509 *a,unsigned char **pp);
 X509 *		d2i_X509(X509 **a,unsigned char **pp,long length);
+int X509_get_ex_new_index(long argl, char *argp, int (*new_func)(),
+	     int (*dup_func)(), void (*free_func)());
+int X509_set_ex_data(X509 *r, int idx, char *arg);
+char *X509_get_ex_data(X509 *r, int idx);
 
 X509_REVOKED *	X509_REVOKED_new(void);
 void		X509_REVOKED_free(X509_REVOKED *a);
diff --git a/crypto/x509v3/v3_lib.c b/crypto/x509v3/v3_lib.c
index 06def2a..6219d27 100644
--- a/crypto/x509v3/v3_lib.c
+++ b/crypto/x509v3/v3_lib.c
@@ -219,7 +219,7 @@
 	}
 	if(found_ex) {
 		/* Found it */
-		*crit = found_ex->critical;
+		if(crit) *crit = found_ex->critical;
 		return X509V3_EXT_d2i(found_ex);
 	}