sulogin: use explicit_bzero() for buffer with password

Reported-by: Jan Pazdziora <jpazdziora@redhat.com>
Signed-off-by: Karel Zak <kzak@redhat.com>
This commit is contained in:
Karel Zak 2021-06-16 15:39:32 +02:00
parent 59e2df8fe8
commit 286865bf7e
1 changed files with 13 additions and 5 deletions

View File

@ -81,6 +81,8 @@ static struct sigaction saved_sigchld;
static volatile sig_atomic_t alarm_rised;
static volatile sig_atomic_t sigchild;
#define SULOGIN_PASSWORD_BUFSIZ 128
#ifndef IUCLC
# define IUCLC 0
#endif
@ -658,13 +660,13 @@ notty:
* Ask for the password. Note that there is no default timeout as we normally
* skip this during boot.
*/
static const char *getpasswd(struct console *con)
static char *getpasswd(struct console *con)
{
struct sigaction sa;
struct termios tty;
static char pass[128], *ptr;
static char pass[SULOGIN_PASSWORD_BUFSIZ], *ptr;
struct chardata *cp;
const char *ret = NULL;
char *ret = NULL;
unsigned char tc;
char c, ascval;
int eightbit;
@ -773,6 +775,8 @@ quit:
tcfinal(con);
printf("\r\n");
out:
if (ret == NULL)
explicit_bzero(pass, sizeof(pass));
return ret;
}
@ -1042,7 +1046,7 @@ int main(int argc, char **argv)
setup(con);
while (1) {
const char *passwd = pwd->pw_passwd;
const char *answer;
char *answer;
int doshell = 0;
int deny = !opt_e && locked_account_password(pwd->pw_passwd);
@ -1050,8 +1054,10 @@ int main(int argc, char **argv)
if ((answer = getpasswd(con)) == NULL)
break;
if (deny)
if (deny) {
explicit_bzero(answer, SULOGIN_PASSWORD_BUFSIZ);
exit(EXIT_FAILURE);
}
/* no password or locked account */
if (!passwd[0] || locked_account_password(passwd))
@ -1065,6 +1071,8 @@ int main(int argc, char **argv)
doshell++;
}
explicit_bzero(answer, SULOGIN_PASSWORD_BUFSIZ);
if (doshell) {
/* sushell() unmask signals */
sushell(pwd);