From 0ec4f970f70ce9e8fd0868f4fe0a4b084084163d Mon Sep 17 00:00:00 2001 From: Bananymous Date: Thu, 7 Sep 2023 16:00:47 +0300 Subject: [PATCH] LibC: fix fread implementation fread() should read until either size*nitems bytes are read or eof is reached. --- libc/stdio.cpp | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/libc/stdio.cpp b/libc/stdio.cpp index 339f591a6..4b6c6cd3b 100644 --- a/libc/stdio.cpp +++ b/libc/stdio.cpp @@ -255,15 +255,26 @@ size_t fread(void* buffer, size_t size, size_t nitems, FILE* file) { if (file->eof || nitems * size == 0) return 0; - long ret = syscall(SYS_READ, file->fd, buffer, size * nitems); - if (ret < 0) + + size_t target = size * nitems; + size_t nread = 0; + + while (nread < target) { - file->error = true; - return 0; + size_t ret = syscall(SYS_READ, file->fd, (uint8_t*)buffer + nread, target - nread); + + if (ret < 0) + file->error = true; + else if (ret == 0) + file->eof = true; + + if (ret <= 0) + return nread; + + nread += ret; } - if (ret == 0) - file->eof = true; - return ret / size; + + return nread / size; } // TODO