]> Zhao Yanbai Git Server - minix.git/commitdiff
VM/VFS: align ELF header buffer 70/3170/1
authorDavid van Moolenbroek <david@minix3.org>
Thu, 3 Sep 2015 10:09:54 +0000 (12:09 +0200)
committerDavid van Moolenbroek <david@minix3.org>
Thu, 17 Sep 2015 17:14:29 +0000 (17:14 +0000)
The libexec ELF parser expects to be given a word-aligned buffer,
but the ASR pass may cause VM and VFS to pass it an arbitrarily
aligned buffer, causing libexec to refuse loading the executable.
This patch aligns the buffers explicitly.

Change-Id: Ic2d5fd3a8f204c3e4f000cffdb7ac71c8339257a

minix/servers/vfs/exec.c
minix/servers/vm/main.c

index 90e19c057ce7af9eda9027281d555e163192cd8d..6d105e2dea9caa2b9a2dedc613e89aba0ed0140e 100644 (file)
@@ -740,7 +740,12 @@ static int map_header(struct vfs_exec_info *execi)
   int r;
   size_t cum_io;
   off_t pos, new_pos;
-  static char hdr[PAGE_SIZE]; /* Assume that header is not larger than a page */
+  /* Assume that header is not larger than a page. Align the buffer reasonably
+   * well, because libexec casts it to a structure directly and therefore
+   * expects it to be aligned appropriately. From here we can only guess the
+   * proper alignment, but 64 bits should work for all versions of ELF..
+   */
+  static char hdr[PAGE_SIZE] __aligned(8);
 
   pos = 0;     /* Read from the start of the file */
 
index b6b305698ff138dfdc1a9ed65f26172f167d3e5a..884fb43e1e8cbd9ca73ee0c6857114001652b647 100644 (file)
@@ -333,7 +333,8 @@ static void exec_bootproc(struct vmproc *vmp, struct boot_image *ip)
 {
        struct vm_exec_info vmexeci;
        struct exec_info *execi = &vmexeci.execi;
-       char hdr[VM_PAGE_SIZE];
+       /* libexec need proper alignment for casting to structures */
+       char hdr[VM_PAGE_SIZE] __aligned(8);
 
        size_t frame_size = 0;  /* Size of the new initial stack. */
        int argc = 0;           /* Argument count. */