On Wed, Nov 08, 2006 at 12:47:03PM -0800, David Schwartz wrote:
>
> > But it gets cast back to the correct type before it is called. These
> > casts are done the way they are to get type-safety. Removing that option
> > strikes me as a bad thing.
>
> It does not. Look closely at how these functions work:
>
> char *PEM_ASN1_read_bio(char *(*d2i)(), const char *name, BIO *bp, char **x,
> pem_password_cb *cb, void *u)
That seems to be 0.9.7 code, in 0.9.8 it looks like:
void *PEM_ASN1_read_bio(d2i_of_void *d2i, const char *name, BIO *bp, void **x,
pem_password_cb *cb, void *u)
And we have:
typedef void *d2i_of_void(void **,const unsigned char **,long);
The example mentioned in on the gcc list seems to be:
X509 *PEM_read_X509_AUX(FILE *fp, X509 **x, pem_password_cb *cb, void *u)
{
return(((X509 *(*)(X509 *(*)(X509 **,const unsigned char **,long),char
*,FILE *,X509 **,pem_password_cb *,void
*))((openssl_fptr)PEM_ASN1_read))(d2i_X509_AUX, "TRUSTED
CERTIFICATE",fp,x,cb,u));
}
We have:
void * PEM_ASN1_read(d2i_of_void *d2i, const char *name, FILE *fp, void **x,
pem_password_cb *cb, void *u);
What happens here is that PEM_ASN1_read() first gets cast to an
openssl_fptr which is:
typedef void (*openssl_fptr)(void);
And then to an:
X509 *(*)(X509 *(*)(X509 **,const unsigned char **,long),char *,FILE
*,X509 **,pem_password_cb *,void *)
And we have:
X509 * d2i_X509_AUX(X509 **a,const unsigned char **pp,long length);
What I think the problem is, is that you use "d2i_of_void *d2i" while
you mean "d2i_of_void d2i".
d2i_of_void *d2i would be a pointer to a pointer to a function, while
d2i_of_void d2i would be just a pointer to a function.
Kurt
______________________________________________________________________
OpenSSL Project http://www.openssl.org
Development Mailing List [email protected]
Automated List Manager [EMAIL PROTECTED]