Signed-off-by: Akihiko Odaki <akihiko.odaki...@stu.hosei.ac.jp> --- configure.ac | 3 +++ lib/fixedsizehash.h | 6 ++++++ lib/system.h | 9 +++++++++ libelf/elf_getarsym.c | 8 ++++++++ libelf/elf_strptr.c | 30 ++++++++++++++++++++++-------- libelf/libelfP.h | 4 ++++ 6 files changed, 52 insertions(+), 8 deletions(-)
diff --git a/configure.ac b/configure.ac index e5503f1..feb2ed5 100644 --- a/configure.ac +++ b/configure.ac @@ -245,6 +245,9 @@ zip_LIBS="$LIBS" LIBS="$save_LIBS" AC_SUBST([zip_LIBS]) +AC_CHECK_DECLS([memrchr rawmemchr]) +AC_CHECK_DECLS(powerof2, , , [#include <sys/param.h>]) + AC_CHECK_LIB([stdc++], [__cxa_demangle], [dnl AC_DEFINE([USE_DEMANGLE], [1], [Defined if demangling is enabled])]) AM_CONDITIONAL(DEMANGLE, test "x$ac_cv_lib_stdcpp___cxa_demangle" = "xyes") diff --git a/lib/fixedsizehash.h b/lib/fixedsizehash.h index 06ce6a2..762ebaa 100644 --- a/lib/fixedsizehash.h +++ b/lib/fixedsizehash.h @@ -35,7 +35,13 @@ #include <system.h> +#ifdef __CONCAT #define CONCAT(t1,t2) __CONCAT (t1,t2) +#else +#define STROF(t2) t2 +#define CONCAT_EXPANDED(t1,t2) t1 ## t2 +#define CONCAT(t1,t2) CONCAT_EXPANDED(t1,t2) +#endif /* Before including this file the following macros must be defined: diff --git a/lib/system.h b/lib/system.h index f31cfd0..72005d4 100644 --- a/lib/system.h +++ b/lib/system.h @@ -30,6 +30,7 @@ #define LIB_SYSTEM_H 1 #include <argp.h> +#include <errno.h> #include <stddef.h> #include <stdint.h> #include <endian.h> @@ -68,6 +69,14 @@ extern int crc32_file (int fd, uint32_t *resp); #define gettext_noop(Str) Str +#ifndef TEMP_FAILURE_RETRY +#define TEMP_FAILURE_RETRY(expression) \ + ({ ssize_t __res; \ + do \ + __res = expression; \ + while (__res == -1 && errno == EINTR); \ + __res; }); +#endif static inline ssize_t __attribute__ ((unused)) pwrite_retry (int fd, const void *buf, size_t len, off_t off) diff --git a/libelf/elf_getarsym.c b/libelf/elf_getarsym.c index 65c67cc..d5f0ba4 100644 --- a/libelf/elf_getarsym.c +++ b/libelf/elf_getarsym.c @@ -297,7 +297,15 @@ elf_getarsym (Elf *elf, size_t *ptr) arsym[cnt].as_off = (*u32)[cnt]; arsym[cnt].as_hash = _dl_elf_hash (str_data); +#if HAVE_DECL_RAWMEMCHR str_data = rawmemchr (str_data, '\0') + 1; +#else + char c; + do { + c = *str_data; + str_data++; + } while (c); +#endif } /* At the end a special entry. */ diff --git a/libelf/elf_strptr.c b/libelf/elf_strptr.c index ea21045..e72a3a3 100644 --- a/libelf/elf_strptr.c +++ b/libelf/elf_strptr.c @@ -32,6 +32,7 @@ #endif #include <libelf.h> +#include <stdbool.h> #include <stddef.h> #include "libelfP.h" @@ -52,6 +53,22 @@ get_zdata (Elf_Scn *strscn) return zdata; } +static bool validate_str (const char *str, size_t from, size_t to) +{ +#if HAVE_DECL_MEMRCHR + return memrchr (&str[from], '\0', to - from) != NULL; +#else + do { + if (to <= from) + return false; + + to--; + } while (str[to]); + + return true; +#endif +} + char * elf_strptr (Elf *elf, size_t idx, size_t offset) { @@ -166,8 +183,7 @@ elf_strptr (Elf *elf, size_t idx, size_t offset) { /* Make sure the string is NUL terminated. Start from the end, which very likely is a NUL char. */ - if (likely (memrchr (&strscn->zdata_base[offset], - '\0', sh_size - offset) != NULL)) + if (likely (validate_str (strscn->zdata_base, offset, sh_size))) result = &strscn->zdata_base[offset]; else __libelf_seterrno (ELF_E_INVALID_INDEX); @@ -185,8 +201,7 @@ elf_strptr (Elf *elf, size_t idx, size_t offset) /* Make sure the string is NUL terminated. Start from the end, which very likely is a NUL char. */ - if (likely (memrchr (&strscn->rawdata_base[offset], - '\0', sh_size - offset) != NULL)) + if (likely (validate_str (strscn->rawdata_base, offset, sh_size))) result = &strscn->rawdata_base[offset]; else __libelf_seterrno (ELF_E_INVALID_INDEX); @@ -203,10 +218,9 @@ elf_strptr (Elf *elf, size_t idx, size_t offset) { /* Make sure the string is NUL terminated. Start from the end, which very likely is a NUL char. */ - if (likely (memrchr ((char *) dl->data.d.d_buf - + (offset - dl->data.d.d_off), '\0', - (dl->data.d.d_size - - (offset - dl->data.d.d_off))) != NULL)) + if (likely (validate_str ((char *) dl->data.d.d_buf, + offset - dl->data.d.d_off, + dl->data.d.d_size))) result = ((char *) dl->data.d.d_buf + (offset - dl->data.d.d_off)); else diff --git a/libelf/libelfP.h b/libelf/libelfP.h index 4459982..88e5c13 100644 --- a/libelf/libelfP.h +++ b/libelf/libelfP.h @@ -46,6 +46,10 @@ /* gettext helper macros. */ #define _(Str) dgettext ("elfutils", Str) +#if !HAVE_DECL_POWEROF2 +#define powerof2(x) (((x) & ((x) - 1)) == 0) +#endif + /* Helper Macros to write 32 bit and 64 bit functions. */ #define __elfw2_(Bits, Name) __elf##Bits##_##Name -- 2.10.0 _______________________________________________ elfutils-devel mailing list -- elfutils-devel@lists.fedorahosted.org To unsubscribe send an email to elfutils-devel-le...@lists.fedorahosted.org