From e6b181bea747628232b9b3c1fc83791e728a91c5 Mon Sep 17 00:00:00 2001 From: Vladislav Valtchev Date: Tue, 19 Nov 2019 13:49:35 +0200 Subject: [PATCH] Call read() in a loop in W_StdC_Read() The read() syscall does *not* guaratee that the whole buffer will be filled before returning. Partial reads must be expected. --- fbdoom/w_file_stdc_unbuffered.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/fbdoom/w_file_stdc_unbuffered.c b/fbdoom/w_file_stdc_unbuffered.c index e59e63b..b271e39 100644 --- a/fbdoom/w_file_stdc_unbuffered.c +++ b/fbdoom/w_file_stdc_unbuffered.c @@ -20,6 +20,7 @@ #include #include #include +#include #include #include @@ -92,7 +93,8 @@ size_t W_StdC_Read(wad_file_t *wad, unsigned int offset, void *buffer, size_t buffer_len) { stdc_wad_file_t *stdc_wad; - size_t result; + size_t result = 0; + int rc; stdc_wad = (stdc_wad_file_t *) wad; @@ -102,7 +104,21 @@ size_t W_StdC_Read(wad_file_t *wad, unsigned int offset, // Read into the buffer. - result = read(stdc_wad->fd, buffer, buffer_len); + do { + + rc = read(stdc_wad->fd, (char *)buffer + result, buffer_len - result); + + if (rc <= 0) { + + if (rc < 0 && errno == EINTR) + continue; + + break; + } + + result += rc; + + } while (result < buffer_len); return result; }