From 6a3859cd9e65ebc7b6b5dd38f51121c344205e01 Mon Sep 17 00:00:00 2001 From: Denis Pauk Date: Sun, 23 Jun 2024 13:02:50 +0300 Subject: [PATCH] renders: sync readfile_t type with FS_LoadFile Usage of FS_LoadFile as readfile_t is unsupported for now as requires usage FS_FreeFile instead just copy of file content. Fixes memory leak for sin models load. --- src/client/refresh/files/models.c | 4 ++-- src/client/refresh/gl1/gl1_model.c | 21 ++++++++++++--------- src/client/refresh/gl3/gl3_model.c | 21 ++++++++++++--------- src/client/refresh/gl4/gl4_model.c | 21 ++++++++++++--------- src/client/refresh/ref_shared.h | 2 +- src/client/refresh/soft/sw_model.c | 21 ++++++++++++--------- src/client/refresh/vk/vk_model.c | 21 ++++++++++++--------- 7 files changed, 63 insertions(+), 48 deletions(-) diff --git a/src/client/refresh/files/models.c b/src/client/refresh/files/models.c index 323526d6..e5fe9243 100644 --- a/src/client/refresh/files/models.c +++ b/src/client/refresh/files/models.c @@ -2670,7 +2670,7 @@ Mod_LoadModel_SDEF_Text(const char *mod_name, char *curr_buff, readfile_t read_f } } - base = (sin_sbm_header_t*)read_file(base_model, &base_size); + base_size = read_file(base_model, &base); if (base_size <= 0) { R_Printf(PRINT_DEVELOPER, "%s: %s No base model for %s\n", @@ -2709,7 +2709,7 @@ Mod_LoadModel_SDEF_Text(const char *mod_name, char *curr_buff, readfile_t read_f { int anim_size, j; - anim[animation_num] = (sin_sam_header_t*)read_file(animations[i], &anim_size); + anim_size = read_file(animations[i], &anim[animation_num]); if (anim_size <= 0) { R_Printf(PRINT_DEVELOPER, "%s: %s empty animation %s\n", diff --git a/src/client/refresh/gl1/gl1_model.c b/src/client/refresh/gl1/gl1_model.c index 2656fb69..2c31fbca 100644 --- a/src/client/refresh/gl1/gl1_model.c +++ b/src/client/refresh/gl1/gl1_model.c @@ -371,20 +371,23 @@ Mod_LoadBrushModel(model_t *mod, const void *buffer, int modfilelen) } /* Temporary solution, need to use load file dirrectly */ -static char * -Mod_ReadFile(const char *name, int *size) +static int +Mod_ReadFile(const char *path, void **buffer) { - char *buffer, *data; + char *data; + int size; - *size = ri.FS_LoadFile(name, (void **)&buffer); - if (*size <= 0) + size = ri.FS_LoadFile(path, (void **)&data); + if (size <= 0) { - return NULL; + return size; } - data = malloc(*size); - memcpy(data, buffer, *size); - return data; + *buffer = malloc(size); + memcpy(*buffer, data, size); + ri.FS_FreeFile((void *)data); + + return size; } /* diff --git a/src/client/refresh/gl3/gl3_model.c b/src/client/refresh/gl3/gl3_model.c index 20089aa8..9d1eb9f8 100644 --- a/src/client/refresh/gl3/gl3_model.c +++ b/src/client/refresh/gl3/gl3_model.c @@ -372,20 +372,23 @@ Mod_LoadBrushModel(gl3model_t *mod, const void *buffer, int modfilelen) } /* Temporary solution, need to use load file dirrectly */ -static char * -Mod_ReadFile(const char *name, int *size) +static int +Mod_ReadFile(const char *path, void **buffer) { - char *buffer, *data; + char *data; + int size; - *size = ri.FS_LoadFile(name, (void **)&buffer); - if (*size <= 0) + size = ri.FS_LoadFile(path, (void **)&data); + if (size <= 0) { - return NULL; + return size; } - data = malloc(*size); - memcpy(data, buffer, *size); - return data; + *buffer = malloc(size); + memcpy(*buffer, data, size); + ri.FS_FreeFile((void *)data); + + return size; } /* diff --git a/src/client/refresh/gl4/gl4_model.c b/src/client/refresh/gl4/gl4_model.c index c80f1243..6159e0e3 100644 --- a/src/client/refresh/gl4/gl4_model.c +++ b/src/client/refresh/gl4/gl4_model.c @@ -372,20 +372,23 @@ Mod_LoadBrushModel(gl4model_t *mod, const void *buffer, int modfilelen) } /* Temporary solution, need to use load file dirrectly */ -static char * -Mod_ReadFile(const char *name, int *size) +static int +Mod_ReadFile(const char *path, void **buffer) { - char *buffer, *data; + char *data; + int size; - *size = ri.FS_LoadFile(name, (void **)&buffer); - if (*size <= 0) + size = ri.FS_LoadFile(path, (void **)&data); + if (size <= 0) { - return NULL; + return size; } - data = malloc(*size); - memcpy(data, buffer, *size); - return data; + *buffer = malloc(size); + memcpy(*buffer, data, size); + ri.FS_FreeFile((void *)data); + + return size; } /* diff --git a/src/client/refresh/ref_shared.h b/src/client/refresh/ref_shared.h index 26219c6c..37f78bc5 100644 --- a/src/client/refresh/ref_shared.h +++ b/src/client/refresh/ref_shared.h @@ -326,7 +326,7 @@ typedef struct } bspxlightgrid_t; /* Shared models func */ -typedef char* (*readfile_t)(const char *name, int *size); +typedef int (*readfile_t)(const char *path, void **buffer); typedef struct image_s* (*findimage_t)(const char *name, imagetype_t type); extern void *Mod_LoadModel(const char *mod_name, const void *buffer, int modfilelen, vec3_t mins, vec3_t maxs, struct image_s ***skins, int *numskins, diff --git a/src/client/refresh/soft/sw_model.c b/src/client/refresh/soft/sw_model.c index f3f9d1c2..ec1f3dd1 100644 --- a/src/client/refresh/soft/sw_model.c +++ b/src/client/refresh/soft/sw_model.c @@ -379,20 +379,23 @@ Mod_LoadBrushModel(model_t *mod, const void *buffer, int modfilelen) } /* Temporary solution, need to use load file dirrectly */ -static char * -Mod_ReadFile(const char *name, int *size) +static int +Mod_ReadFile(const char *path, void **buffer) { - char *buffer, *data; + char *data; + int size; - *size = ri.FS_LoadFile(name, (void **)&buffer); - if (*size <= 0) + size = ri.FS_LoadFile(path, (void **)&data); + if (size <= 0) { - return NULL; + return size; } - data = malloc(*size); - memcpy(data, buffer, *size); - return data; + *buffer = malloc(size); + memcpy(*buffer, data, size); + ri.FS_FreeFile((void *)data); + + return size; } /* diff --git a/src/client/refresh/vk/vk_model.c b/src/client/refresh/vk/vk_model.c index af8e729c..36052110 100644 --- a/src/client/refresh/vk/vk_model.c +++ b/src/client/refresh/vk/vk_model.c @@ -346,20 +346,23 @@ Mod_LoadBrushModel(model_t *mod, const void *buffer, int modfilelen) } /* Temporary solution, need to use load file dirrectly */ -static char * -Mod_ReadFile(const char *name, int *size) +static int +Mod_ReadFile(const char *path, void **buffer) { - char *buffer, *data; + char *data; + int size; - *size = ri.FS_LoadFile(name, (void **)&buffer); - if (*size <= 0) + size = ri.FS_LoadFile(path, (void **)&data); + if (size <= 0) { - return NULL; + return size; } - data = malloc(*size); - memcpy(data, buffer, *size); - return data; + *buffer = malloc(size); + memcpy(*buffer, data, size); + ri.FS_FreeFile((void *)data); + + return size; } /*