Sophie

Sophie

distrib > Mageia > 5 > i586 > by-pkgid > 38cf76df72bccd3dd06e725308c0c5b2 > files > 4

kwallet-5.5.0-3.mga5.src.rpm

From d14b2da6fe4d4ed415c6a8f2361ce4e5fc685d2d Mon Sep 17 00:00:00 2001
From: Valentin Rusu <kde@rusu.info>
Date: Tue, 17 Feb 2015 22:45:03 +0100
Subject: [PATCH] Retrofitting the fix for a bug found in Applications/14.12

Commit 345e36a8b35 from Applications/14.12
Fix for the random wallet open failure when updating

The problem seems to be caused by the use of BackendPersistHandler
singleton when the user has several wallets on his system and not
all of them have been updated to the new schema.

BUG: 343718
---
 .../kwalletd/backend/backendpersisthandler.cpp     | 31 +++++-----------------
 src/runtime/kwalletd/backend/kwalletbackend.cc     |  5 +++-
 2 files changed, 11 insertions(+), 25 deletions(-)

diff --git a/src/runtime/kwalletd/backend/backendpersisthandler.cpp b/src/runtime/kwalletd/backend/backendpersisthandler.cpp
index d98980d..8795f77 100644
--- a/src/runtime/kwalletd/backend/backendpersisthandler.cpp
+++ b/src/runtime/kwalletd/backend/backendpersisthandler.cpp
@@ -155,25 +155,14 @@ static int getRandomBlock(QByteArray &randBlock)
 #endif
 }
 
-static BlowfishPersistHandler *blowfishHandler = 0;
-#ifdef HAVE_QGPGME
-static GpgPersistHandler *gpgHandler = 0;
-#endif // HAVE_QGPGME
-
 BackendPersistHandler *BackendPersistHandler::getPersistHandler(BackendCipherType cipherType)
 {
     switch (cipherType) {
     case BACKEND_CIPHER_BLOWFISH:
-        if (0 == blowfishHandler) {
-            blowfishHandler = new BlowfishPersistHandler;
-        }
-        return blowfishHandler;
+        return new BlowfishPersistHandler;
 #ifdef HAVE_QGPGME
     case BACKEND_CIPHER_GPG:
-        if (0 == gpgHandler) {
-            gpgHandler = new GpgPersistHandler;
-        }
-        return gpgHandler;
+        return new GpgPersistHandler;
 #endif // HAVE_QGPGME
     default:
         Q_ASSERT(0);
@@ -185,22 +174,16 @@ BackendPersistHandler *BackendPersistHandler::getPersistHandler(char magicBuf[12
 {
     if ((magicBuf[2] == KWALLET_CIPHER_BLOWFISH_ECB || magicBuf[2] == KWALLET_CIPHER_BLOWFISH_CBC) &&
             (magicBuf[3] == KWALLET_HASH_SHA1 || magicBuf[3] == KWALLET_HASH_PBKDF2_SHA512)) {
-        if (0 == blowfishHandler) {
-            bool useECBforReading = magicBuf[2] == KWALLET_CIPHER_BLOWFISH_ECB;
-            if (useECBforReading) {
-                qDebug() << "this wallet uses ECB encryption. It'll be converted to CBC on next save.";
-            }
-            blowfishHandler = new BlowfishPersistHandler(useECBforReading);
+        bool useECBforReading = magicBuf[2] == KWALLET_CIPHER_BLOWFISH_ECB;
+        if (useECBforReading) {
+            qDebug() << "this wallet uses ECB encryption. It'll be converted to CBC on next save.";
         }
-        return blowfishHandler;
+        return new BlowfishPersistHandler(useECBforReading);
     }
 #ifdef HAVE_QGPGME
     if (magicBuf[2] == KWALLET_CIPHER_GPG &&
             magicBuf[3] == 0) {
-        if (0 == gpgHandler) {
-            gpgHandler = new GpgPersistHandler;
-        }
-        return gpgHandler;
+        return  new GpgPersistHandler;
     }
 #endif // HAVE_QGPGME
     return 0;    // unknown cipher or hash
diff --git a/src/runtime/kwalletd/backend/kwalletbackend.cc b/src/runtime/kwalletd/backend/kwalletbackend.cc
index e95866c..34e0419 100644
--- a/src/runtime/kwalletd/backend/kwalletbackend.cc
+++ b/src/runtime/kwalletd/backend/kwalletbackend.cc
@@ -374,7 +374,9 @@ int Backend::openInternal(WId w)
     if (0 == phandler) {
         return 42; // unknown cipher or hash
     }
-    return phandler->read(this, db, w);
+    int result = phandler->read(this, db, w);
+    delete phandler;
+    return result;
 }
 
 void Backend::swapToNewHash()
@@ -456,6 +458,7 @@ int Backend::sync(WId w)
         notification->setText(i18n("Failed to sync wallet <b>%1</b> to disk. Error codes are:\nRC <b>%2</b>\nSF <b>%3</b>. Please file a BUG report using this information to bugs.kde.org").arg(_name).arg(rc).arg(sf.errorString()));
         notification->sendEvent();
     }
+    delete phandler;
     return rc;
 }
 
-- 
2.3.0