File kdelibs-fix-x509-store-ctx-used-twice.patch of Package kdelibs3

diff -Naru kdelibs-3.5.10_orig/kio/kssl/ksslcertificate.cc kdelibs-3.5.10/kio/kssl/ksslcertificate.cc
--- kdelibs-3.5.10_orig/kio/kssl/ksslcertificate.cc	2022-12-02 13:17:24.723336768 +0900
+++ kdelibs-3.5.10/kio/kssl/ksslcertificate.cc	2022-12-02 17:43:52.244391573 +0900
@@ -691,7 +691,7 @@
 #ifdef KSSL_HAVE_SSL
 	X509_STORE *certStore;
 	X509_LOOKUP *certLookup;
-	X509_STORE_CTX *certStoreCTX;
+	X509_STORE_CTX *certStoreCTX, *certStoreCTXServer;
 	int rc = 0;
 
 	if (!d->m_cert)
@@ -747,24 +747,32 @@
 
 		// This is the checking code
 		certStoreCTX = d->kossl->X509_STORE_CTX_new();
+		certStoreCTXServer = d->kossl->X509_STORE_CTX_new();
 
 		// this is a bad error - could mean no free memory.
 		// This may be the wrong thing to do here
-		if (!certStoreCTX) {
+		if ((!certStoreCTX) || (!certStoreCTXServer)) {
 			kdDebug(7029) << "KSSL couldn't create an X509 store context." << endl;
 			d->kossl->X509_STORE_free(certStore);
+			if (certStoreCTX)
+			  d->kossl->X509_STORE_CTX_free(certStoreCTX);
+			if (certStoreCTXServer)
+			  d->kossl->X509_STORE_CTX_free(certStoreCTXServer);
 			continue;
 		}
 
 		d->kossl->X509_STORE_CTX_init(certStoreCTX, certStore, d->m_cert, NULL);
+		d->kossl->X509_STORE_CTX_init(certStoreCTXServer, certStore, d->m_cert, NULL);
 		if (d->_chain.isValid()) {
 			d->kossl->X509_STORE_CTX_set_chain(certStoreCTX, (STACK_OF(X509)*)d->_chain.rawChain());
+			d->kossl->X509_STORE_CTX_set_chain(certStoreCTXServer, (STACK_OF(X509)*)d->_chain.rawChain());
 		}
 
 		//kdDebug(7029) << "KSSL setting CRL.............." << endl;
 		// int X509_STORE_add_crl(X509_STORE *ctx, X509_CRL *x);
 
 		d->kossl->X509_STORE_CTX_set_purpose(certStoreCTX, purposeToOpenSSL(purpose));
+		d->kossl->X509_STORE_CTX_set_purpose(certStoreCTXServer, purposeToOpenSSL(purpose));
 
 		KSSL_X509CallBack_ca = ca ? ca->d->m_cert : 0;
 		KSSL_X509CallBack_ca_found = false;
@@ -789,23 +797,24 @@
 		if (	(ksslv != KSSLCertificate::Ok) &&
 			(ksslv != KSSLCertificate::Irrelevant) &&
 			purpose == KSSLCertificate::SSLServer) {
-			d->kossl->X509_STORE_CTX_set_purpose(certStoreCTX,
+			d->kossl->X509_STORE_CTX_set_purpose(certStoreCTXServer,
 						X509_PURPOSE_NS_SSL_SERVER);
 
 #if OPENSSL_VERSION_NUMBER >= 0x10100000L
-                        X509_STORE_CTX_set_error(certStoreCTX, X509_V_OK);
+                        X509_STORE_CTX_set_error(certStoreCTXServer, X509_V_OK);
 #else
-			certStoreCTX->error = X509_V_OK;
+			certStoreCTXServer->error = X509_V_OK;
 #endif
-			rc = d->kossl->X509_verify_cert(certStoreCTX);
+			rc = d->kossl->X509_verify_cert(certStoreCTXServer);
 #if OPENSSL_VERSION_NUMBER >= 0x10100000L
-			errcode = X509_STORE_CTX_get_error(certStoreCTX);
+			errcode = X509_STORE_CTX_get_error(certStoreCTXServer);
 #else
-			errcode = certStoreCTX->error;
+			errcode = certStoreCTXServer->error;
 #endif
 			ksslv = processError(errcode);
 		}
 		d->kossl->X509_STORE_CTX_free(certStoreCTX);
+		d->kossl->X509_STORE_CTX_free(certStoreCTXServer);
 		d->kossl->X509_STORE_free(certStore);
 		// end of checking code
 		//
openSUSE Build Service is sponsored by