All of lore.kernel.org
 help / color / mirror / Atom feed
From: Nicolas Pitre <nicolas.pitre@linaro.org>
To: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org
Cc: Alexander Viro <viro@zeniv.linux.org.uk>,
	David Howells <dhowells@redhat.com>,
	Greg Ungerer <gerg@linux-m68k.org>
Subject: [PATCH v3 12/12] binfmt_flat: allow compressed flat binary format to work on MMU systems
Date: Wed, 20 Jul 2016 00:20:24 -0400	[thread overview]
Message-ID: <1468988424-32671-13-git-send-email-nicolas.pitre@linaro.org> (raw)
In-Reply-To: <1468988424-32671-1-git-send-email-nicolas.pitre@linaro.org>

Let's take the simple and obvious approach by decompressing the binary
into a kernel buffer and then copying it to user space.  Those who are
looking for top performance on an MMU system are unlikely to choose this
executable format anyway.

Signed-off-by: Nicolas Pitre <nico@linaro.org>
Reviewed-by: Greg Ungerer <gerg@linux-m68k.org>
---
 fs/binfmt_flat.c | 44 ++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 42 insertions(+), 2 deletions(-)

diff --git a/fs/binfmt_flat.c b/fs/binfmt_flat.c
index d04188267a..8dac70921b 100644
--- a/fs/binfmt_flat.c
+++ b/fs/binfmt_flat.c
@@ -37,6 +37,7 @@
 #include <linux/init.h>
 #include <linux/flat.h>
 #include <linux/syscalls.h>
+#include <linux/vmalloc.h>
 
 #include <asm/byteorder.h>
 #include <asm/uaccess.h>
@@ -632,6 +633,7 @@ static int load_flat_file(struct linux_binprm * bprm,
 		 * load it all in and treat it like a RAM load from now on
 		 */
 		if (flags & FLAT_FLAG_GZIP) {
+#ifndef CONFIG_MMU
 			result = decompress_exec(bprm, sizeof (struct flat_hdr),
 					 (((char *) textpos) + sizeof (struct flat_hdr)),
 					 (text_len + full_data
@@ -639,14 +641,52 @@ static int load_flat_file(struct linux_binprm * bprm,
 					 0);
 			memmove((void *) datapos, (void *) realdatastart,
 					full_data);
+#else
+			/*
+			 * This is used on MMU systems mainly for testing.
+			 * Let's use a kernel buffer to simplify things.
+			 */
+			long unz_text_len = text_len - sizeof(struct flat_hdr);
+			long unz_len = unz_text_len + full_data;
+			char *unz_data = vmalloc(unz_len);
+			if (!unz_data) {
+				result = -ENOMEM;
+			} else {
+				result = decompress_exec(bprm, sizeof(struct flat_hdr),
+							 unz_data, unz_len, 0);
+				if (result == 0 &&
+				    (copy_to_user((void __user *)textpos + sizeof(struct flat_hdr),
+						  unz_data, unz_text_len) ||
+				     copy_to_user((void __user *)datapos,
+				    		  unz_data + unz_text_len, full_data)))
+					result = -EFAULT;
+				vfree(unz_data);
+			}
+#endif
 		} else if (flags & FLAT_FLAG_GZDATA) {
 			result = read_code(bprm->file, textpos, 0, text_len);
-			if (!IS_ERR_VALUE(result))
+			if (!IS_ERR_VALUE(result)) {
+#ifndef CONFIG_MMU
 				result = decompress_exec(bprm, text_len, (char *) datapos,
 						 full_data, 0);
+#else
+				char *unz_data = vmalloc(full_data);
+				if (!unz_data) {
+					result = -ENOMEM;
+				} else {
+					result = decompress_exec(bprm, text_len,
+						       unz_data, full_data, 0);
+					if (result == 0 &&
+					    copy_to_user((void __user *)datapos,
+						         unz_data, full_data))
+						result = -EFAULT;
+					vfree(unz_data);
+				}
+#endif
+			}
 		}
 		else
-#endif
+#endif /* CONFIG_BINFMT_ZFLAT */
 		{
 			result = read_code(bprm->file, textpos, 0, text_len);
 			if (!IS_ERR_VALUE(result))
-- 
2.7.4

      parent reply	other threads:[~2016-07-20  4:21 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-07-20  4:20 [PATCH v3 00/12] allow BFLT executables on systems with a MMU Nicolas Pitre
2016-07-20  4:20 ` [PATCH v3 01/12] binfmt_flat: assorted cleanups Nicolas Pitre
2016-07-20  4:20 ` [PATCH v3 02/12] binfmt_flat: convert printk invocations to their modern form Nicolas Pitre
2016-07-20  4:30   ` Joe Perches
2016-07-20  4:30     ` Joe Perches
2016-07-20  5:05     ` Nicolas Pitre
2016-07-20  5:05       ` Nicolas Pitre
2016-07-20  4:20 ` [PATCH v3 03/12] binfmt_flat: prevent kernel dammage from corrupted executable headers Nicolas Pitre
2016-07-20  4:20 ` [PATCH v3 04/12] elf_fdpic_transfer_args_to_stack(): make it generic Nicolas Pitre
2016-07-20  4:20 ` [PATCH v3 05/12] binfmt_flat: use generic transfer_args_to_stack() Nicolas Pitre
2016-07-20  4:20 ` [PATCH v3 06/12] binfmt_flat: clean up create_flat_tables() and stack accesses Nicolas Pitre
2016-07-20  4:20 ` [PATCH v3 07/12] binfmt_flat: use proper user space accessors with relocs processing code Nicolas Pitre
2016-07-20  4:20 ` [PATCH v3 08/12] binfmt_flat: use proper user space accessors with old relocs code Nicolas Pitre
2016-07-20  4:20 ` [PATCH v3 09/12] binfmt_flat: use clear_user() rather than memset() to clear .bss Nicolas Pitre
2016-07-20  7:15   ` Greg Ungerer
2016-07-20  4:20 ` [PATCH v3 10/12] binfmt_flat: update libraries' data segment pointer with userspace accessors Nicolas Pitre
2016-07-20  4:20 ` [PATCH v3 11/12] binfmt_flat: add MMU-specific support Nicolas Pitre
2016-07-20  4:20 ` Nicolas Pitre [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1468988424-32671-13-git-send-email-nicolas.pitre@linaro.org \
    --to=nicolas.pitre@linaro.org \
    --cc=dhowells@redhat.com \
    --cc=gerg@linux-m68k.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=viro@zeniv.linux.org.uk \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.