From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with archive (Exim 4.43) id 1LjvnG-0005Oe-0F for mharc-grub-devel@gnu.org; Wed, 18 Mar 2009 09:26:50 -0400 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1LjvnE-0005NY-1K for grub-devel@gnu.org; Wed, 18 Mar 2009 09:26:48 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1Ljvn9-0005Lu-DX for grub-devel@gnu.org; Wed, 18 Mar 2009 09:26:47 -0400 Received: from [199.232.76.173] (port=36529 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Ljvn8-0005Lo-SO for grub-devel@gnu.org; Wed, 18 Mar 2009 09:26:42 -0400 Received: from mail-bw0-f167.google.com ([209.85.218.167]:60203) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1Ljvn8-0003OZ-AI for grub-devel@gnu.org; Wed, 18 Mar 2009 09:26:42 -0400 Received: by bwz11 with SMTP id 11so44305bwz.42 for ; Wed, 18 Mar 2009 06:26:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:message-id:date:from :user-agent:mime-version:to:subject:references:in-reply-to :content-type; bh=a+x+65zyr8GapP7CmeNz1sFzxJUcE1+7OmNQDG514Bo=; b=K0bQmx9ngFnccN0Fx8Voz9kU0Ud3CUMAoN75zo6Hqz9rYWtMUHk99JrKfmRm6P4XzK OCQ+9WCkCsN1SpqN5sv9UGLJj1jERf8JAdrn4VIkHYU1M+KK6RHgkMjMG+Yz6ViWTzep rNvY2JosVmo+auyHzeYXKlpqjTFf8zfMFizgQ= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=message-id:date:from:user-agent:mime-version:to:subject:references :in-reply-to:content-type; b=nVrxlgzFhIqy81ohnDbp0v4pEgVHxea93PkDLJpvTxvHwDY1HZqbYh4pT31lU9VC41 xDqFkdJb6Xx0lig6jgbK6GwPR58MaV6MdoeEoDIS/XIf2Qw9ZiKYI/A027CPO3LUkMWE wlw3aW3NrEr8+e2E6xvTtO68/Um/wYIdSvpF4= Received: by 10.223.108.15 with SMTP id d15mr1017661fap.62.1237382800639; Wed, 18 Mar 2009 06:26:40 -0700 (PDT) Received: from ?82.130.79.102? (ifw-public-dock-102-dhcp.ethz.ch [82.130.79.102]) by mx.google.com with ESMTPS id f31sm199222fkf.35.2009.03.18.06.26.39 (version=SSLv3 cipher=RC4-MD5); Wed, 18 Mar 2009 06:26:39 -0700 (PDT) Message-ID: <49C0F690.7060305@gmail.com> Date: Wed, 18 Mar 2009 14:26:40 +0100 From: phcoder User-Agent: Thunderbird 2.0.0.19 (X11/20090105) MIME-Version: 1.0 To: The development of GRUB 2 References: <49B82B65.3080506@gmail.com> <20090313191442.GC17068@thorin> <49BAC506.2030006@gmail.com> <20090313.134505.185970759.davem@davemloft.net> <49BAC797.9010200@gmail.com> <20090318101227.GB20072@thorin> In-Reply-To: <20090318101227.GB20072@thorin> Content-Type: multipart/mixed; boundary="------------040303040005000707010601" X-detected-operating-system: by monty-python.gnu.org: GNU/Linux 2.6 (newer, 2) Subject: Re: ELF bugfixes X-BeenThere: grub-devel@gnu.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: The development of GRUB 2 List-Id: The development of GRUB 2 List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 18 Mar 2009 13:26:48 -0000 This is a multi-part message in MIME format. --------------040303040005000707010601 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Robert Millan wrote: > On Fri, Mar 13, 2009 at 09:52:39PM +0100, phcoder wrote: >> - grub_multiboot_payload_entry_offset = ehdr->e_entry - phdr(lowest_segment)->p_vaddr; >> + for (i = 0; i < ehdr->e_phnum; i++) >> + if (phdr(i)->p_vaddr <= ehdr->e_entry >> + && phdr(i)->p_vaddr + phdr(i)->p_memsz > ehdr->e_entry) >> + grub_multiboot_payload_entry_offset = (ehdr->e_entry - phdr(i)->p_vaddr) >> + + (phdr(i)->p_paddr - phdr(lowest_segment)->p_paddr); > > You need to handle the case in which grub_multiboot_payload_entry_offset is left > uninitialized (it needs to be initialized each time the multiboot command is > run, not just when the module is loaded). > module? actually it's when loading image. Perhaps you mean that additional error check is necessary -- Regards Vladimir 'phcoder' Serbinenko --------------040303040005000707010601 Content-Type: text/x-diff; name="elf.diff" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="elf.diff" diff --git a/loader/i386/multiboot_elfxx.c b/loader/i386/multiboot_elfxx.c index 801800c..706d44d 100644 --- a/loader/i386/multiboot_elfxx.c +++ b/loader/i386/multiboot_elfxx.c @@ -49,7 +49,7 @@ CONCAT(grub_multiboot_load_elf, XX) (grub_file_t file, void *buffer) { Elf_Ehdr *ehdr = (Elf_Ehdr *) buffer; char *phdr_base; - int lowest_segment = 0, highest_segment = 0; + int lowest_segment = -1, highest_segment = -1; int i; if (ehdr->e_ident[EI_CLASS] != ELFCLASSXX) @@ -83,11 +83,18 @@ CONCAT(grub_multiboot_load_elf, XX) (grub_file_t file, void *buffer) for (i = 0; i < ehdr->e_phnum; i++) if (phdr(i)->p_type == PT_LOAD && phdr(i)->p_filesz != 0) { - if (phdr(i)->p_paddr < phdr(lowest_segment)->p_paddr) + /* Beware that segment 0 isn't necessarily loadable */ + if (lowest_segment == -1 + || phdr(i)->p_paddr < phdr(lowest_segment)->p_paddr) lowest_segment = i; - if (phdr(i)->p_paddr > phdr(highest_segment)->p_paddr) + if (highest_segment == -1 + || phdr(i)->p_paddr > phdr(highest_segment)->p_paddr) highest_segment = i; } + + if (lowest_segment == -1) + return grub_error (GRUB_ERR_BAD_OS, "ELF contains no loadable segments"); + code_size = (phdr(highest_segment)->p_paddr + phdr(highest_segment)->p_memsz) - phdr(lowest_segment)->p_paddr; grub_multiboot_payload_dest = phdr(lowest_segment)->p_paddr; @@ -105,8 +112,8 @@ CONCAT(grub_multiboot_load_elf, XX) (grub_file_t file, void *buffer) { char *load_this_module_at = (char *) (grub_multiboot_payload_orig + (long) (phdr(i)->p_paddr - phdr(lowest_segment)->p_paddr)); - grub_dprintf ("multiboot_loader", "segment %d: paddr=0x%lx, memsz=0x%lx\n", - i, (long) phdr(i)->p_paddr, (long) phdr(i)->p_memsz); + grub_dprintf ("multiboot_loader", "segment %d: paddr=0x%lx, memsz=0x%lx, vaddr=0x%lx\n", + i, (long) phdr(i)->p_paddr, (long) phdr(i)->p_memsz, (long) phdr(i)->p_vaddr); if (grub_file_seek (file, (grub_off_t) phdr(i)->p_offset) == (grub_off_t) -1) @@ -124,11 +131,18 @@ CONCAT(grub_multiboot_load_elf, XX) (grub_file_t file, void *buffer) } } - grub_multiboot_payload_entry_offset = ehdr->e_entry - phdr(lowest_segment)->p_vaddr; + for (i = 0; i < ehdr->e_phnum; i++) + if (phdr(i)->p_vaddr <= ehdr->e_entry + && phdr(i)->p_vaddr + phdr(i)->p_memsz > ehdr->e_entry) + { + grub_multiboot_payload_entry_offset = (ehdr->e_entry - phdr(i)->p_vaddr) + + (phdr(i)->p_paddr - phdr(lowest_segment)->p_paddr); + return grub_errno; + } #undef phdr - return grub_errno; + return grub_error (GRUB_ERR_BAD_OS, "entry point isn't in a segment"); } #undef XX --------------040303040005000707010601--