From 2688725eb73234a8870411017f85ec2fda6c80cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Klitzing?= Date: Mon, 19 Jan 2015 12:53:01 +0100 Subject: [PATCH] Use a union for different openssl types Since the algorithm can only be one the underlying structure can share the same memory. Change-Id: Ifeaa1a2d5c4ad3566cbbf847445b805876275260 Reviewed-by: Olivier Goffart (Woboq GmbH) Reviewed-by: Richard J. Moore --- src/network/ssl/qsslkey_openssl.cpp | 8 ++++---- src/network/ssl/qsslkey_p.h | 17 ++++++----------- 2 files changed, 10 insertions(+), 15 deletions(-) diff --git a/src/network/ssl/qsslkey_openssl.cpp b/src/network/ssl/qsslkey_openssl.cpp index 9053d20905..66995206fc 100644 --- a/src/network/ssl/qsslkey_openssl.cpp +++ b/src/network/ssl/qsslkey_openssl.cpp @@ -52,24 +52,24 @@ void QSslKeyPrivate::clear(bool deep) isNull = true; if (!QSslSocket::supportsSsl()) return; - if (rsa) { + if (algorithm == QSsl::Rsa && rsa) { if (deep) q_RSA_free(rsa); rsa = 0; } - if (dsa) { + if (algorithm == QSsl::Dsa && dsa) { if (deep) q_DSA_free(dsa); dsa = 0; } #ifndef OPENSSL_NO_EC - if (ec) { + if (algorithm == QSsl::Ec && ec) { if (deep) q_EC_KEY_free(ec); ec = 0; } #endif - if (opaque) { + if (algorithm == QSsl::Opaque && opaque) { if (deep) q_EVP_PKEY_free(opaque); opaque = 0; diff --git a/src/network/ssl/qsslkey_p.h b/src/network/ssl/qsslkey_p.h index f557831c2c..acd16044e8 100644 --- a/src/network/ssl/qsslkey_p.h +++ b/src/network/ssl/qsslkey_p.h @@ -62,13 +62,6 @@ class QSslKeyPrivate public: inline QSslKeyPrivate() : opaque(0) -#ifndef QT_NO_OPENSSL - , rsa(0) - , dsa(0) -#ifndef OPENSSL_NO_EC - , ec(0) -#endif -#endif { clear(); } @@ -97,12 +90,14 @@ public: QSsl::KeyType type; QSsl::KeyAlgorithm algorithm; #ifndef QT_NO_OPENSSL - EVP_PKEY *opaque; - RSA *rsa; - DSA *dsa; + union { + EVP_PKEY *opaque; + RSA *rsa; + DSA *dsa; #ifndef OPENSSL_NO_EC - EC_KEY *ec; + EC_KEY *ec; #endif + }; #else enum Cipher { DesCbc,