From fd0f873a367b133fd41af34dc168bd594ee2928c Mon Sep 17 00:00:00 2001
From: Matt Johnston <matt@ucc.asn.au>
Date: Sun, 15 Jan 2006 06:43:24 +0000
Subject: [PATCH] Cancel a dbclient password prompt if the user presses ctrl-c.
 Enter still has to be pressed since glibc blocks ctrl-c in getpass()

--HG--
extra : convert_revision : 1c8128fba89431f2460dd5914f0614850d529b76
---
 auth.h             |  1 +
 cli-auth.c         | 15 +++++++++++++++
 cli-authinteract.c |  2 +-
 cli-authpasswd.c   |  5 +----
 4 files changed, 18 insertions(+), 5 deletions(-)

diff --git a/auth.h b/auth.h
index 7e832471..c407ad55 100644
--- a/auth.h
+++ b/auth.h
@@ -52,6 +52,7 @@ void cli_pubkeyfail();
 void cli_auth_password();
 int cli_auth_pubkey();
 void cli_auth_interactive();
+char* getpass_or_cancel();
 
 
 #define MAX_USERNAME_LEN 25 /* arbitrary for the moment */
diff --git a/cli-auth.c b/cli-auth.c
index 6a6d53af..d08de9a3 100644
--- a/cli-auth.c
+++ b/cli-auth.c
@@ -278,3 +278,18 @@ void cli_auth_try() {
 
 	TRACE(("leave cli_auth_try"))
 }
+
+/* A helper for getpass() that exits if the user cancels. The returned
+ * password is statically allocated by getpass() */
+char* getpass_or_cancel()
+{
+	char* password = NULL;
+
+	password = getpass("Password: ");
+
+	/* 0x03 is a ctrl-c character in the buffer. */
+	if (password == NULL || strchr(password, '\3') != NULL) {
+		dropbear_close("Interrupted.");
+	}
+	return password;
+}
diff --git a/cli-authinteract.c b/cli-authinteract.c
index ef65517d..5a169cb2 100644
--- a/cli-authinteract.c
+++ b/cli-authinteract.c
@@ -115,7 +115,7 @@ void recv_msg_userauth_info_request() {
 		echo = buf_getbool(ses.payload);
 
 		if (!echo) {
-			unsigned char* p = getpass(prompt);
+			unsigned char* p = getpass_or_cancel(prompt);
 			response = m_strdup(p);
 			m_burn(p, strlen(p));
 		} else {
diff --git a/cli-authpasswd.c b/cli-authpasswd.c
index ec290e05..5dffac4b 100644
--- a/cli-authpasswd.c
+++ b/cli-authpasswd.c
@@ -125,10 +125,7 @@ void cli_auth_password() {
 		password = gui_getpass("Password: ");
 	else
 #endif
-		password = getpass("Password: ");
-
-	if (password == NULL)
-		return 0;
+		password = getpass_or_cancel("Password: ");
 
 	buf_putbyte(ses.writepayload, SSH_MSG_USERAUTH_REQUEST);
 
-- 
GitLab