diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/cerberus.c | 3 | ||||
| -rw-r--r-- | src/passphrase.c | 20 | 
2 files changed, 19 insertions, 4 deletions
| diff --git a/src/cerberus.c b/src/cerberus.c index 3a5dd5d..ce60846 100644 --- a/src/cerberus.c +++ b/src/cerberus.c @@ -129,6 +129,9 @@ int main(int argc, char** argv)    #endif    secure_tty(tty_group); +  /* Redisable echoing */ +  disable_echo(); +      /* Set up clean quiting and time out */    signal(SIGALRM, timeout_quit); diff --git a/src/passphrase.c b/src/passphrase.c index 9482ba1..50c957f 100644 --- a/src/passphrase.c +++ b/src/passphrase.c @@ -46,11 +46,18 @@ char* get_passphrase(void)       we will not do that under normal usecases, if we do, it       okay to segfault on null derefencing and quit on that. */ -  char* rc = malloc(START_PASSPHRASE_LIMIT); +  char* rc = malloc(START_PASSPHRASE_LIMIT * sizeof(char));    long size = START_PASSPHRASE_LIMIT;    long len = 0;    int c; +  if (rc == NULL) +    { +      perror("malloc"); +      sleep(ERROR_SLEEP); +      _exit(1); +    } +      /* Read password until EOF or Enter, skip all ^0 as that       is probably not a part of the passphrase (good luck typing       that in X.org) and can be echoed into stdin by the kernel. */ @@ -63,7 +70,12 @@ char* get_passphrase(void)          {  	  *(rc + len++) = c;  	  if (len == size) -	    rc = realloc(rc, size <<= 1L); +	    if ((rc = realloc(rc, (size <<= 1L) * sizeof(char))) == NULL) +	      { +		perror("realloc"); +		sleep(ERROR_SLEEP); +		_exit(1); +	      }  	}      } @@ -81,8 +93,8 @@ void disable_echo(void)  {    struct termios stty; -  tcgetattr(STDIN_FILENO, &saved_stty); -  stty = saved_stty; +  tcgetattr(STDIN_FILENO, &stty); +  saved_stty = stty;    stty.c_lflag &= ~ECHO;    tcsetattr(STDIN_FILENO, TCSAFLUSH, &stty);  } | 
