diff options
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.patch | 152 |
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; + } + |