diff options
Diffstat (limited to 'lib/utils_crypt.c')
-rw-r--r-- | lib/utils_crypt.c | 28 |
1 files changed, 21 insertions, 7 deletions
diff --git a/lib/utils_crypt.c b/lib/utils_crypt.c index 9fc05ac..5cfe477 100644 --- a/lib/utils_crypt.c +++ b/lib/utils_crypt.c @@ -81,6 +81,18 @@ int crypt_parse_name_and_mode(const char *s, char *cipher, int *key_nums, return -EINVAL; } +/* + * Replacement for memset(s, 0, n) on stack that can be optimized out + * Also used in safe allocations for explicit memory wipe. + */ +void crypt_memzero(void *s, size_t n) +{ + volatile uint8_t *p = (volatile uint8_t *)s; + + while(n--) + *p++ = 0; +} + /* safe allocations */ void *crypt_safe_alloc(size_t size) { @@ -94,7 +106,7 @@ void *crypt_safe_alloc(size_t size) return NULL; alloc->size = size; - memset(&alloc->data, 0, size); + crypt_memzero(&alloc->data, size); /* coverity[leaked_storage] */ return &alloc->data; @@ -110,7 +122,7 @@ void crypt_safe_free(void *data) alloc = (struct safe_allocation *) ((char *)data - offsetof(struct safe_allocation, data)); - memset(data, 0, alloc->size); + crypt_memzero(data, alloc->size); alloc->size = 0x55aa55aa; free(alloc); @@ -157,7 +169,7 @@ static int untimed_read(int fd, char *pass, size_t maxlen) static int timed_read(int fd, char *pass, size_t maxlen, long timeout) { struct timeval t; - fd_set fds; + fd_set fds = {}; /* Just to avoid scan-build false report for FD_SET */ int failed = -1; FD_ZERO(&fds); @@ -176,16 +188,18 @@ static int interactive_pass(const char *prompt, char *pass, size_t maxlen, { struct termios orig, tmp; int failed = -1; - int infd = STDIN_FILENO, outfd; + int infd, outfd; if (maxlen < 1) - goto out_err; + return failed; /* Read and write to /dev/tty if available */ - if ((infd = outfd = open("/dev/tty", O_RDWR)) == -1) { + infd = open("/dev/tty", O_RDWR); + if (infd == -1) { infd = STDIN_FILENO; outfd = STDERR_FILENO; - } + } else + outfd = infd; if (tcgetattr(infd, &orig)) goto out_err; |