eina - fix eina_file_virtualize to copy data to an aligned addr
authorCarsten Haitzler (Rasterman) <raster@rasterman.com>
Fri, 7 Jul 2017 03:08:01 +0000 (12:08 +0900)
committerCarsten Haitzler (Rasterman) <raster@rasterman.com>
Fri, 7 Jul 2017 03:08:01 +0000 (12:08 +0900)
so we copy data to an UNALINED memory address (just after whatever
string we packed on the end of the eina file struct header). this is
bad. especially for non-intel architectures. this forces a 16 byte
alignment which should cover us.

@fix

src/lib/eina/eina_file_common.c

index 8d7472b..1008a5f 100644 (file)
@@ -403,7 +403,7 @@ eina_file_virtualize(const char *virtual_name, const void *data, unsigned long l
    Eina_Nano_Time tp;
    long int ti;
    const char *tmpname = "/dev/mem/virtual\\/%16x";
-   int slen;
+   size_t slen, head_padded;
 
    EINA_SAFETY_ON_NULL_RETURN_VAL(data, NULL);
 
@@ -412,19 +412,19 @@ eina_file_virtualize(const char *virtual_name, const void *data, unsigned long l
    ti = _eina_time_convert(&tp);
 
    slen = virtual_name ? strlen(virtual_name) + 1 : strlen(tmpname) + 17;
+   // align copied data at end of file struct to 16 bytes...
+   head_padded = 16 * ((sizeof(Eina_File) + slen + 15) / 16);
 
-   file = malloc(sizeof (Eina_File) +
-                 slen +
-                 (copy ? length : 0));
+   file = malloc(head_padded + (copy ? length : 0));
    if (!file) return NULL;
 
    memset(file, 0, sizeof(Eina_File));
    EINA_MAGIC_SET(file, EINA_FILE_MAGIC);
-   file->filename = (char*) (file + 1);
+   file->filename = (char *)(file + 1);
    if (virtual_name)
-     strcpy((char*) file->filename, virtual_name);
+     strcpy((char *)file->filename, virtual_name);
    else
-     sprintf((char*) file->filename, tmpname, ti);
+     sprintf((char *)file->filename, tmpname, ti);
 
    eina_lock_new(&file->lock);
    file->mtime = ti / 1000;
@@ -448,13 +448,12 @@ eina_file_virtualize(const char *virtual_name, const void *data, unsigned long l
 
    if (copy)
      {
-        file->global_map = (void*)(file->filename +
-                                   strlen(file->filename) + 1);
-        memcpy((char*) file->global_map, data, length);
+        file->global_map = ((char *)file) + head_padded;
+        memcpy((char *)file->global_map, data, length);
      }
    else
      {
-        file->global_map = (void*) data;
+        file->global_map = (void *)data;
      }
 
    return file;