From fb26f3bbb7229fc20c8e79c26d00f4e96a4feb89 Mon Sep 17 00:00:00 2001 From: Brad Parker Date: Mon, 19 Sep 2016 12:06:07 -0400 Subject: [PATCH] fix divide by zero, use non-opaque type for file_archive functions --- libretro-common/file/archive_file.c | 40 ++++++++------------- libretro-common/include/file/archive_file.h | 15 ++++++-- 2 files changed, 27 insertions(+), 28 deletions(-) diff --git a/libretro-common/file/archive_file.c b/libretro-common/file/archive_file.c index 19f1be4a38..48fca17fd5 100644 --- a/libretro-common/file/archive_file.c +++ b/libretro-common/file/archive_file.c @@ -47,21 +47,10 @@ #include #include -typedef struct -{ -#ifdef HAVE_MMAP - int fd; -#endif - void *data; - size_t size; -} file_archive_file_data_t; - #ifdef HAVE_MMAP /* Closes, unmaps and frees. */ -void file_archive_free(void *handle) +void file_archive_free(file_archive_file_data_t *data) { - file_archive_file_data_t *data = (file_archive_file_data_t*)handle; - if (!data) return; @@ -72,23 +61,21 @@ void file_archive_free(void *handle) free(data); } -const uint8_t *file_archive_data(void *handle) +const uint8_t *file_archive_data(file_archive_file_data_t *data) { - file_archive_file_data_t *data = (file_archive_file_data_t*)handle; if (!data) return NULL; return (const uint8_t*)data->data; } -static size_t file_archive_size(void *handle) +static size_t file_archive_size(file_archive_file_data_t *data) { - file_archive_file_data_t *data = (file_archive_file_data_t*)handle; if (!data) return 0; return data->size; } -static void *file_archive_open(const char *path) +static file_archive_file_data_t* file_archive_open(const char *path) { file_archive_file_data_t *data = (file_archive_file_data_t*)calloc(1, sizeof(*data)); @@ -123,9 +110,8 @@ error: #else /* Closes, unmaps and frees. */ -void file_archive_free(void *handle) +void file_archive_free(file_archive_file_data_t *data) { - file_archive_file_data_t *data = (file_archive_file_data_t*)handle; if (!data) return; if(data->data) @@ -133,23 +119,21 @@ void file_archive_free(void *handle) free(data); } -const uint8_t *file_archive_data(void *handle) +const uint8_t *file_archive_data(file_archive_file_data_t *data) { - file_archive_file_data_t *data = (file_archive_file_data_t*)handle; if (!data) return NULL; return (const uint8_t*)data->data; } -static size_t file_archive_size(void *handle) +static size_t file_archive_size(file_archive_file_data_t *data) { - file_archive_file_data_t *data = (file_archive_file_data_t*)handle; if (!data) return 0; return data->size; } -static void *file_archive_open(const char *path) +static file_archive_file_data_t* file_archive_open(const char *path) { ssize_t ret = -1; bool read_from_file = false; @@ -475,7 +459,13 @@ static bool file_archive_parse_file(const char *file, const char *valid_exts, int file_archive_parse_file_progress(file_archive_transfer_t *state) { /* FIXME: this estimate is worse than before */ - ptrdiff_t delta = state->directory - state->data; + ptrdiff_t delta = 0; + + if (!state || state->archive_size == 0) + return 0; + + delta = state->directory - state->data; + return delta * 100 / state->archive_size; } diff --git a/libretro-common/include/file/archive_file.h b/libretro-common/include/file/archive_file.h index cfc4f077b6..ec464204f0 100644 --- a/libretro-common/include/file/archive_file.h +++ b/libretro-common/include/file/archive_file.h @@ -46,9 +46,18 @@ typedef struct file_archive_handle const struct file_archive_file_backend *backend; } file_archive_file_handle_t; +typedef struct +{ +#ifdef HAVE_MMAP + int fd; +#endif + void *data; + size_t size; +} file_archive_file_data_t; + typedef struct file_archive_transfer { - void *handle; + file_archive_file_data_t *handle; void *stream; const uint8_t *footer; const uint8_t *directory; @@ -194,12 +203,12 @@ struct string_list* file_archive_file_list_new(const char *path, struct string_list* file_archive_filename_split(const char *path); -const uint8_t* file_archive_data(void *handle); +const uint8_t* file_archive_data(file_archive_file_data_t *data); int file_archive_parse_file_init(file_archive_transfer_t *state, const char *file); -void file_archive_free(void *handle); +void file_archive_free(file_archive_file_data_t *data); const struct file_archive_file_backend* file_archive_get_zlib_file_backend(void); const struct file_archive_file_backend* file_archive_get_7z_file_backend(void);