From 0713f28bdbfc1354d8318a0f948dc9daab0a9bd7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Lindqvist?= Date: Mon, 1 Jun 2015 00:21:32 +0200 Subject: [PATCH] VM: safe_fread needs to return an int so you can return -1 on error --- vm/io.cpp | 21 ++++++++++----------- vm/io.hpp | 2 +- vm/vm.hpp | 2 +- 3 files changed, 12 insertions(+), 13 deletions(-) diff --git a/vm/io.cpp b/vm/io.cpp index bdb50ac3fb..7d640a18a0 100644 --- a/vm/io.cpp +++ b/vm/io.cpp @@ -13,18 +13,18 @@ The Factor library provides platform-specific code for Unix and Windows with many more capabilities so these words are not usually used in normal operation. */ -size_t raw_fread(void* ptr, size_t size, size_t nitems, FILE* stream) { +int raw_fread(void* ptr, size_t size, size_t nitems, FILE* stream) { size_t items_read = 0; - size_t ret = 0; do { - ret = fread((void*)((int*)ptr + items_read * size), size, - nitems - items_read, stream); + size_t ret = fread((void*)((int*)ptr + items_read * size), size, + nitems - items_read, stream); if (ret == 0) { - if (feof(stream)) + if (feof(stream)) { break; + } else if (errno != EINTR) { - return 0; + return -1; } } items_read += ret; @@ -82,10 +82,10 @@ int factor_vm::safe_fgetc(FILE* stream) { return c; } -size_t factor_vm::safe_fread(void* ptr, size_t size, size_t nitems, +int factor_vm::safe_fread(void* ptr, size_t size, size_t nitems, FILE* stream) { - size_t ret = raw_fread(ptr, size, nitems, stream); - if (!ret) + int ret = raw_fread(ptr, size, nitems, stream); + if (ret == -1) io_error_if_not_EINTR(); return ret; } @@ -199,8 +199,7 @@ void factor_vm::primitive_fread() { ctx->push(from_unsigned_cell(0)); return; } - - size_t c = safe_fread(buf, 1, size, file); + int c = safe_fread(buf, 1, size, file); if (c == 0 || feof(file)) clearerr(file); ctx->push(from_unsigned_cell(c)); diff --git a/vm/io.hpp b/vm/io.hpp index 59b847159d..57f7b19f83 100644 --- a/vm/io.hpp +++ b/vm/io.hpp @@ -2,7 +2,7 @@ namespace factor { /* Safe IO functions that does not throw Factor errors. */ int raw_fclose(FILE* stream); -size_t raw_fread(void* ptr, size_t size, size_t nitems, FILE* stream); +int raw_fread(void* ptr, size_t size, size_t nitems, FILE* stream); /* Platform specific primitives */ diff --git a/vm/vm.hpp b/vm/vm.hpp index a0a9a142d4..1d68ed4a61 100644 --- a/vm/vm.hpp +++ b/vm/vm.hpp @@ -540,7 +540,7 @@ struct factor_vm { void io_error_if_not_EINTR(); FILE* safe_fopen(char* filename, char* mode); int safe_fgetc(FILE* stream); - size_t safe_fread(void* ptr, size_t size, size_t nitems, FILE* stream); + int safe_fread(void* ptr, size_t size, size_t nitems, FILE* stream); void safe_fputc(int c, FILE* stream); size_t safe_fwrite(void* ptr, size_t size, size_t nitems, FILE* stream); int safe_ftell(FILE* stream);