From 0d516c793e4abc32a16b31aa0581361fc65d9cb9 Mon Sep 17 00:00:00 2001 From: Magnus Ahltorp Date: Thu, 16 Mar 2017 15:51:33 +0100 Subject: Implement reading over the file/writebuffer boundary --- c_src/filebuffer.c | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) (limited to 'c_src') diff --git a/c_src/filebuffer.c b/c_src/filebuffer.c index d35bfa7..fb06c64 100644 --- a/c_src/filebuffer.c +++ b/c_src/filebuffer.c @@ -163,12 +163,23 @@ bf_read(buffered_file *file, uint64_t offset, size_t length, char **error) memcpy(result, file->writebuffer + writebufferoffset, length); } else { if (offset + length > file->filesize) { - free(result); - set_error(error, - "pread: trying to read over file/writebuffer " - "boundary for offset %llu and length %zu\n", - (long long unsigned int) offset, length); - return NULL; + uint64_t offset_1 = offset; + size_t length_1 = file->filesize - offset; + uint64_t offset_2 = offset_1 + length_1; + size_t length_2 = length - length_1; + unsigned char *result_1 = bf_read(file, offset_1, length_1, error); + unsigned char *result_2 = bf_read(file, offset_2, length_2, error); + if (result_1 == NULL || result_2 == NULL) { + free(result_1); + free(result_2); + free(result); + return NULL; + } + memcpy(result, result_1, length_1); + memcpy(result + length_1, result_2, length_2); + free(result_1); + free(result_2); + return result; } size_t bytes_read = 0; -- cgit v1.1