From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8359CC072A2 for ; Wed, 22 Nov 2023 07:15:54 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 189E26B0574; Wed, 22 Nov 2023 02:15:54 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 13B216B0575; Wed, 22 Nov 2023 02:15:54 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 003C36B0576; Wed, 22 Nov 2023 02:15:53 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0015.hostedemail.com [216.40.44.15]) by kanga.kvack.org (Postfix) with ESMTP id E02AE6B0574 for ; Wed, 22 Nov 2023 02:15:53 -0500 (EST) Received: from smtpin21.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay07.hostedemail.com (Postfix) with ESMTP id B58D816018B for ; Wed, 22 Nov 2023 07:15:53 +0000 (UTC) X-FDA: 81484730586.21.D9A5DD0 Received: from szxga02-in.huawei.com (szxga02-in.huawei.com [45.249.212.188]) by imf23.hostedemail.com (Postfix) with ESMTP id 1E3FC140009 for ; Wed, 22 Nov 2023 07:15:49 +0000 (UTC) Authentication-Results: imf23.hostedemail.com; dkim=none; dmarc=pass (policy=quarantine) header.from=huawei.com; spf=pass (imf23.hostedemail.com: domain of ruanjinjie@huawei.com designates 45.249.212.188 as permitted sender) smtp.mailfrom=ruanjinjie@huawei.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1700637351; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=4u6Udc6iyDz3PgTQP7ry5+8NyNrvDxhtDLo9HBICGf8=; b=ZbOxWu7WiLQjnCFbQdRGZbPO/cGEXiODvy7oWK4QVAP332INrf7rl2AFk2RgfGlaVist9P GDuoJKYYJcXN9OFCTWUs1uFPYSeGj9orK/D8LhiazZoxBqy44MjZeYPjULOKJVTqomzHwj zBCngeG55qut4RLxijtkVtZtx6nOkTU= ARC-Authentication-Results: i=1; imf23.hostedemail.com; dkim=none; dmarc=pass (policy=quarantine) header.from=huawei.com; spf=pass (imf23.hostedemail.com: domain of ruanjinjie@huawei.com designates 45.249.212.188 as permitted sender) smtp.mailfrom=ruanjinjie@huawei.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1700637351; a=rsa-sha256; cv=none; b=pIbOsqskw//JuTE47wZGMHCpVlNvWhKD9ztx0JGSwsYIOmuT283Y4EJrdJWKUDU//hieUX VP/AV+ErcKYn6vnKoIN9REBFKSwWYK+iTmicjBUqX5Esw3f1plN9UU5KVWoEVDXUKtG8VT uCOWhkESlX2LD5QHAfSZWrB9OKSZCCA= Received: from kwepemi500008.china.huawei.com (unknown [172.30.72.53]) by szxga02-in.huawei.com (SkyGuard) with ESMTP id 4SZsq30tX6zRhS4; Wed, 22 Nov 2023 15:11:11 +0800 (CST) Received: from [10.67.109.254] (10.67.109.254) by kwepemi500008.china.huawei.com (7.221.188.139) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.35; Wed, 22 Nov 2023 15:15:26 +0800 Message-ID: <158e642b-7c42-d7a6-e0eb-813d947a1e32@huawei.com> Date: Wed, 22 Nov 2023 15:15:26 +0800 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Thunderbird/102.2.0 Subject: Re: [patch 105/118] fs/binfmt_elf.c: don't copy ELF header around Content-Language: en-US To: , , , , , References: <20200130221021.5f0211c56346d5485af07923@linux-foundation.org> <20200131061655.5PTo3WfTa%akpm@linux-foundation.org> CC: From: Jinjie Ruan In-Reply-To: <20200131061655.5PTo3WfTa%akpm@linux-foundation.org> Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 7bit X-Originating-IP: [10.67.109.254] X-ClientProxiedBy: dggems703-chm.china.huawei.com (10.3.19.180) To kwepemi500008.china.huawei.com (7.221.188.139) X-CFilter-Loop: Reflected X-Rspamd-Queue-Id: 1E3FC140009 X-Rspam-User: X-Rspamd-Server: rspam04 X-Stat-Signature: jedg9ggz49q7rmibuouhppfitpbhiu93 X-HE-Tag: 1700637349-132311 X-HE-Meta: U2FsdGVkX19ZqpeVXeAIwPXJa1kFJ20hCwU1vysJQrkOR75S/ivL1oQhR9BvhpOnX5h4xrEfOVNsgW3uDbUIOfp9fx6AwabmvLbnvFLsnK5lDnIN7nD68ZsMPbjtsHsUaf9S8p0HTejcFRRbjpDnU7RtNs/j2IDQTqmZWR8p3sEDqpx23DjLwbT3eJY+bKfMJWUn6MynPz7V73mrF9lnmVygwu0zTWf/PIoJcdyBaiRv0di6xTLw9B2ji6kcEvMl4iXwhkA8CEhpLbNE0ORxKKjWChCxjPCSIo5OJOi4zxZVZ6BR9ZRSqxhH3Mockr4o4fiZ8eVy259u+c1lnpQ6HLRVGloAiFtVZlSYxGRmqQaaAoQzmhhx+fcA2ur0CYlTP+ZEadqQDSC5A/X7b3PNZMDTPwP5c+qO4n7xk4r5mgL9gNuQsoyGZWyJ3FNmXlBGCj9J2marz7Gfh4T6Ki5sMtaSN0ZOA03UFC7TRRa94MPPIBYEtXNdwMsVRvwvoyxa9hAybEOm2nzy3yjOi8HiMsfxWS2E/8ZbzS22QgvHi24JxMkqMTX/zEavzr3RreyyEA844JBnx0j986GrU2xNqo4sXw6rUeyGCDQ1Ny8hV5vM474c1YsXYjrQ/OXhKW3BR05XIoEsXX3zQjUsg6rctgWNdXoGXU3FM+Ih9W6e56uUZRKZ9YwMbYu4bOLdpQ1iQr1CAEfm1Yg0DKlGWpDAjgYeEY9crxmybVu2t0XKmSSR/64us1b33oRNUF/I2vQvYrR06M4ft/VVo6653j49hk92wpfgpJcyv5hes81YbWqL0ZGjro5dEPuz1ZcectzXFjeHQu1AJf/D2irXWPIXg70bqWTZLQ8BN0UhuJSQdpzX3YcUBZmOlsfZCtJBNhOyro0qRF3Snclp380toz+TEkPn6tetm8KLiPvSZOtRtGMshCQeGpMZk+ciBcACQC5n9cbxT/jBow680TjKI98 VqCCXvSy LN2WHW3XIRSsmU25I7nnAFSYI3kfsPs1/ewz+a1//RucTF5W8/YzEHQZDU4EhBiEP6/Twmg26/tSJO9mspSFV6Z0kW52Ysbkn4jQwjrrGzHI57HU8D0I/Y7SUuLyIVzUugvcaZoP5eeIy8YW79ea2v61WAMEbEEXUpTxXn/iGQj5VJLqkDwWr3R6cCzP+upmiBqGEK940HlkuA632A8iEyHOyPrawfzPyU+/mrO7IblauGyKcGQgHNu7zoG3X45HcusiU8su5CUejHu9Q/cBx+XGKDej+e0N3EJUefYgcKVj8Pcv6TXIIcxh1rTzQuJGbKHNV X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: On 2020/1/31 14:16, Andrew Morton wrote: > From: Alexey Dobriyan > Subject: fs/binfmt_elf.c: don't copy ELF header around > > ELF header is read into bprm->buf[] by generic execve code. > > Save a memcpy and allocate just one header for the interpreter instead of > two headers (64 bytes instead of 128 on 64-bit). > > Link: http://lkml.kernel.org/r/20191208171242.GA19716@avx2 > Signed-off-by: Alexey Dobriyan > Reviewed-by: Andrew Morton > Signed-off-by: Andrew Morton > --- > > fs/binfmt_elf.c | 55 ++++++++++++++++++++++------------------------ > 1 file changed, 27 insertions(+), 28 deletions(-) > > --- a/fs/binfmt_elf.c~elf-dont-copy-elf-header-around > +++ a/fs/binfmt_elf.c > @@ -161,8 +161,9 @@ static int padzero(unsigned long elf_bss > #endif > > static int > -create_elf_tables(struct linux_binprm *bprm, struct elfhdr *exec, > - unsigned long load_addr, unsigned long interp_load_addr) > +create_elf_tables(struct linux_binprm *bprm, const struct elfhdr *exec, > + unsigned long load_addr, unsigned long interp_load_addr, > + unsigned long e_entry) > { > unsigned long p = bprm->p; > int argc = bprm->argc; > @@ -251,7 +252,7 @@ create_elf_tables(struct linux_binprm *b > NEW_AUX_ENT(AT_PHNUM, exec->e_phnum); > NEW_AUX_ENT(AT_BASE, interp_load_addr); > NEW_AUX_ENT(AT_FLAGS, 0); > - NEW_AUX_ENT(AT_ENTRY, exec->e_entry); > + NEW_AUX_ENT(AT_ENTRY, e_entry); > NEW_AUX_ENT(AT_UID, from_kuid_munged(cred->user_ns, cred->uid)); > NEW_AUX_ENT(AT_EUID, from_kuid_munged(cred->user_ns, cred->euid)); > NEW_AUX_ENT(AT_GID, from_kgid_munged(cred->user_ns, cred->gid)); > @@ -690,12 +691,13 @@ static int load_elf_binary(struct linux_ > int bss_prot = 0; > int retval, i; > unsigned long elf_entry; > + unsigned long e_entry; > unsigned long interp_load_addr = 0; > unsigned long start_code, end_code, start_data, end_data; > unsigned long reloc_func_desc __maybe_unused = 0; > int executable_stack = EXSTACK_DEFAULT; > + struct elfhdr *elf_ex = (struct elfhdr *)bprm->buf; > struct { > - struct elfhdr elf_ex; > struct elfhdr interp_elf_ex; > } *loc; > struct arch_elf_state arch_state = INIT_ARCH_ELF_STATE; > @@ -706,30 +708,27 @@ static int load_elf_binary(struct linux_ > retval = -ENOMEM; > goto out_ret; > } > - > - /* Get the exec-header */ > - loc->elf_ex = *((struct elfhdr *)bprm->buf); > > retval = -ENOEXEC; > /* First of all, some simple consistency checks */ > - if (memcmp(loc->elf_ex.e_ident, ELFMAG, SELFMAG) != 0) > + if (memcmp(elf_ex->e_ident, ELFMAG, SELFMAG) != 0) > goto out; > > - if (loc->elf_ex.e_type != ET_EXEC && loc->elf_ex.e_type != ET_DYN) > + if (elf_ex->e_type != ET_EXEC && elf_ex->e_type != ET_DYN) > goto out; > - if (!elf_check_arch(&loc->elf_ex)) > + if (!elf_check_arch(elf_ex)) > goto out; > - if (elf_check_fdpic(&loc->elf_ex)) > + if (elf_check_fdpic(elf_ex)) > goto out; > if (!bprm->file->f_op->mmap) > goto out; > > - elf_phdata = load_elf_phdrs(&loc->elf_ex, bprm->file); > + elf_phdata = load_elf_phdrs(elf_ex, bprm->file); > if (!elf_phdata) > goto out; > > elf_ppnt = elf_phdata; > - for (i = 0; i < loc->elf_ex.e_phnum; i++, elf_ppnt++) { > + for (i = 0; i < elf_ex->e_phnum; i++, elf_ppnt++) { > char *elf_interpreter; > > if (elf_ppnt->p_type != PT_INTERP) > @@ -783,7 +782,7 @@ out_free_interp: > } > > elf_ppnt = elf_phdata; > - for (i = 0; i < loc->elf_ex.e_phnum; i++, elf_ppnt++) > + for (i = 0; i < elf_ex->e_phnum; i++, elf_ppnt++) > switch (elf_ppnt->p_type) { > case PT_GNU_STACK: > if (elf_ppnt->p_flags & PF_X) > @@ -793,7 +792,7 @@ out_free_interp: > break; > > case PT_LOPROC ... PT_HIPROC: > - retval = arch_elf_pt_proc(&loc->elf_ex, elf_ppnt, > + retval = arch_elf_pt_proc(elf_ex, elf_ppnt, > bprm->file, false, > &arch_state); > if (retval) > @@ -837,7 +836,7 @@ out_free_interp: > * still possible to return an error to the code that invoked > * the exec syscall. > */ > - retval = arch_check_elf(&loc->elf_ex, > + retval = arch_check_elf(elf_ex, > !!interpreter, &loc->interp_elf_ex, > &arch_state); > if (retval) > @@ -850,8 +849,8 @@ out_free_interp: > > /* Do this immediately, since STACK_TOP as used in setup_arg_pages > may depend on the personality. */ > - SET_PERSONALITY2(loc->elf_ex, &arch_state); > - if (elf_read_implies_exec(loc->elf_ex, executable_stack)) > + SET_PERSONALITY2(*elf_ex, &arch_state); It seems that the "SET_PERSONALITY2()" is a little late. When a 32-bit compatible user-mode program forks out a 64-bit program, when the 64-bit program is run in execve() the 32-bit STACK_TOP_MAX is used to set vm_end and vm_start of the vma in __bprm_mm_init() in alloc_bprm() because the 32-bit compatible flag has not been cleared, but the setup_arg_pages() function later uses 64-bit STACK_TOP after calling this SET_PERSONALITY2() to clear the 32-bit compatible flag, which doesn't seem reasonable. > + if (elf_read_implies_exec(*elf_ex, executable_stack)) > current->personality |= READ_IMPLIES_EXEC; > > if (!(current->personality & ADDR_NO_RANDOMIZE) && randomize_va_space) > @@ -878,7 +877,7 @@ out_free_interp: > /* Now we do a little grungy work by mmapping the ELF image into > the correct location in memory. */ > for(i = 0, elf_ppnt = elf_phdata; > - i < loc->elf_ex.e_phnum; i++, elf_ppnt++) { > + i < elf_ex->e_phnum; i++, elf_ppnt++) { > int elf_prot, elf_flags; > unsigned long k, vaddr; > unsigned long total_size = 0; > @@ -922,9 +921,9 @@ out_free_interp: > * If we are loading ET_EXEC or we have already performed > * the ET_DYN load_addr calculations, proceed normally. > */ > - if (loc->elf_ex.e_type == ET_EXEC || load_addr_set) { > + if (elf_ex->e_type == ET_EXEC || load_addr_set) { > elf_flags |= MAP_FIXED; > - } else if (loc->elf_ex.e_type == ET_DYN) { > + } else if (elf_ex->e_type == ET_DYN) { > /* > * This logic is run once for the first LOAD Program > * Header for ET_DYN binaries to calculate the > @@ -973,7 +972,7 @@ out_free_interp: > load_bias = ELF_PAGESTART(load_bias - vaddr); > > total_size = total_mapping_size(elf_phdata, > - loc->elf_ex.e_phnum); > + elf_ex->e_phnum); > if (!total_size) { > retval = -EINVAL; > goto out_free_dentry; > @@ -991,7 +990,7 @@ out_free_interp: > if (!load_addr_set) { > load_addr_set = 1; > load_addr = (elf_ppnt->p_vaddr - elf_ppnt->p_offset); > - if (loc->elf_ex.e_type == ET_DYN) { > + if (elf_ex->e_type == ET_DYN) { > load_bias += error - > ELF_PAGESTART(load_bias + vaddr); > load_addr += load_bias; > @@ -1032,7 +1031,7 @@ out_free_interp: > } > } > > - loc->elf_ex.e_entry += load_bias; > + e_entry = elf_ex->e_entry + load_bias; > elf_bss += load_bias; > elf_brk += load_bias; > start_code += load_bias; > @@ -1075,7 +1074,7 @@ out_free_interp: > allow_write_access(interpreter); > fput(interpreter); > } else { > - elf_entry = loc->elf_ex.e_entry; > + elf_entry = e_entry; > if (BAD_ADDR(elf_entry)) { > retval = -EINVAL; > goto out_free_dentry; > @@ -1093,8 +1092,8 @@ out_free_interp: > goto out; > #endif /* ARCH_HAS_SETUP_ADDITIONAL_PAGES */ > > - retval = create_elf_tables(bprm, &loc->elf_ex, > - load_addr, interp_load_addr); > + retval = create_elf_tables(bprm, elf_ex, > + load_addr, interp_load_addr, e_entry); > if (retval < 0) > goto out; > current->mm->end_code = end_code; > @@ -1112,7 +1111,7 @@ out_free_interp: > * growing down), and into the unused ELF_ET_DYN_BASE region. > */ > if (IS_ENABLED(CONFIG_ARCH_HAS_ELF_RANDOMIZE) && > - loc->elf_ex.e_type == ET_DYN && !interpreter) > + elf_ex->e_type == ET_DYN && !interpreter) > current->mm->brk = current->mm->start_brk = > ELF_ET_DYN_BASE; > > _