From 1b7c16e8ff030238913e83895f75f64183e79e69 Mon Sep 17 00:00:00 2001 From: Matthieu Gallien Date: Thu, 13 Apr 2023 11:44:57 +0200 Subject: [PATCH] solve memory mismanagement of object life time Signed-off-by: Matthieu Gallien --- src/libsync/clientsideencryption.cpp | 27 +++++++++++++++++---------- src/libsync/clientsideencryption.h | 4 ++-- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/src/libsync/clientsideencryption.cpp b/src/libsync/clientsideencryption.cpp index 8057ba05b..416d1c411 100644 --- a/src/libsync/clientsideencryption.cpp +++ b/src/libsync/clientsideencryption.cpp @@ -63,9 +63,10 @@ QString e2eeBaseUrl() namespace { constexpr char accountProperty[] = "account"; -const char e2e_cert[] = "_e2e-certificate"; -const char e2e_private[] = "_e2e-private"; -const char e2e_mnemonic[] = "_e2e-mnemonic"; +constexpr char e2e_cert[] = "_e2e-certificate"; +constexpr char e2e_private[] = "_e2e-private"; +constexpr char e2e_public[] = "_e2e-public"; +constexpr char e2e_mnemonic[] = "_e2e-mnemonic"; constexpr auto metadataKeyJsonKey = "metadataKey"; @@ -1333,16 +1334,22 @@ void ClientSideEncryption::sendSignRequestCSR(const AccountPtr &account, PKey ke job->start(); } -void ClientSideEncryption::writeKeyPair(const AccountPtr &account, +void ClientSideEncryption::writeKeyPair(AccountPtr account, PKey keyPair, - const QByteArray &output) + QByteArray output) { - const QString kck = AbstractCredentials::keychainKey( + const auto privateKeyKeychainId = AbstractCredentials::keychainKey( account->url().toString(), account->credentials()->user() + e2e_private, account->id() ); + const auto publicKeyKeychainId = AbstractCredentials::keychainKey( + account->url().toString(), + account->credentials()->user() + e2e_public, + account->id() + ); + Bio privateKey; if (PEM_write_bio_PrivateKey(privateKey, keyPair, nullptr, nullptr, 0, nullptr, nullptr) <= 0) { qCInfo(lcCse()) << "Could not read private key from bio."; @@ -1352,9 +1359,9 @@ void ClientSideEncryption::writeKeyPair(const AccountPtr &account, auto *privateKeyJob = new WritePasswordJob(Theme::instance()->appName()); privateKeyJob->setInsecureFallback(false); - privateKeyJob->setKey(kck); + privateKeyJob->setKey(privateKeyKeychainId); privateKeyJob->setBinaryData(bytearrayPrivateKey); - connect(privateKeyJob, &WritePasswordJob::finished, [&keyPair, kck, &account, &output, this](Job *incoming) { + connect(privateKeyJob, &WritePasswordJob::finished, [keyPair = std::move(keyPair), publicKeyKeychainId, account, output, this] (Job *incoming) mutable { Q_UNUSED(incoming); qCInfo(lcCse()) << "Private key stored in keychain"; @@ -1367,9 +1374,9 @@ void ClientSideEncryption::writeKeyPair(const AccountPtr &account, auto *publicKeyJob = new WritePasswordJob(Theme::instance()->appName()); publicKeyJob->setInsecureFallback(false); - publicKeyJob->setKey(kck); + publicKeyJob->setKey(publicKeyKeychainId); publicKeyJob->setBinaryData(bytearrayPublicKey); - connect(publicKeyJob, &WritePasswordJob::finished, [&account, &keyPair, &output, this](Job *incoming) { + connect(publicKeyJob, &WritePasswordJob::finished, [account, keyPair = std::move(keyPair), output, this](Job *incoming) mutable { Q_UNUSED(incoming); qCInfo(lcCse()) << "Public key stored in keychain"; diff --git a/src/libsync/clientsideencryption.h b/src/libsync/clientsideencryption.h index ed1b560a7..03720697f 100644 --- a/src/libsync/clientsideencryption.h +++ b/src/libsync/clientsideencryption.h @@ -166,9 +166,9 @@ private slots: private: void generateCSR(const AccountPtr &account, PKey keyPair); void sendSignRequestCSR(const AccountPtr &account, PKey keyPair, const QByteArray &csrContent); - void writeKeyPair(const AccountPtr &account, + void writeKeyPair(AccountPtr account, PKey keyPair, - const QByteArray &output); + QByteArray output); [[nodiscard]] bool checkPublicKeyValidity(const AccountPtr &account) const; [[nodiscard]] bool checkServerPublicKeyValidity(const QByteArray &serverPublicKeyString) const; -- 2.39.5