From de7880ae362200040fecb4ac85380af1cf10844d Mon Sep 17 00:00:00 2001 From: SET Date: Wed, 25 Nov 2020 21:29:27 +0100 Subject: [PATCH] Allocate passphrase on demand. Don't store passphrase as char* member variable. This would crash the application when exporting private keys. See https://dev.gnupg.org/T5151#139421 --- LoopbackPassphraseProvider.cpp | 11 +++++++---- LoopbackPassphraseProvider.h | 8 +++++++- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/LoopbackPassphraseProvider.cpp b/LoopbackPassphraseProvider.cpp index 7392e84..6dae74f 100644 --- a/LoopbackPassphraseProvider.cpp +++ b/LoopbackPassphraseProvider.cpp @@ -14,13 +14,13 @@ LoopbackPassphraseProvider::LoopbackPassphraseProvider() : PassphraseProvider() { - m_passphrase = strdup(""); + m_passphrase = ""; } LoopbackPassphraseProvider::LoopbackPassphraseProvider(const string& passphrase) : PassphraseProvider() { - m_passphrase = strdup(passphrase.c_str()); + m_passphrase = passphrase; } LoopbackPassphraseProvider::~LoopbackPassphraseProvider() @@ -42,7 +42,10 @@ char* LoopbackPassphraseProvider::getPassphrase(const char* useridHint, cout << previousWasBad << endl; // Always 0, even with bad password cout << canceled << endl; // Always 0 */ - return m_passphrase; + /* + * See https://dev.gnupg.org/T5151#139421 + */ + return strdup(m_passphrase.c_str()); } void LoopbackPassphraseProvider::SetPassphrase(const string& passphrase) @@ -50,7 +53,7 @@ void LoopbackPassphraseProvider::SetPassphrase(const string& passphrase) /* * Memory leak here ? */ - m_passphrase = strdup(passphrase.c_str()); + m_passphrase = passphrase; } const string LoopbackPassphraseProvider::GetPassphrase() diff --git a/LoopbackPassphraseProvider.h b/LoopbackPassphraseProvider.h index f64a630..a0d6176 100644 --- a/LoopbackPassphraseProvider.h +++ b/LoopbackPassphraseProvider.h @@ -48,7 +48,13 @@ public: const string GetPassphrase(); private: - char * m_passphrase; + /* + * Don't use char* m_passphrase. It is manipulated by gpg and exporting + * secret keys become messy, to the point of crashing the application if + * passphrase is bad. + * See https://dev.gnupg.org/T5151#139421 + */ + string m_passphrase; };