Commit 23fa33ce authored by Fabian Vogt's avatar Fabian Vogt

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
parent 51210aa5
......@@ -242,27 +242,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;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment