forked from enlightenment/efl
evas_eet: Add Type Safety check
Summary: The Function _evas_canvas3d_eet_file_free(void) is referenced in evas_model_load_file_eet()(file:evas_model_load_eet.c at line 122). This call is under condition if ((eet_file->mesh == NULL) || (eet_file->header == NULL)). when either eet_file->mesh or eet_file->header are NULL, dereference of the corresponding pointer in function "_evas_canvas3d_eet_file_free()" will generate Segmentation Fault. @fix Reviewers: raster, Hermet, tasn, wonsik, spacegrapher, cedric, jpeg Subscribers: singh.amitesh, sachin.dev, alok25, yashu21985, mvsovani, cedric Differential Revision: https://phab.enlightenment.org/D3369
This commit is contained in:
parent
d63cc52c58
commit
1363cd757a
|
@ -2,18 +2,16 @@
|
|||
#include "evas_common_private.h"
|
||||
#include "evas_private.h"
|
||||
|
||||
Evas_Canvas3D_File_Eet* eet_file;
|
||||
const char EVAS_CANVAS3D_FILE_CACHE_FILE_ENTRY[] = "evas_3d file";
|
||||
Eet_Data_Descriptor *_vec2_descriptor;
|
||||
Eet_Data_Descriptor *_vec3_descriptor;
|
||||
Eet_Data_Descriptor *_vertex_descriptor;
|
||||
Eet_Data_Descriptor *_geometry_descriptor;
|
||||
Eet_Data_Descriptor *_color_descriptor;
|
||||
Eet_Data_Descriptor *_material_descriptor;
|
||||
Eet_Data_Descriptor *_frame_descriptor;
|
||||
Eet_Data_Descriptor *_mesh_descriptor;
|
||||
Eet_Data_Descriptor *_header_descriptor;
|
||||
Eet_Data_Descriptor *_file_descriptor;
|
||||
static Eet_Data_Descriptor *_vec2_descriptor = NULL;
|
||||
static Eet_Data_Descriptor *_vec3_descriptor = NULL;
|
||||
static Eet_Data_Descriptor *_vertex_descriptor = NULL;
|
||||
static Eet_Data_Descriptor *_geometry_descriptor = NULL;
|
||||
static Eet_Data_Descriptor *_color_descriptor = NULL;
|
||||
static Eet_Data_Descriptor *_material_descriptor = NULL;
|
||||
static Eet_Data_Descriptor *_frame_descriptor = NULL;
|
||||
static Eet_Data_Descriptor *_mesh_descriptor = NULL;
|
||||
static Eet_Data_Descriptor *_header_descriptor = NULL;
|
||||
static Eet_Data_Descriptor *_file_descriptor = NULL;
|
||||
|
||||
Evas_Canvas3D_File_Eet *
|
||||
_evas_canvas3d_eet_file_new(void)
|
||||
|
@ -29,8 +27,16 @@ _evas_canvas3d_eet_file_new(void)
|
|||
return creating_file;
|
||||
}
|
||||
|
||||
Eet_Data_Descriptor*
|
||||
_evas_canvas3d_eet_file_get()
|
||||
{
|
||||
if(_file_descriptor == NULL)
|
||||
_evas_canvas3d_eet_file_init();
|
||||
|
||||
return _file_descriptor;
|
||||
}
|
||||
void
|
||||
_evas_canvas3d_eet_file_init(void)
|
||||
_evas_canvas3d_eet_file_init()
|
||||
{
|
||||
eina_init();
|
||||
eet_init();
|
||||
|
@ -153,38 +159,55 @@ _evas_canvas3d_eet_file_init(void)
|
|||
"mesh", mesh, _mesh_descriptor);
|
||||
EET_DATA_DESCRIPTOR_ADD_SUB(_file_descriptor, Evas_Canvas3D_File_Eet,
|
||||
"header", header, _header_descriptor);
|
||||
|
||||
}
|
||||
|
||||
void
|
||||
_evas_canvas3d_eet_descriptor_shutdown(void)
|
||||
_evas_canvas3d_eet_descriptor_shutdown()
|
||||
{
|
||||
eet_data_descriptor_free(_geometry_descriptor);
|
||||
_geometry_descriptor = NULL;
|
||||
eet_data_descriptor_free(_vertex_descriptor);
|
||||
_vertex_descriptor = NULL;
|
||||
eet_data_descriptor_free(_vec2_descriptor);
|
||||
_vec2_descriptor = NULL;
|
||||
eet_data_descriptor_free(_vec3_descriptor);
|
||||
_vec3_descriptor = NULL;
|
||||
eet_data_descriptor_free(_color_descriptor);
|
||||
_color_descriptor = NULL;
|
||||
eet_data_descriptor_free(_material_descriptor);
|
||||
_material_descriptor = NULL;
|
||||
eet_data_descriptor_free(_frame_descriptor);
|
||||
_frame_descriptor = NULL;
|
||||
eet_data_descriptor_free(_mesh_descriptor);
|
||||
_mesh_descriptor = NULL;
|
||||
eet_data_descriptor_free(_header_descriptor);
|
||||
_header_descriptor = NULL;
|
||||
eet_data_descriptor_free(_file_descriptor);
|
||||
_file_descriptor = NULL;
|
||||
}
|
||||
|
||||
void
|
||||
_evas_canvas3d_eet_file_free(void)
|
||||
_evas_canvas3d_eet_file_free(Evas_Canvas3D_File_Eet* eet_file)
|
||||
{
|
||||
free(eet_file->mesh->geometries[0].vertices);
|
||||
free(eet_file->mesh->geometries);
|
||||
free(eet_file->mesh->frames);
|
||||
free(eet_file->mesh->materials[0].colors);
|
||||
free(eet_file->mesh->materials);
|
||||
free(eet_file->mesh);
|
||||
free(eet_file->header->materials);
|
||||
free(eet_file->header->geometries);
|
||||
free(eet_file->header);
|
||||
free(eet_file);
|
||||
if (eet_file->mesh)
|
||||
{
|
||||
free(eet_file->mesh->geometries[0].vertices);
|
||||
free(eet_file->mesh->geometries);
|
||||
free(eet_file->mesh->frames);
|
||||
free(eet_file->mesh->materials[0].colors);
|
||||
free(eet_file->mesh->materials);
|
||||
free(eet_file->mesh);
|
||||
}
|
||||
|
||||
if (eet_file->header)
|
||||
{
|
||||
free(eet_file->header->materials);
|
||||
free(eet_file->header->geometries);
|
||||
free(eet_file->header);
|
||||
}
|
||||
|
||||
free(eet_file);
|
||||
eet_file = NULL;
|
||||
_evas_canvas3d_eet_descriptor_shutdown();
|
||||
eet_shutdown();
|
||||
eina_shutdown();
|
||||
|
|
|
@ -90,6 +90,9 @@
|
|||
#define lround(x) (((x) < 0) ? (long int)ceil((x) - 0.5) : (long int)floor((x) + 0.5))
|
||||
#endif
|
||||
|
||||
/*macro to be used in eet loader/saver*/
|
||||
#define EVAS_CANVAS3D_FILE_CACHE_FILE_ENTRY "evas_3d file"
|
||||
|
||||
/* macros needed to log message through eina_log */
|
||||
extern EAPI int _evas_log_dom_global;
|
||||
#ifdef _EVAS_DEFAULT_LOG_DOM
|
||||
|
|
|
@ -1784,9 +1784,11 @@ void evas_canvas3d_scene_data_fini(Evas_Canvas3D_Scene_Public_Data *data);
|
|||
|
||||
/* Eet saver/loader functions */
|
||||
Evas_Canvas3D_File_Eet *_evas_canvas3d_eet_file_new(void);
|
||||
void _evas_canvas3d_eet_file_init(void);
|
||||
void _evas_canvas3d_eet_descriptor_shutdown(void);
|
||||
void _evas_canvas3d_eet_file_free(void);
|
||||
Eet_Data_Descriptor* _evas_canvas3d_eet_file_get();
|
||||
void _evas_canvas3d_eet_file_init();
|
||||
void _evas_canvas3d_eet_descriptor_shutdown();
|
||||
void _evas_canvas3d_eet_file_free(Evas_Canvas3D_File_Eet* eet_file);
|
||||
|
||||
|
||||
/* Filters */
|
||||
void evas_filter_init(void);
|
||||
|
|
|
@ -7,10 +7,6 @@
|
|||
#include "evas_common_private.h"
|
||||
#include "evas_private.h"
|
||||
|
||||
extern Evas_Canvas3D_File_Eet* eet_file;
|
||||
extern const char EVAS_CANVAS3D_FILE_CACHE_FILE_ENTRY[];
|
||||
extern Eet_Data_Descriptor *_file_descriptor;
|
||||
|
||||
void
|
||||
_set_geometry_to_mesh_from_eet_file(Evas_Canvas3D_Mesh *mesh,
|
||||
Evas_Canvas3D_Mesh_Eet *eet_mesh)
|
||||
|
@ -107,8 +103,11 @@ void
|
|||
evas_model_load_file_eet(Evas_Canvas3D_Mesh *mesh, Eina_File *file)
|
||||
{
|
||||
Eet_File *ef;
|
||||
Evas_Canvas3D_File_Eet* eet_file;
|
||||
Eet_Data_Descriptor *_file_descriptor;
|
||||
|
||||
_evas_canvas3d_eet_file_init();
|
||||
|
||||
_file_descriptor = _evas_canvas3d_eet_file_get();
|
||||
ef = eet_mmap(file);
|
||||
eet_file = eet_data_read(ef,
|
||||
_file_descriptor,
|
||||
|
@ -119,14 +118,14 @@ evas_model_load_file_eet(Evas_Canvas3D_Mesh *mesh, Eina_File *file)
|
|||
if ((eet_file->mesh == NULL) || (eet_file->header == NULL))
|
||||
{
|
||||
ERR("Reading of file is failed.");
|
||||
_evas_canvas3d_eet_file_free();
|
||||
_evas_canvas3d_eet_file_free(eet_file);
|
||||
return;
|
||||
}
|
||||
|
||||
_set_geometry_to_mesh_from_eet_file(mesh, eet_file->mesh);
|
||||
_set_material_to_mesh_from_eet_file(mesh, eet_file->mesh);
|
||||
|
||||
_evas_canvas3d_eet_file_free();
|
||||
_evas_canvas3d_eet_file_free(eet_file);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -9,10 +9,6 @@
|
|||
#define COMPONENT_OF_DEFAULT_GREY_COLOR 0.3
|
||||
#define TRANSPARENCY_OF_DEFAULT_GREY_COLOR 0.5
|
||||
|
||||
extern Evas_Canvas3D_File_Eet* eet_file;
|
||||
extern const char EVAS_CANVAS3D_FILE_CACHE_FILE_ENTRY[];
|
||||
extern Eet_Data_Descriptor *_file_descriptor;
|
||||
|
||||
void
|
||||
_set_geometry_to_eet_file_from_mesh(Evas_Canvas3D_Mesh_Data *mesh,
|
||||
Evas_Canvas3D_Mesh_Eet *eet_mesh,
|
||||
|
@ -154,8 +150,10 @@ evas_model_save_file_eet(const Evas_Canvas3D_Mesh *mesh,
|
|||
Eet_File *ef = eet_open(file, EET_FILE_MODE_WRITE);
|
||||
Evas_Canvas3D_Mesh_Eet* eet_mesh = malloc(sizeof(Evas_Canvas3D_Mesh_Eet));
|
||||
Evas_Canvas3D_Header_Eet* eet_header = malloc(sizeof(Evas_Canvas3D_Header_Eet));
|
||||
Eet_Data_Descriptor *_file_descriptor;
|
||||
Evas_Canvas3D_File_Eet *eet_file;
|
||||
|
||||
_evas_canvas3d_eet_file_init();
|
||||
_file_descriptor = _evas_canvas3d_eet_file_get();
|
||||
|
||||
eet_file = _evas_canvas3d_eet_file_new();
|
||||
|
||||
|
@ -176,7 +174,7 @@ evas_model_save_file_eet(const Evas_Canvas3D_Mesh *mesh,
|
|||
ERR("Opening of file is failed.");
|
||||
free(eet_mesh);
|
||||
free(eet_header);
|
||||
_evas_canvas3d_eet_file_free();
|
||||
_evas_canvas3d_eet_file_free(eet_file);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -190,6 +188,6 @@ evas_model_save_file_eet(const Evas_Canvas3D_Mesh *mesh,
|
|||
EINA_TRUE);
|
||||
eet_close(ef);
|
||||
|
||||
_evas_canvas3d_eet_file_free();
|
||||
_evas_canvas3d_eet_file_free(eet_file);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue