eina_file: fix unmap of unmapped region when Eina_File has copied data and not a map;

Summary:
This was causing problems on non-Linux architectures as eina_file_real_close unmapped not mapped data. Added a "copied" flag to Eina_File which is set on eina_file_virtualize (on copied data), and tested for when eina_file_real_close does the unmap. I'm surprised Linux allowed this. Certainly all of the BSDs crashed with the previous behaviour.

@fix T5479

Test Plan: Example inlcude Rage and Enlightenment Thumb on BSD systems which use eina_file_virtualize with emotion to obtain album artwork.

Reviewers: raster, cedric, jpeg

Reviewed By: jpeg

Maniphest Tasks: T5479

Differential Revision: https://phab.enlightenment.org/D5006
This commit is contained in:
Al Poole 2017-07-07 11:19:31 +09:00 committed by Jean-Philippe Andre
parent 242127a96b
commit 9aeaef55c4
3 changed files with 3 additions and 1 deletions

View File

@ -295,7 +295,7 @@ eina_file_real_close(Eina_File *file)
free(map);
}
if (file->global_map != MAP_FAILED)
if (!file->copied && file->global_map != MAP_FAILED)
munmap(file->global_map, file->length);
if (file->fd != -1) close(file->fd);

View File

@ -448,6 +448,7 @@ eina_file_virtualize(const char *virtual_name, const void *data, unsigned long l
if (copy)
{
file->copied = EINA_TRUE;
file->global_map = ((char *)file) + head_padded;
memcpy((char *)file->global_map, data, length);
}

View File

@ -102,6 +102,7 @@ struct _Eina_File
Eina_Bool delete_me : 1; /**< Indicates that this file should be deleted */
Eina_Bool global_faulty : 1; /**< Indicates whether #global_map is bad */
Eina_Bool virtual : 1; /**< Indicates that this is a virtual file */
Eina_Bool copied : 1; /**< Indicates whether this file has copied data */
};
/**