From 1a4cfe99deead49b628a89bb4927b71a3c248e2d Mon Sep 17 00:00:00 2001 From: Jeff Epler Date: Sat, 30 Nov 2013 10:21:17 -0600 Subject: [PATCH] Improve handling of incomplete reads a failure with EAGAIN should be tried again (though a timeout / select would be appropriate?); a success with zero bytes read or written is treated as a failure (is this correct?) --- ungeli.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/ungeli.c b/ungeli.c index c86889d..eca5828 100644 --- a/ungeli.c +++ b/ungeli.c @@ -40,6 +40,7 @@ #include #include #include +#include #define IVSIZE (16) #define SHA512_MDLEN (SHA512_DIGEST_LENGTH) @@ -136,6 +137,8 @@ static void read_full(int fd, unsigned char *blk, int blocksize) { do { int res = read(fd, blk, blocksize); + if(res == 0) fatal("read_full read() -> 0"); + if(res < 0 && errno == EAGAIN) continue; if(res < 0) perror_fatal("read_full"); blk += res; blocksize -= res; @@ -146,6 +149,8 @@ static void write_full(int fd, const unsigned char *blk, int blocksize) { do { int res = write(fd, blk, blocksize); + if(res == 0) fatal("write_full write() -> 0"); + if(res < 0 && errno == EAGAIN) continue; if(res < 0) perror_fatal("write_full"); blk += res; blocksize -= res;