summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'kde-apps/kwalletd/files/kwalletd-4.14.3-fix-random-open.patch')
-rw-r--r--kde-apps/kwalletd/files/kwalletd-4.14.3-fix-random-open.patch152
1 files changed, 152 insertions, 0 deletions
diff --git a/kde-apps/kwalletd/files/kwalletd-4.14.3-fix-random-open.patch b/kde-apps/kwalletd/files/kwalletd-4.14.3-fix-random-open.patch
new file mode 100644
index 000000000000..7443e3f6cc29
--- /dev/null
+++ b/kde-apps/kwalletd/files/kwalletd-4.14.3-fix-random-open.patch
@@ -0,0 +1,152 @@
+commit 33a17ba0104cd94f2e33a3ac007b300553cdb417
+Author: Valentin Rusu <kde@rusu.info>
+Date: Mon Feb 16 22:44:07 2015 +0100
+
+ 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
+
+diff --git a/kwalletd/backend/backendpersisthandler.cpp b/kwalletd/backend/backendpersisthandler.cpp
+index 5c321c9..b7f63f8 100644
+--- a/kwalletd/backend/backendpersisthandler.cpp
++++ b/kwalletd/backend/backendpersisthandler.cpp
+@@ -140,25 +140,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);
+@@ -170,21 +159,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/kwalletd/backend/kwalletbackend.cc b/kwalletd/backend/kwalletbackend.cc
+index 7d439e3..9240103 100644
+--- a/kwalletd/backend/kwalletbackend.cc
++++ b/kwalletd/backend/kwalletbackend.cc
+@@ -266,7 +266,7 @@ int Backend::open(const QByteArray& password, WId w) {
+ if (_open) {
+ return -255; // already open
+ }
+-
++
+ setPassword(password);
+ return openInternal(w);
+ }
+@@ -287,20 +287,20 @@ int Backend::openPreHashed(const QByteArray &passwordHash)
+ if (_open) {
+ return -255; // already open
+ }
+-
++
+ // check the password hash for correct size (currently fixed)
+ if (passwordHash.size() != 20 && passwordHash.size() != 40 &&
+ passwordHash.size() != 56) {
+ return -42; // unsupported encryption scheme
+ }
+-
++
+ _passhash = passwordHash;
+ _newPassHash = passwordHash;
+ _useNewHash = true;//Only new hash is supported
+
+ return openInternal();
+ }
+-
++
+ int Backend::openInternal(WId w)
+ {
+ // No wallet existed. Let's create it.
+@@ -350,7 +350,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()
+@@ -427,6 +429,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;
+ }
+
+@@ -439,7 +442,7 @@ int Backend::close(bool save) {
+ return rc;
+ }
+ }
+-
++
+ // do the actual close
+ for (FolderMap::ConstIterator i = _entries.constBegin(); i != _entries.constEnd(); ++i) {
+ for (EntryMap::ConstIterator j = i.value().constBegin(); j != i.value().constEnd(); ++j) {
+@@ -447,13 +450,13 @@ int Backend::close(bool save) {
+ }
+ }
+ _entries.clear();
+-
++
+ // empty the password hash
+ _passhash.fill(0);
+ _newPassHash.fill(0);
+
+ _open = false;
+-
++
+ return 0;
+ }
+