diff options
| -rw-r--r-- | c_src/filebuffer.c | 23 | 
1 files changed, 17 insertions, 6 deletions
| 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; | 
