From 3495fdf0260b1287dbcc537abe88e7fcf890a1068c1c04157e6f8e05439338cf Mon Sep 17 00:00:00 2001 From: OBS User unknown Date: Thu, 14 Jun 2007 22:27:50 +0000 Subject: [PATCH] OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/openssl?expand=0&rev=6 --- openssl-gcc42.patch | 276 ++++++++++++++++++++++++++++++++++++++++++++ openssl.changes | 19 +++ openssl.spec | 18 ++- 3 files changed, 311 insertions(+), 2 deletions(-) create mode 100644 openssl-gcc42.patch diff --git a/openssl-gcc42.patch b/openssl-gcc42.patch new file mode 100644 index 0000000..7536ea8 --- /dev/null +++ b/openssl-gcc42.patch @@ -0,0 +1,276 @@ +From: Peter Hartley +Subject: [PATCH] OpenSSL vs GCC 4.2.0 +To: openssl-dev@openssl.org +Date: Tue, 22 May 2007 11:59:13 +0100 +Reply-To: openssl-dev@openssl.org + +Hi there, + +Having just downloaded GCC 4.2.0 and discovered that it can't build +OpenSSL (not even in the snapshots AFAICT), I'd like to offer a possible +solution. + +The earlier thread on openssl-dev explains that OpenSSL chooses to cast +the function pointers, not the parameters, to achieve type-safety; i.e. +to ensure that errors occur if the wrong types are passed to the +XYZ_of() functions. + +So how about using expressions of the form + (void*)(1 ? x : ((T*)NULL)) +instead? That way, if x isn't of the right type, GCC will warn because +the ?: gets different types in the two branches. Meanwhile the function +itself is getting called with the correct types, and while OpenSSL is +still "deceiving" the type system, it's doing so only via function +pointers (so there's no way that the compiler, examining any one +translation unit, can "tell" that deception is being attempted). And the +compiler should easily spot that the condition ("1") is always true, and +so generate no extra code compared to the direct, non-typesafe call. + +--- crypto/asn1/asn1.h~ 2007-04-14 19:00:19.000000000 +0100 ++++ crypto/asn1/asn1.h 2007-05-16 14:48:27.000000000 +0100 +@@ -329,6 +329,17 @@ typedef struct ASN1_VALUE_st ASN1_VALUE; + #define I2D_OF(type) int (*)(type *,unsigned char **) + #define I2D_OF_const(type) int (*)(const type *,unsigned char **) + ++#define CHECKED_D2I_OF(type, d2i) \ ++ ((d2i_of_void*) (1 ? d2i : ((D2I_OF(type))0))) ++#define CHECKED_I2D_OF(type, i2d) \ ++ ((i2d_of_void*) (1 ? i2d : ((I2D_OF(type))0))) ++#define CHECKED_NEW_OF(type, xnew) \ ++ ((void *(*)(void)) (1 ? xnew : ((type *(*)(void))0))) ++#define CHECKED_PTR_OF(type, p) \ ++ ((void*) (1 ? p : (type*)0)) ++#define CHECKED_PPTR_OF(type, p) \ ++ ((void**) (1 ? p : (type**)0)) ++ + #define TYPEDEF_D2I_OF(type) typedef type *d2i_of_##type(type **,const unsigned char **,long) + #define TYPEDEF_I2D_OF(type) typedef int i2d_of_##type(type *,unsigned char **) + #define TYPEDEF_D2I2D_OF(type) TYPEDEF_D2I_OF(type); TYPEDEF_I2D_OF(type) +@@ -914,23 +925,41 @@ int ASN1_object_size(int constructed, in + + /* Used to implement other functions */ + void *ASN1_dup(i2d_of_void *i2d, d2i_of_void *d2i, char *x); ++ + #define ASN1_dup_of(type,i2d,d2i,x) \ +- ((type *(*)(I2D_OF(type),D2I_OF(type),type *))openssl_fcast(ASN1_dup))(i2d,d2i,x) ++ ((type*)ASN1_dup(CHECKED_I2D_OF(type, i2d), \ ++ CHECKED_D2I_OF(type, d2i), \ ++ CHECKED_PTR_OF(type, x))) ++ + #define ASN1_dup_of_const(type,i2d,d2i,x) \ +- ((type *(*)(I2D_OF_const(type),D2I_OF(type),type *))openssl_fcast(ASN1_dup))(i2d,d2i,x) ++ ((type*)ASN1_dup(CHECKED_I2D_OF(const type, i2d), \ ++ CHECKED_D2I_OF(type, d2i), \ ++ CHECKED_PTR_OF(const type, x))) + + void *ASN1_item_dup(const ASN1_ITEM *it, void *x); + + #ifndef OPENSSL_NO_FP_API + void *ASN1_d2i_fp(void *(*xnew)(void), d2i_of_void *d2i, FILE *in, void **x); ++ + #define ASN1_d2i_fp_of(type,xnew,d2i,in,x) \ +- ((type *(*)(type *(*)(void),D2I_OF(type),FILE *,type **))openssl_fcast(ASN1_d2i_fp))(xnew,d2i,in,x) ++ ((type*)ASN1_d2i_fp(CHECKED_NEW_OF(type, xnew), \ ++ CHECKED_D2I_OF(type, d2i), \ ++ in, \ ++ CHECKED_PPTR_OF(type, x))) ++ + void *ASN1_item_d2i_fp(const ASN1_ITEM *it, FILE *in, void *x); + int ASN1_i2d_fp(i2d_of_void *i2d,FILE *out,void *x); ++ + #define ASN1_i2d_fp_of(type,i2d,out,x) \ +- ((int (*)(I2D_OF(type),FILE *,type *))openssl_fcast(ASN1_i2d_fp))(i2d,out,x) ++ (ASN1_i2d_fp(CHECKED_I2D_OF(type, i2d), \ ++ out, \ ++ CHECKED_PTR_OF(type, x))) ++ + #define ASN1_i2d_fp_of_const(type,i2d,out,x) \ +- ((int (*)(I2D_OF_const(type),FILE *,type *))openssl_fcast(ASN1_i2d_fp))(i2d,out,x) ++ (ASN1_i2d_fp(CHECKED_I2D_OF(const type, i2d), \ ++ out, \ ++ CHECKED_PTR_OF(const type, x))) ++ + int ASN1_item_i2d_fp(const ASN1_ITEM *it, FILE *out, void *x); + int ASN1_STRING_print_ex_fp(FILE *fp, ASN1_STRING *str, unsigned long flags); + #endif +@@ -939,14 +968,26 @@ int ASN1_STRING_to_UTF8(unsigned char ** + + #ifndef OPENSSL_NO_BIO + void *ASN1_d2i_bio(void *(*xnew)(void), d2i_of_void *d2i, BIO *in, void **x); ++ + #define ASN1_d2i_bio_of(type,xnew,d2i,in,x) \ +- ((type *(*)(type *(*)(void),D2I_OF(type),BIO *,type **))openssl_fcast(ASN1_d2i_bio))(xnew,d2i,in,x) ++ ((type*)ASN1_d2i_bio( CHECKED_NEW_OF(type, xnew), \ ++ CHECKED_D2I_OF(type, d2i), \ ++ in, \ ++ CHECKED_PPTR_OF(type, x))) ++ + void *ASN1_item_d2i_bio(const ASN1_ITEM *it, BIO *in, void *x); + int ASN1_i2d_bio(i2d_of_void *i2d,BIO *out, unsigned char *x); ++ + #define ASN1_i2d_bio_of(type,i2d,out,x) \ +- ((int (*)(I2D_OF(type),BIO *,type *))openssl_fcast(ASN1_i2d_bio))(i2d,out,x) ++ (ASN1_i2d_bio(CHECKED_I2D_OF(type, i2d), \ ++ out, \ ++ CHECKED_PTR_OF(type, x))) ++ + #define ASN1_i2d_bio_of_const(type,i2d,out,x) \ +- ((int (*)(I2D_OF_const(type),BIO *,const type *))openssl_fcast(ASN1_i2d_bio))(i2d,out,x) ++ (ASN1_i2d_bio(CHECKED_I2D_OF(const type, i2d), \ ++ out, \ ++ CHECKED_PTR_OF(const type, x))) ++ + int ASN1_item_i2d_bio(const ASN1_ITEM *it, BIO *out, void *x); + int ASN1_UTCTIME_print(BIO *fp, const ASN1_UTCTIME *a); + int ASN1_GENERALIZEDTIME_print(BIO *fp, const ASN1_GENERALIZEDTIME *a); +@@ -983,8 +1024,12 @@ void *ASN1_unpack_string(ASN1_STRING *oc + void *ASN1_item_unpack(ASN1_STRING *oct, const ASN1_ITEM *it); + ASN1_STRING *ASN1_pack_string(void *obj, i2d_of_void *i2d, + ASN1_OCTET_STRING **oct); ++ + #define ASN1_pack_string_of(type,obj,i2d,oct) \ +- ((ASN1_STRING *(*)(type *,I2D_OF(type),ASN1_OCTET_STRING **))openssl_fcast(ASN1_pack_string))(obj,i2d,oct) ++ (ASN1_pack_string(CHECKED_PTR_OF(type, obj), \ ++ CHECKED_I2D_OF(type, i2d), \ ++ oct)) ++ + ASN1_STRING *ASN1_item_pack(void *obj, const ASN1_ITEM *it, ASN1_OCTET_STRING **oct); + + void ASN1_STRING_set_default_mask(unsigned long mask); +--- crypto/pem/pem.h~ 2007-04-05 18:00:52.000000000 +0100 ++++ crypto/pem/pem.h 2007-05-16 14:48:42.000000000 +0100 +@@ -221,19 +221,28 @@ typedef struct pem_ctx_st + #define IMPLEMENT_PEM_read_fp(name, type, str, asn1) \ + type *PEM_read_##name(FILE *fp, type **x, pem_password_cb *cb, void *u)\ + { \ +-return(((type *(*)(D2I_OF(type),char *,FILE *,type **,pem_password_cb *,void *))openssl_fcast(PEM_ASN1_read))(d2i_##asn1, str,fp,x,cb,u)); \ ++ return (type*)PEM_ASN1_read(CHECKED_D2I_OF(type, d2i_##asn1), \ ++ str, fp, \ ++ CHECKED_PPTR_OF(type, x), \ ++ cb, u); \ + } + + #define IMPLEMENT_PEM_write_fp(name, type, str, asn1) \ + int PEM_write_##name(FILE *fp, type *x) \ + { \ +-return(((int (*)(I2D_OF(type),const char *,FILE *,type *, const EVP_CIPHER *,unsigned char *,int, pem_password_cb *,void *))openssl_fcast(PEM_ASN1_write))(i2d_##asn1,str,fp,x,NULL,NULL,0,NULL,NULL)); \ ++ return PEM_ASN1_write(CHECKED_I2D_OF(type, i2d_##asn1), \ ++ str, fp, \ ++ CHECKED_PTR_OF(type, x), \ ++ NULL, NULL, 0, NULL, NULL); \ + } + + #define IMPLEMENT_PEM_write_fp_const(name, type, str, asn1) \ + int PEM_write_##name(FILE *fp, const type *x) \ + { \ +-return(((int (*)(I2D_OF_const(type),const char *,FILE *, const type *, const EVP_CIPHER *,unsigned char *,int, pem_password_cb *,void *))openssl_fcast(PEM_ASN1_write))(i2d_##asn1,str,fp,x,NULL,NULL,0,NULL,NULL)); \ ++ return PEM_ASN1_write(CHECKED_I2D_OF(const type, i2d_##asn1), \ ++ str, fp, \ ++ CHECKED_PTR_OF(const type, x), \ ++ NULL, NULL, 0, NULL, NULL); \ + } + + #define IMPLEMENT_PEM_write_cb_fp(name, type, str, asn1) \ +@@ -241,7 +250,10 @@ int PEM_write_##name(FILE *fp, type *x, + unsigned char *kstr, int klen, pem_password_cb *cb, \ + void *u) \ + { \ +- return(((int (*)(I2D_OF(type),const char *,FILE *,type *, const EVP_CIPHER *,unsigned char *,int, pem_password_cb *,void *))openssl_fcast(PEM_ASN1_write))(i2d_##asn1,str,fp,x,enc,kstr,klen,cb,u)); \ ++ return PEM_ASN1_write(CHECKED_I2D_OF(type, i2d_##asn1), \ ++ str, fp, \ ++ CHECKED_PTR_OF(type, x), \ ++ enc, kstr, klen, cb, u); \ + } + + #define IMPLEMENT_PEM_write_cb_fp_const(name, type, str, asn1) \ +@@ -249,7 +261,10 @@ int PEM_write_##name(FILE *fp, type *x, + unsigned char *kstr, int klen, pem_password_cb *cb, \ + void *u) \ + { \ +- return(((int (*)(I2D_OF_const(type),const char *,FILE *,type *, const EVP_CIPHER *,unsigned char *,int, pem_password_cb *,void *))openssl_fcast(PEM_ASN1_write))(i2d_##asn1,str,fp,x,enc,kstr,klen,cb,u)); \ ++ return PEM_ASN1_write(CHECKED_I2D_OF(const type, i2d_##asn1), \ ++ str, fp, \ ++ CHECKED_PTR_OF(const type, x), \ ++ enc, kstr, klen, cb, u); \ + } + + #endif +@@ -257,33 +272,48 @@ int PEM_write_##name(FILE *fp, type *x, + #define IMPLEMENT_PEM_read_bio(name, type, str, asn1) \ + type *PEM_read_bio_##name(BIO *bp, type **x, pem_password_cb *cb, void *u)\ + { \ +-return(((type *(*)(D2I_OF(type),const char *,BIO *,type **,pem_password_cb *,void *))openssl_fcast(PEM_ASN1_read_bio))(d2i_##asn1, str,bp,x,cb,u)); \ ++ return (type*)PEM_ASN1_read_bio(CHECKED_D2I_OF(type, d2i_##asn1), \ ++ str, bp, \ ++ CHECKED_PPTR_OF(type, x), \ ++ cb, u); \ + } + + #define IMPLEMENT_PEM_write_bio(name, type, str, asn1) \ + int PEM_write_bio_##name(BIO *bp, type *x) \ + { \ +-return(((int (*)(I2D_OF(type),const char *,BIO *,type *, const EVP_CIPHER *,unsigned char *,int, pem_password_cb *,void *))openssl_fcast(PEM_ASN1_write_bio))(i2d_##asn1,str,bp,x,NULL,NULL,0,NULL,NULL)); \ ++ return PEM_ASN1_write_bio(CHECKED_I2D_OF(type, i2d_##asn1), \ ++ str, bp, \ ++ CHECKED_PTR_OF(type, x), \ ++ NULL, NULL, 0, NULL, NULL); \ + } + + #define IMPLEMENT_PEM_write_bio_const(name, type, str, asn1) \ + int PEM_write_bio_##name(BIO *bp, const type *x) \ + { \ +-return(((int (*)(I2D_OF_const(type),const char *,BIO *,const type *, const EVP_CIPHER *,unsigned char *,int, pem_password_cb *,void *))openssl_fcast(PEM_ASN1_write_bio))(i2d_##asn1,str,bp,x,NULL,NULL,0,NULL,NULL)); \ ++ return PEM_ASN1_write_bio(CHECKED_I2D_OF(const type, i2d_##asn1), \ ++ str, bp, \ ++ CHECKED_PTR_OF(const type, x), \ ++ NULL, NULL, 0, NULL, NULL); \ + } + + #define IMPLEMENT_PEM_write_cb_bio(name, type, str, asn1) \ + int PEM_write_bio_##name(BIO *bp, type *x, const EVP_CIPHER *enc, \ + unsigned char *kstr, int klen, pem_password_cb *cb, void *u) \ + { \ +- return(((int (*)(I2D_OF(type),const char *,BIO *,type *,const EVP_CIPHER *,unsigned char *,int,pem_password_cb *,void *))openssl_fcast(PEM_ASN1_write_bio))(i2d_##asn1,str,bp,x,enc,kstr,klen,cb,u)); \ ++ return PEM_ASN1_write_bio(CHECKED_I2D_OF(type, i2d_##asn1), \ ++ str, bp, \ ++ CHECKED_PTR_OF(type, x), \ ++ enc, kstr, klen, cb, u); \ + } + + #define IMPLEMENT_PEM_write_cb_bio_const(name, type, str, asn1) \ + int PEM_write_bio_##name(BIO *bp, type *x, const EVP_CIPHER *enc, \ + unsigned char *kstr, int klen, pem_password_cb *cb, void *u) \ + { \ +- return(((int (*)(I2D_OF_const(type),const char *,BIO *,type *,const EVP_CIPHER *,unsigned char *,int,pem_password_cb *,void *))openssl_fcast(PEM_ASN1_write_bio))(i2d_##asn1,str,bp,x,enc,kstr,klen,cb,u)); \ ++ return PEM_ASN1_write_bio(CHECKED_I2D_OF(const type, i2d_##asn1), \ ++ str, bp, \ ++ CHECKED_PTR_OF(const type, x), \ ++ enc, kstr, klen, cb, u); \ + } + + #define IMPLEMENT_PEM_write(name, type, str, asn1) \ +@@ -414,13 +444,22 @@ int PEM_bytes_read_bio(unsigned char **p + pem_password_cb *cb, void *u); + void * PEM_ASN1_read_bio(d2i_of_void *d2i, const char *name, BIO *bp, + void **x, pem_password_cb *cb, void *u); ++ + #define PEM_ASN1_read_bio_of(type,d2i,name,bp,x,cb,u) \ +-((type *(*)(D2I_OF(type),const char *,BIO *,type **,pem_password_cb *,void *))openssl_fcast(PEM_ASN1_read_bio))(d2i,name,bp,x,cb,u) ++ ((type*)PEM_ASN1_read_bio(CHECKED_D2I_OF(type, d2i), \ ++ name, bp, \ ++ CHECKED_PPTR_OF(type, x), \ ++ cb, u)) ++ + int PEM_ASN1_write_bio(i2d_of_void *i2d,const char *name,BIO *bp,char *x, + const EVP_CIPHER *enc,unsigned char *kstr,int klen, + pem_password_cb *cb, void *u); ++ + #define PEM_ASN1_write_bio_of(type,i2d,name,bp,x,enc,kstr,klen,cb,u) \ +- ((int (*)(I2D_OF(type),const char *,BIO *,type *, const EVP_CIPHER *,unsigned char *,int, pem_password_cb *,void *))openssl_fcast(PEM_ASN1_write_bio))(i2d,name,bp,x,enc,kstr,klen,cb,u) ++ (PEM_ASN1_write_bio(CHECKED_I2D_OF(type, i2d), \ ++ name, bp, \ ++ CHECKED_PTR_OF(type, x), \ ++ enc, kstr, klen, cb, u)) + + STACK_OF(X509_INFO) * PEM_X509_INFO_read_bio(BIO *bp, STACK_OF(X509_INFO) *sk, pem_password_cb *cb, void *u); + int PEM_X509_INFO_write_bio(BIO *bp,X509_INFO *xi, EVP_CIPHER *enc, diff --git a/openssl.changes b/openssl.changes index 0c71a1a..67bc642 100644 --- a/openssl.changes +++ b/openssl.changes @@ -1,3 +1,22 @@ +------------------------------------------------------------------- +Thu May 24 16:18:50 CEST 2007 - mkoenig@suse.de + +- fix build with gcc-4.2 + openssl-gcc42.patch +- do not install example scripts with executable permissions + +------------------------------------------------------------------- +Mon Apr 30 01:32:44 CEST 2007 - ro@suse.de + +- adapt requires + +------------------------------------------------------------------- +Fri Apr 27 15:25:13 CEST 2007 - mkoenig@suse.de + +- Do not use dots in package name +- explicitly build with gcc-4.1 because of currently unresolved + failures with gcc-4.2 + ------------------------------------------------------------------- Wed Apr 25 12:32:44 CEST 2007 - mkoenig@suse.de diff --git a/openssl.spec b/openssl.spec index f96ed45..89996de 100644 --- a/openssl.spec +++ b/openssl.spec @@ -19,7 +19,7 @@ Group: Productivity/Networking/Security Provides: ssl Autoreqprov: on Version: 0.9.8e -Release: 12 +Release: 25 Summary: Secure Sockets and Transport Layer Security URL: http://www.openssl.org/ Source: http://www.%{name}.org/source/%{name}-%{version}.tar.bz2 @@ -38,6 +38,7 @@ Patch11: openssl-s390-config.diff Patch20: openssl-0.9.8a.ca-app-segfault.bug128655.dif Patch21: bswap.diff Patch22: openssl-0.9.8-key_length.patch +Patch23: openssl-gcc42.patch BuildRoot: %{_tmppath}/%{name}-%{version}-build Requires: libopenssl0_9_8 @@ -196,6 +197,7 @@ Authors: %patch20 -p1 %patch21 %patch22 -p1 +%patch23 cp -p %{S:10} . cp -p %{S:20} certs/ cp -p %{S:21} certs/ @@ -359,6 +361,8 @@ gcc $RPM_OPT_FLAGS -I${RPM_BUILD_ROOT}%{_includedir} -c showciphers.c gcc -o showciphers showciphers.o -L${RPM_BUILD_ROOT}%{_libdir} -lssl -lcrypto LD_LIBRARY_PATH=${RPM_BUILD_ROOT}%{_libdir} ./showciphers > AVAILABLE_CIPHERS || true cat AVAILABLE_CIPHERS +# Do not install demo scripts executable under /usr/share/doc +find demos -type f -perm /111 -exec chmod 644 {} \; %clean if ! test -f /.buildenv; then rm -rf $RPM_BUILD_ROOT; fi @@ -390,7 +394,7 @@ if ! test -f /.buildenv; then rm -rf $RPM_BUILD_ROOT; fi %files doc -f filelist.doc %defattr(-, root, root) %doc doc/* demos -%doc showciphers showciphers.c +%doc showciphers.c %files -f filelist %defattr(-, root, root) @@ -409,6 +413,16 @@ if ! test -f /.buildenv; then rm -rf $RPM_BUILD_ROOT; fi %{ssletcdir}/certs %changelog +* Thu May 24 2007 - mkoenig@suse.de +- fix build with gcc-4.2 + openssl-gcc42.patch +- do not install example scripts with executable permissions +* Mon Apr 30 2007 - ro@suse.de +- adapt requires +* Fri Apr 27 2007 - mkoenig@suse.de +- Do not use dots in package name +- explicitly build with gcc-4.1 because of currently unresolved + failures with gcc-4.2 * Wed Apr 25 2007 - mkoenig@suse.de - Split/rename package to follow library packaging policy [#260219] New package libopenssl0.9.8 containing shared libs