From ae211ad069a8a72df1436ef02d0d5151b62e7c02 Mon Sep 17 00:00:00 2001 From: Fabian Vogt Date: Sun, 4 Jun 2017 20:44:18 +0200 Subject: [PATCH] Fixup protocol mismatch between greeter and kcheckpass Summary: The receiver (kcheckpass) reads a string and if it is !nullptr, reads an int: msg = GRecvStr (); if (msg && (GRecvInt() & IsPassword) && !*msg) The sender (kscreenlocker_greet) sends a string and if it is not empty, sends an int: GSendStr(m_password.toUtf8().constData()); if (!m_password.isEmpty()) { // IsSecret GSendInt(1); } This does not work out for empty strings, as those still have a length of 1, resulting in kcheckpass waiting indefinitely for an int that does not get sent. Testing for a nullptr on the sender side instead of the string length fixes this. Also clean up the code duplication and IsSecret (1)/IsPassword (2) mismatch. BUG: 380491 Test Plan: Reproduced the bug without this patch, with this patch it does not happen anymore. Authentication still works and fails as expected. Reviewers: #plasma Subscribers: plasma-devel Tags: #plasma Differential Revision: https://phabricator.kde.org/D6091 --- greeter/authenticator.cpp | 22 +++++++--------------- 1 file changed, 7 insertions(+), 15 deletions(-) diff --git a/greeter/authenticator.cpp b/greeter/authenticator.cpp index f3ee0d1..8c9391b 100644 --- a/greeter/authenticator.cpp +++ b/greeter/authenticator.cpp @@ -243,27 +243,19 @@ void KCheckPass::handleVerify() ::free( arr ); return; case ConvGetNormal: - if (!GRecvArr( &arr )) - break; - GSendStr(m_password.toUtf8().constData()); - if (!m_password.isEmpty()) { - // IsSecret - GSendInt(1); - } - if (arr) - ::free( arr ); - return; case ConvGetHidden: + { if (!GRecvArr( &arr )) break; - GSendStr(m_password.toUtf8().constData()); - if (!m_password.isEmpty()) { - // IsSecret - GSendInt(1); - } + QByteArray utf8pass = m_password.toUtf8(); + GSendStr(utf8pass.constData()); + if (utf8pass.constData() != nullptr) + GSendInt(IsPassword); + if (arr) ::free( arr ); return; + } case ConvPutInfo: if (!GRecvArr( &arr )) break; -- 2.13.0