--- kscreenlocker-5.8.5/kcheckpass/kcheckpass.c.old 2016-12-27 11:25:36.000000000 +0000 +++ kscreenlocker-5.8.5/kcheckpass/kcheckpass.c 2017-01-31 04:32:44.858227055 +0000 @@ -56,6 +56,7 @@ #include #include #include +#include #include #if HAVE_SYS_PRCTL_H @@ -75,9 +76,41 @@ static int havetty, sfd = -1, nullpass; static char * +better_getpass (void) +{ + char *password = NULL, *nl; + size_t buf_len = 0; + ssize_t pass_len; + struct termios ti; + + tcgetattr(STDIN_FILENO, &ti); + ti.c_lflag &= ~ECHO; + tcsetattr(STDIN_FILENO, TCSANOW, &ti); + + pass_len = getdelim(&password, &buf_len, '\n', stdin); + + if (pass_len < 0) { + free(password); + return NULL; + } + + ti.c_lflag |= ECHO; + tcsetattr(STDIN_FILENO, TCSANOW, &ti); + + /* Do not include the \n at the end */ + nl = strchr(password, '\n'); + if (nl) { + *nl = '\0'; + } + + return password; +} + + +static char * conv_legacy (ConvRequest what, const char *prompt) { - char *p, *p2; + char *p2; int len; char buf[1024]; @@ -99,13 +132,10 @@ return strdup(buf); case ConvGetHidden: if (havetty) { -#ifdef HAVE_GETPASSPHRASE - p = getpassphrase(prompt ? prompt : "Password: "); -#else - p = getpass(prompt ? prompt : "Password: "); -#endif - p2 = strdup(p); - memset(p, 0, strlen(p)); + fputs(prompt ? prompt : "Password: ", stdout); + fflush(stdout); + p2 = better_getpass(); + printf("\n"); return p2; } else { if (prompt)