From: Mark Wielaard Date: Wed, 3 Jun 2015 16:50:40 +0000 (+0200) Subject: libelf: Make sure conversion functions work on aligned data for type. X-Git-Tag: elfutils-0.162~9 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=9a9f7f6667ae156c8fb8e1290d855d8b8e893461;p=thirdparty%2Felfutils.git libelf: Make sure conversion functions work on aligned data for type. The gelf_xlate conversion functions work on properly aligned ELF data types. If elf_get data needs to do conversion and ! ALLOW_UNALIGNED and the rawdata_base isn't aligned properly for the section type, then provide an aligned copy of the data. Found with --enable-sanitize-undefined in run-test-archive64.sh on x86_64. Signed-off-by: Mark Wielaard --- diff --git a/libelf/ChangeLog b/libelf/ChangeLog index 772eb52d6..25f673db3 100644 --- a/libelf/ChangeLog +++ b/libelf/ChangeLog @@ -1,3 +1,8 @@ +2015-06-02 Mark Wielaard + + * elf_getdata.c (convert_data): Make sure source data is properly + aligned for type before calling actual conversion function. + 2015-06-04 Mark Wielaard * elf_begin.c (get_shnum): Check alignment of Shdr, not Ehdr before diff --git a/libelf/elf_getdata.c b/libelf/elf_getdata.c index 8567da1e8..1a4981efb 100644 --- a/libelf/elf_getdata.c +++ b/libelf/elf_getdata.c @@ -1,5 +1,5 @@ /* Return the next data element from the section after possibly converting it. - Copyright (C) 1998-2005, 2006, 2007 Red Hat, Inc. + Copyright (C) 1998-2005, 2006, 2007, 2015 Red Hat, Inc. This file is part of elfutils. Written by Ulrich Drepper , 1998. @@ -144,6 +144,25 @@ convert_data (Elf_Scn *scn, int version __attribute__ ((unused)), int eclass, return; } + /* Make sure the source is correctly aligned for the conversion + function to directly access the data elements. */ + char *rawdata_source; + if (ALLOW_UNALIGNED || + ((((size_t) (char *) scn->rawdata_base)) & (align - 1)) == 0) + rawdata_source = scn->rawdata_base; + else + { + rawdata_source = (char *) malloc (size); + if (rawdata_source == NULL) + { + __libelf_seterrno (ELF_E_NOMEM); + return; + } + + /* The copy will be appropriately aligned for direct access. */ + memcpy (rawdata_source, scn->rawdata_base, size); + } + /* Get the conversion function. */ #if EV_NUM != 2 fp = __elf_xfctstom[version - 1][__libelf_version - 1][eclass - 1][type]; @@ -151,7 +170,10 @@ convert_data (Elf_Scn *scn, int version __attribute__ ((unused)), int eclass, fp = __elf_xfctstom[0][0][eclass - 1][type]; #endif - fp (scn->data_base, scn->rawdata_base, size, 0); + fp (scn->data_base, rawdata_source, size, 0); + + if (rawdata_source != scn->rawdata_base) + free (rawdata_source); } scn->data_list.data.d.d_buf = scn->data_base;