From: Christoph Hellwig <hch@lst.de> To: Andrew Morton <akpm@linux-foundation.org>, Alexander Viro <viro@zeniv.linux.org.uk> Cc: Jeremy Kerr <jk@ozlabs.org>, Arnd Bergmann <arnd@arndb.de>, "Eric W . Biederman" <ebiederm@xmission.com>, linuxppc-dev@lists.ozlabs.org, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 7/7] exec: open code copy_string_kernel Date: Tue, 21 Apr 2020 17:42:04 +0200 Message-ID: <20200421154204.252921-8-hch@lst.de> (raw) In-Reply-To: <20200421154204.252921-1-hch@lst.de> Currently copy_string_kernel is just a wrapper around copy_strings that simplifies the calling conventions and uses set_fs to allow passing a kernel pointer. But due to the fact the we only need to handle a single kernel argument pointer, the logic can be sigificantly simplified while getting rid of the set_fs. Signed-off-by: Christoph Hellwig <hch@lst.de> --- fs/exec.c | 43 ++++++++++++++++++++++++++++++++++--------- 1 file changed, 34 insertions(+), 9 deletions(-) diff --git a/fs/exec.c b/fs/exec.c index b2a77d5acede..ea90af1fb236 100644 --- a/fs/exec.c +++ b/fs/exec.c @@ -592,17 +592,42 @@ static int copy_strings(int argc, struct user_arg_ptr argv, */ int copy_string_kernel(const char *arg, struct linux_binprm *bprm) { - int r; - mm_segment_t oldfs = get_fs(); - struct user_arg_ptr argv = { - .ptr.native = (const char __user *const __user *)&arg, - }; + int len = strnlen(arg, MAX_ARG_STRLEN) + 1 /* terminating NUL */; + unsigned long pos = bprm->p; + + if (len == 0) + return -EFAULT; + if (!valid_arg_len(bprm, len)) + return -E2BIG; + + /* We're going to work our way backwards. */ + arg += len; + bprm->p -= len; + if (IS_ENABLED(CONFIG_MMU) && bprm->p < bprm->argmin) + return -E2BIG; + + while (len > 0) { + unsigned int bytes_to_copy = min_t(unsigned int, len, + min_not_zero(offset_in_page(pos), PAGE_SIZE)); + struct page *page; + char *kaddr; - set_fs(KERNEL_DS); - r = copy_strings(1, argv, bprm); - set_fs(oldfs); + pos -= bytes_to_copy; + arg -= bytes_to_copy; + len -= bytes_to_copy; - return r; + page = get_arg_page(bprm, pos, 1); + if (!page) + return -E2BIG; + kaddr = kmap_atomic(page); + flush_arg_page(bprm, pos & PAGE_MASK, page); + memcpy(kaddr + offset_in_page(pos), arg, bytes_to_copy); + flush_kernel_dcache_page(page); + kunmap_atomic(kaddr); + put_arg_page(page); + } + + return 0; } EXPORT_SYMBOL(copy_string_kernel); -- 2.26.1
prev parent reply index Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top 2020-04-21 15:41 remove set_fs calls from the exec and coredump code v3 Christoph Hellwig 2020-04-21 15:41 ` [PATCH 1/7] powerpc/spufs: simplify spufs core dumping Christoph Hellwig 2020-04-21 18:49 ` Al Viro 2020-04-21 19:01 ` Christoph Hellwig 2020-04-21 19:19 ` Al Viro 2020-04-21 19:25 ` Al Viro 2020-04-21 15:41 ` [PATCH 2/7] signal: factor copy_siginfo_to_external32 from copy_siginfo_to_user32 Christoph Hellwig 2020-04-26 4:47 ` Andrew Morton 2020-04-26 7:40 ` Christoph Hellwig 2020-04-27 22:40 ` Andrew Morton 2020-04-28 7:09 ` Christoph Hellwig 2020-04-28 7:45 ` Christophe Leroy 2020-04-28 7:48 ` Christoph Hellwig 2020-04-28 19:56 ` [PATCH] fixup! " Arnd Bergmann 2020-04-29 6:17 ` Christophe Leroy 2020-04-29 6:29 ` Christoph Hellwig 2020-04-29 6:44 ` Christoph Hellwig 2020-04-29 8:07 ` Arnd Bergmann 2020-04-29 9:42 ` Christoph Hellwig 2020-04-29 11:28 ` Arnd Bergmann 2020-04-29 11:53 ` Christoph Hellwig 2020-04-29 12:34 ` Arnd Bergmann 2020-04-21 15:42 ` [PATCH 3/7] binfmt_elf: femove the set_fs in fill_siginfo_note Christoph Hellwig 2020-04-21 15:42 ` [PATCH 4/7] binfmt_elf: remove the set_fs(KERNEL_DS) in elf_core_dump Christoph Hellwig 2020-04-21 15:42 ` [PATCH 5/7] binfmt_elf_fdpic: remove the set_fs(KERNEL_DS) in elf_fdpic_core_dump Christoph Hellwig 2020-04-21 15:42 ` [PATCH 6/7] exec: simplify the copy_strings_kernel calling convention Christoph Hellwig 2020-04-21 15:42 ` Christoph Hellwig [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=20200421154204.252921-8-hch@lst.de \ --to=hch@lst.de \ --cc=akpm@linux-foundation.org \ --cc=arnd@arndb.de \ --cc=ebiederm@xmission.com \ --cc=jk@ozlabs.org \ --cc=linux-fsdevel@vger.kernel.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linuxppc-dev@lists.ozlabs.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
Linux-Fsdevel Archive on lore.kernel.org Archives are clonable: git clone --mirror https://lore.kernel.org/linux-fsdevel/0 linux-fsdevel/git/0.git # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V2 linux-fsdevel linux-fsdevel/ https://lore.kernel.org/linux-fsdevel \ linux-fsdevel@vger.kernel.org public-inbox-index linux-fsdevel Example config snippet for mirrors Newsgroup available over NNTP: nntp://nntp.lore.kernel.org/org.kernel.vger.linux-fsdevel AGPL code for this site: git clone https://public-inbox.org/public-inbox.git