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