diff options
author | Jean-Philippe Andre <jp.andre@samsung.com> | 2016-12-08 15:49:03 +0900 |
---|---|---|
committer | Jean-Philippe Andre <jp.andre@samsung.com> | 2016-12-08 16:30:34 +0900 |
commit | 208e152bafca9165d3dfccb99d96a4308a663ade (patch) | |
tree | 733b0f190853ba9f37755768768ab444a0baf6b1 | |
parent | 4a67074a67b33b03693013fe268d7373f2b1bf59 (diff) | |
download | efl-208e152bafca9165d3dfccb99d96a4308a663ade.tar.gz |
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...
-rw-r--r-- | src/lib/eina/eina_file_common.c | 33 |
1 files changed, 26 insertions, 7 deletions
diff --git a/src/lib/eina/eina_file_common.c b/src/lib/eina/eina_file_common.c index 5cbed8c1fc..34bd7e8169 100644 --- a/src/lib/eina/eina_file_common.c +++ b/src/lib/eina/eina_file_common.c @@ -60,6 +60,23 @@ Eina_Hash *_eina_file_cache = NULL; 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 * _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 eina_file_virtual(Eina_File *file) { - if (file) return file->virtual; - return EINA_FALSE; + if (!file) return EINA_FALSE; + EINA_FILE_MAGIC_CHECK(file, EINA_FALSE); + return file->virtual; } EAPI Eina_File * @@ -457,6 +475,7 @@ eina_file_dup(const Eina_File *f) if (file) { + EINA_FILE_MAGIC_CHECK(f, NULL); eina_lock_take(&file->lock); file->refcount++; eina_lock_release(&file->lock); @@ -486,7 +505,7 @@ eina_file_close(Eina_File *file) unsigned int length; unsigned int key; - EINA_SAFETY_ON_NULL_RETURN(file); + EINA_FILE_MAGIC_CHECK(file); eina_lock_take(&_eina_file_lock_cache); @@ -513,21 +532,21 @@ eina_file_close(Eina_File *file) EAPI size_t 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; } EAPI time_t 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; } EAPI const char * 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; } @@ -622,7 +641,7 @@ eina_file_map_lines(Eina_File *file) { Eina_Lines_Iterator *it; - EINA_SAFETY_ON_NULL_RETURN_VAL(file, NULL); + EINA_FILE_MAGIC_CHECK(file, NULL); if (file->length == 0) return NULL; |