From 9b93d57d9c606f7b4ea54da7f6f979ad355a917a Mon Sep 17 00:00:00 2001 From: Shea Levy Date: Sat, 24 Sep 2011 13:21:00 -0400 Subject: [PATCH] passphrase_read: set errno and return NULL when possibly-failing functions fail --- libfreerdp-utils/passphrase.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/libfreerdp-utils/passphrase.c b/libfreerdp-utils/passphrase.c index 5189880..7caa3db 100644 --- a/libfreerdp-utils/passphrase.c +++ b/libfreerdp-utils/passphrase.c @@ -17,6 +17,7 @@ * limitations under the License. */ +#include #include #include #include @@ -30,18 +31,25 @@ char* freerdp_passphrase_read(const char* prompt, char* buf, size_t bufsiz) char* buf_iter; char term_name[L_ctermid]; int term_id; + ssize_t nbytes; size_t read_bytes = 0; if (bufsiz == 0) + { + errno = EINVAL; return NULL; + } ctermid(term_name); term_id = open(term_name, O_RDWR); + if (term_id == -1) + return NULL; - write(term_id, prompt, strlen(prompt) + sizeof '\0'); + if (write(term_id, prompt, strlen(prompt) + sizeof '\0') == (ssize_t) -1) + return NULL; buf_iter = buf; - while (read(term_id, &read_char, sizeof read_char) == (sizeof read_char)) + while ((nbytes = read(term_id, &read_char, sizeof read_char)) == (sizeof read_char)) { read_bytes++; if (read_char == '\n') @@ -52,10 +60,13 @@ char* freerdp_passphrase_read(const char* prompt, char* buf, size_t bufsiz) buf_iter++; } } + if (nbytes == (ssize_t) -1) + return NULL; *buf_iter = '\0'; buf_iter = NULL; - close(term_id); + if (close(term_id) == -1) + return NULL; return buf; } -- 2.7.4