From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932685Ab1JCWDS (ORCPT ); Mon, 3 Oct 2011 18:03:18 -0400 Received: from mail-pz0-f42.google.com ([209.85.210.42]:43646 "EHLO mail-pz0-f42.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751736Ab1JCWDJ (ORCPT ); Mon, 3 Oct 2011 18:03:09 -0400 Date: Mon, 3 Oct 2011 15:03:05 -0700 From: Andrew Morton To: Jiri Kosina Cc: Josh Boyer , Nicolas Pitre , Andrew Morton , Ingo Molnar , hongjiu.lu@intel.com, linux-kernel@vger.kernel.org, Russell King Subject: Re: [PATCH v2] binfmt_elf: Fix PIE execution with randomization disabled (was Re: [RFC PATCH] binfmt_elf: Fix PIE execution with randomization disabled) Message-Id: <20111003150305.936fc46e.akpm00@gmail.com> In-Reply-To: References: <20110929195359.GJ16720@zod.bos.redhat.com> <20110929141929.43df799d.akpm00@gmail.com> <20110930021629.GL16720@zod.bos.redhat.com> <20111003150345.GP16720@zod.bos.redhat.com> X-Mailer: Sylpheed 3.0.2 (GTK+ 2.20.1; x86_64-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Mon, 3 Oct 2011 17:11:47 +0200 (CEST) Jiri Kosina wrote: > > From: Jiri Kosina > Subject: [PATCH] binfmt_elf: fix PIE execution with randomization disabled > > The case of address space randomization being disabled in runtime through > randomize_va_space sysctl is not treated properly in load_elf_binary(), > resulting in SIGKILL coming at exec() time for certain PIE-linked binaries > in case the randomization has been disabled at runtime prior to calling > exec(). > > Handle the randomize_va_space == 0 case the same way as if we were not > supporting .text randomization at all. > > Based on original patch by H.J. Lu and > Josh Boyer > > Cc: Ingo Molnar > Cc: Jiri Kosina > Cc: Nicolas Pitre > Cc: Russell King > Signed-off-by: Jiri Kosina > --- > fs/binfmt_elf.c | 5 ++++- > 1 files changed, 4 insertions(+), 1 deletions(-) > > diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c > index dd0fdfc..bb11fe4 100644 > --- a/fs/binfmt_elf.c > +++ b/fs/binfmt_elf.c > @@ -795,7 +795,10 @@ static int load_elf_binary(struct linux_binprm *bprm, struct pt_regs *regs) > * might try to exec. This is because the brk will > * follow the loader, and is not movable. */ > #if defined(CONFIG_X86) || defined(CONFIG_ARM) > - load_bias = 0; > + if (current->flags & PF_RANDOMIZE) > + load_bias = 0; > + else > + load_bias = ELF_PAGESTART(ELF_ET_DYN_BASE - vaddr); > #else > load_bias = ELF_PAGESTART(ELF_ET_DYN_BASE - vaddr); > #endif Guys, it took several people several days and 10+ emails to work out what's happening in there, and the first attempt to fix it was buggy. This is all a huuuuge signal that the code is unobvious, hard to understand, hard to maintain. Please, let's get a good code comment in there while it's fresh in your minds. So the next person who comes along doesn't have the same amount of difficulty?