Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/external/bsd/libelf/dist Fix a problem with the handling of ...



details:   https://anonhg.NetBSD.org/src/rev/59b4663514a2
branches:  trunk
changeset: 751227:59b4663514a2
user:      darran <darran%NetBSD.org@localhost>
date:      Thu Jan 28 21:38:29 2010 +0000

description:
Fix a problem with the handling of NOBITS sections (i.e. bss), where the
elf_getdata() function would return an invalid section error if the size
of the section was bigger than the raw size of the elf binary.
This is basically a sync with changeset 10 of the sourceforge repository
for this library (elftoolchain).

diffstat:

 external/bsd/libelf/dist/elf_data.c    |  29 ++++++++++++++++++-----------
 external/bsd/libelf/dist/elf_getdata.3 |  32 +++++++++++++++++++++++++++++---
 2 files changed, 47 insertions(+), 14 deletions(-)

diffs (146 lines):

diff -r a06dcbeb47d5 -r 59b4663514a2 external/bsd/libelf/dist/elf_data.c
--- a/external/bsd/libelf/dist/elf_data.c       Thu Jan 28 21:13:49 2010 +0000
+++ b/external/bsd/libelf/dist/elf_data.c       Thu Jan 28 21:38:29 2010 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: elf_data.c,v 1.3 2009/12/29 17:05:58 thorpej Exp $     */
+/*     $NetBSD: elf_data.c,v 1.4 2010/01/28 21:38:29 darran Exp $      */
 
 /*-
  * Copyright (c) 2006 Joseph Koshy
@@ -41,7 +41,6 @@
 elf_getdata(Elf_Scn *s, Elf_Data *d)
 {
        Elf *e;
-       char *dst;
        size_t fsz, msz, count;
        int elfclass, elftype;
        unsigned int sh_type;
@@ -82,8 +81,8 @@
        }
 
        if ((elftype = _libelf_xlate_shtype(sh_type)) < ELF_T_FIRST ||
-           elftype > ELF_T_LAST ||
-           sh_offset + sh_size > (uint64_t) e->e_rawsize) {
+           elftype > ELF_T_LAST || (sh_type != SHT_NOBITS &&
+           sh_offset + sh_size > (uint64_t) e->e_rawsize)) {
                LIBELF_SET_ERROR(SECTION, 0);
                return (NULL);
        }
@@ -106,22 +105,27 @@
 
        assert(msz > 0);
 
-       if ((dst = malloc(msz*count)) == NULL) {
-               LIBELF_SET_ERROR(RESOURCE, 0);
-               return (NULL);
-       }
-
        if ((d = _libelf_allocate_data(s)) == NULL)
                return (NULL);
 
-       d->d_buf     = dst;
+       d->d_buf     = NULL;
        d->d_off     = 0;
        d->d_align   = sh_align;
        d->d_size    = msz * count;
        d->d_type    = elftype;
        d->d_version = e->e_version;
 
+       if (sh_type == SHT_NOBITS)
+               return (d);
+
        d->d_flags  |= LIBELF_F_MALLOCED;
+
+       if ((d->d_buf = malloc(msz*count)) == NULL) {
+               (void) _libelf_release_data(d);
+               LIBELF_SET_ERROR(RESOURCE, 0);
+               return (NULL);
+       }
+
        STAILQ_INSERT_TAIL(&s->s_data, d, d_next);
 
        xlate = _libelf_get_translator(elftype, ELF_TOMEMORY, elfclass);
@@ -181,6 +185,7 @@
 elf_rawdata(Elf_Scn *s, Elf_Data *d)
 {
        Elf *e;
+       uint32_t sh_type;
        int elf_class;
        uint64_t sh_align, sh_offset, sh_size;
 
@@ -201,10 +206,12 @@
        assert(elf_class == ELFCLASS32 || elf_class == ELFCLASS64);
 
        if (elf_class == ELFCLASS32) {
+               sh_type   = s->s_shdr.s_shdr32.sh_type;
                sh_offset = (uint64_t) s->s_shdr.s_shdr32.sh_offset;
                sh_size   = (uint64_t) s->s_shdr.s_shdr32.sh_size;
                sh_align  = (uint64_t) s->s_shdr.s_shdr32.sh_addralign;
        } else {
+               sh_type   = s->s_shdr.s_shdr64.sh_type;
                sh_offset = s->s_shdr.s_shdr64.sh_offset;
                sh_size   = s->s_shdr.s_shdr64.sh_size;
                sh_align  = s->s_shdr.s_shdr64.sh_addralign;
@@ -213,7 +220,7 @@
        if ((d = _libelf_allocate_data(s)) == NULL)
                return (NULL);
 
-       d->d_buf     = e->e_rawfile + sh_offset;
+       d->d_buf     = sh_type == SHT_NOBITS ? NULL : e->e_rawfile + sh_offset;
        d->d_off     = 0;
        d->d_align   = sh_align;
        d->d_size    = sh_size;
diff -r a06dcbeb47d5 -r 59b4663514a2 external/bsd/libelf/dist/elf_getdata.3
--- a/external/bsd/libelf/dist/elf_getdata.3    Thu Jan 28 21:13:49 2010 +0000
+++ b/external/bsd/libelf/dist/elf_getdata.3    Thu Jan 28 21:38:29 2010 +0000
@@ -1,6 +1,6 @@
-.\"    $NetBSD: elf_getdata.3,v 1.1.1.1 2009/12/19 05:43:39 thorpej Exp $
+.\"    $NetBSD: elf_getdata.3,v 1.2 2010/01/28 21:38:29 darran Exp $
 .\"
-.\" Copyright (c) 2006 Joseph Koshy.  All rights reserved.
+.\" Copyright (c) 2006,2008 Joseph Koshy.  All rights reserved.
 .\"
 .\" Redistribution and use in source and binary forms, with or without
 .\" modification, are permitted provided that the following conditions
@@ -25,7 +25,7 @@
 .\"
 .\" $FreeBSD: src/lib/libelf/elf_getdata.3,v 1.2.10.1.2.1 2009/10/25 01:10:29 kensmith Exp $
 .\"
-.Dd August 26, 2006
+.Dd April 7, 2008
 .Os
 .Dt ELF_GETDATA 3
 .Sh NAME
@@ -144,6 +144,32 @@
 .Vt Elf_Data
 structures of type
 .Dv ELF_T_BYTE .
+.Ss Special handling of SHT_NOBITS sections
+For sections of type
+.Dv SHT_NOBITS ,
+the functions
+.Fn elf_getdata
+and
+.Fn elf_rawdata
+return a pointer to a valid
+.Vt Elf_Data
+structure that has its
+.Va d_buf
+member set to NULL and its
+.Va d_size
+member set to the size of the section.
+.Pp
+If an application wishes to create a section of type
+.Dv SHT_NOBITS ,
+it should add a data buffer to the section using function
+.Fn elf_newdata .
+It should then set the
+.Va d_buf
+and
+.Va d_size
+members of the returned
+.Vt Elf_Data
+structure to NULL and the desired size of the section respectively.
 .Sh RETURN VALUES
 These functions return a valid pointer to a data descriptor if successful, or
 NULL if an error occurs.



Home | Main Index | Thread Index | Old Index