From 0ec8f66ff469046e51e741b42db3fa91e7fd7643 Mon Sep 17 00:00:00 2001 From: Ben Kibbey Date: Fri, 28 Sep 2007 19:54:06 -0400 Subject: [PATCH] Check the return values of read() and write(). --- src/commands.c | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++------- src/pwmd.c | 10 +++++++++- 2 files changed, 65 insertions(+), 8 deletions(-) diff --git a/src/commands.c b/src/commands.c index 54b41615..73da38a0 100644 --- a/src/commands.c +++ b/src/commands.c @@ -699,8 +699,29 @@ gpg_error_t do_xml_encrypt(struct client_s *client, gcry_cipher_hd_t gh, */ fd = STDOUT_FILENO; - write(fd, &file_header, sizeof(struct file_header_s)); - write(fd, inbuf, insize); + len = write(fd, &file_header, sizeof(struct file_header_s)); + + if (len != sizeof(file_header)) { + len = errno; + + if (filename) + close(fd); + + gcry_free(inbuf); + return gpg_error_from_errno(len); + } + + len = write(fd, inbuf, insize); + + if (len != insize) { + len = errno; + + if (filename) + close(fd); + + gcry_free(inbuf); + return gpg_error_from_errno(len); + } if (filename) close(fd); @@ -2208,7 +2229,7 @@ gpg_error_t try_xml_decrypt(assuan_context_t ctx, gint fd, struct stat st, { guchar *iv; void *inbuf; - gsize insize; + gsize insize, len; guchar tkey[gcrykeysize]; struct file_header_s { guint iter; @@ -2238,21 +2259,49 @@ gpg_error_t try_xml_decrypt(assuan_context_t ctx, gint fd, struct stat st, iv = gcry_malloc(gcryblocksize); if (!iv) { - gcry_cipher_close(gh); + if (!ctx) + gcry_cipher_close(gh); + return gpg_error_from_errno(ENOMEM); } - read(fd, &file_header, sizeof(struct file_header_s)); + len = read(fd, &file_header, sizeof(struct file_header_s)); + + if (len != sizeof(file_header)) { + len = errno; + + if (!ctx) + gcry_cipher_close(gh); + + gcry_free(iv); + errno = len; + return gpg_error_from_errno(errno); + } + memcpy(iv, &file_header.iv, sizeof(file_header.iv)); inbuf = gcry_malloc(insize); if (!inbuf) { - gcry_cipher_close(gh); + if (!ctx) + gcry_cipher_close(gh); + gcry_free(iv); return gpg_error_from_errno(ENOMEM); } - read(fd, inbuf, insize); + len = read(fd, inbuf, insize); + + if (len != insize) { + len = errno; + + if (!ctx) + gcry_cipher_close(gh); + + gcry_free(iv); + errno = len; + return gpg_error_from_errno(errno); + } + memcpy(tkey, key, sizeof(tkey)); tkey[0] ^= 1; diff --git a/src/pwmd.c b/src/pwmd.c index d8095064..7c44f887 100644 --- a/src/pwmd.c +++ b/src/pwmd.c @@ -617,7 +617,15 @@ static gboolean xml_import(const gchar *filename, gint iter) return FALSE; } - read(fd, xmlbuf, st.st_size); + if (read(fd, xmlbuf, st.st_size) == -1) { + error = errno; + close(fd); + gcry_free(key); + gcry_cipher_close(gh); + errno = error; + err(EXIT_FAILURE, "read()"); + } + close(fd); xmlbuf[st.st_size] = 0; -- 2.11.4.GIT