eina: Reinstall magic checks on Eina_File

file != NULL does not mean it's valid. Since Eina_File is
a basic eina type a magic check is still better than nothing.
It can avoid doing eina_file_dup() on a closed file for instance.

This "fixes" a crash in eina_file_close with invalid files.

Now I can go hunt the root cause...
This commit is contained in:
Jean-Philippe Andre 2016-12-08 15:49:03 +09:00
parent 4a67074a67
commit 208e152baf
1 changed files with 26 additions and 7 deletions

View File

@ -60,6 +60,23 @@
Eina_Hash *_eina_file_cache = NULL; Eina_Hash *_eina_file_cache = NULL;
Eina_Lock _eina_file_lock_cache; Eina_Lock _eina_file_lock_cache;
#if defined(EINA_SAFETY_CHECKS) && defined(EINA_MAGIC_DEBUG)
# define EINA_FILE_MAGIC_CHECK(f, ...) do { \
if (EINA_UNLIKELY((f) == NULL)) \
{ \
EINA_SAFETY_ERROR("safety check failed: " # f " == NULL"); \
return __VA_ARGS__; \
} \
if (EINA_UNLIKELY((f)->__magic != EINA_FILE_MAGIC)) \
{ \
EINA_MAGIC_FAIL(f, EINA_FILE_MAGIC); \
return __VA_ARGS__; \
} \
} while (0)
#else
# define EINA_FILE_MAGIC_CHECK(f, ...) do {} while(0)
#endif
static char * static char *
_eina_file_escape(char *path, size_t len) _eina_file_escape(char *path, size_t len)
{ {
@ -446,8 +463,9 @@ eina_file_virtualize(const char *virtual_name, const void *data, unsigned long l
EAPI Eina_Bool EAPI Eina_Bool
eina_file_virtual(Eina_File *file) eina_file_virtual(Eina_File *file)
{ {
if (file) return file->virtual; if (!file) return EINA_FALSE;
return EINA_FALSE; EINA_FILE_MAGIC_CHECK(file, EINA_FALSE);
return file->virtual;
} }
EAPI Eina_File * EAPI Eina_File *
@ -457,6 +475,7 @@ eina_file_dup(const Eina_File *f)
if (file) if (file)
{ {
EINA_FILE_MAGIC_CHECK(f, NULL);
eina_lock_take(&file->lock); eina_lock_take(&file->lock);
file->refcount++; file->refcount++;
eina_lock_release(&file->lock); eina_lock_release(&file->lock);
@ -486,7 +505,7 @@ eina_file_close(Eina_File *file)
unsigned int length; unsigned int length;
unsigned int key; unsigned int key;
EINA_SAFETY_ON_NULL_RETURN(file); EINA_FILE_MAGIC_CHECK(file);
eina_lock_take(&_eina_file_lock_cache); eina_lock_take(&_eina_file_lock_cache);
@ -513,21 +532,21 @@ eina_file_close(Eina_File *file)
EAPI size_t EAPI size_t
eina_file_size_get(const Eina_File *file) eina_file_size_get(const Eina_File *file)
{ {
EINA_SAFETY_ON_NULL_RETURN_VAL(file, 0); EINA_FILE_MAGIC_CHECK(file, 0);
return file->length; return file->length;
} }
EAPI time_t EAPI time_t
eina_file_mtime_get(const Eina_File *file) eina_file_mtime_get(const Eina_File *file)
{ {
EINA_SAFETY_ON_NULL_RETURN_VAL(file, 0); EINA_FILE_MAGIC_CHECK(file, 0);
return file->mtime; return file->mtime;
} }
EAPI const char * EAPI const char *
eina_file_filename_get(const Eina_File *file) eina_file_filename_get(const Eina_File *file)
{ {
EINA_SAFETY_ON_NULL_RETURN_VAL(file, NULL); EINA_FILE_MAGIC_CHECK(file, NULL);
return file->filename; return file->filename;
} }
@ -622,7 +641,7 @@ eina_file_map_lines(Eina_File *file)
{ {
Eina_Lines_Iterator *it; Eina_Lines_Iterator *it;
EINA_SAFETY_ON_NULL_RETURN_VAL(file, NULL); EINA_FILE_MAGIC_CHECK(file, NULL);
if (file->length == 0) return NULL; if (file->length == 0) return NULL;