summaryrefslogtreecommitdiff
path: root/lib/utils_crypt.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/utils_crypt.c')
-rw-r--r--lib/utils_crypt.c28
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;