aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSzabolcs Nagy <szabolcs.nagy@arm.com>2017-07-17 09:58:29 +0100
committerSzabolcs Nagy <szabolcs.nagy@arm.com>2017-07-18 10:34:20 +0100
commit00d7a3777369bac3d8d44152dde2bb7381984ef6 (patch)
tree40f88f33767e3ca382f3aa5800de8cd7bc155fb5
parent91ac3a7d8474480685632cd25f844d3154c69fdf (diff)
downloadglibc-00d7a3777369bac3d8d44152dde2bb7381984ef6.tar
glibc-00d7a3777369bac3d8d44152dde2bb7381984ef6.tar.gz
glibc-00d7a3777369bac3d8d44152dde2bb7381984ef6.tar.bz2
glibc-00d7a3777369bac3d8d44152dde2bb7381984ef6.zip
[AArch64] Fix out of bound array access regression
Partially revert ea01a4da219011f4a4db97eef3c5bfc2f6e8fc6b "aarch64: Add hwcap string routines" because _dl_procinfo cannot be future proof and avoid oob access in _dl_hwcap_string.
-rw-r--r--ChangeLog5
-rw-r--r--sysdeps/unix/sysv/linux/aarch64/dl-procinfo.h38
2 files changed, 13 insertions, 30 deletions
diff --git a/ChangeLog b/ChangeLog
index baf85432cb..5944df03fc 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2017-07-18 Szabolcs Nagy <szabolcs.nagy@arm.com>
+
+ * sysdeps/unix/sysv/linux/aarch64/dl-procinfo.h (_dl_procinfo): Revert.
+ (_dl_hwcap_string): Check range.
+
2017-07-17 Tulio Magno Quites Machado Filho <tuliom@linux.vnet.ibm.com>
[BZ #21707]
diff --git a/sysdeps/unix/sysv/linux/aarch64/dl-procinfo.h b/sysdeps/unix/sysv/linux/aarch64/dl-procinfo.h
index 04fc6be0a3..44dc296d3e 100644
--- a/sysdeps/unix/sysv/linux/aarch64/dl-procinfo.h
+++ b/sysdeps/unix/sysv/linux/aarch64/dl-procinfo.h
@@ -25,36 +25,7 @@
#include <sysdep.h>
/* We cannot provide a general printing function. */
-static inline int
-__attribute__ ((unused))
-_dl_procinfo (unsigned int type, unsigned long int word)
-{
- /* This table should match the information from arch/arm64/kernel/cpuinfo.c
- in the kernel sources. */
- int i;
-
- /* Fallback to unknown output mechanism. */
- if (type == AT_HWCAP2)
- return -1;
-
- _dl_printf ("AT_HWCAP: ");
-
- for (i = 0; i < 32; ++i)
- if ((word >> i) & 1)
- _dl_printf (" %s", GLRO(dl_aarch64_cap_flags)[i]);
-
- _dl_printf ("\n");
-
- return 0;
-}
-
-static inline const char *
-__attribute__ ((unused))
-_dl_hwcap_string (int idx)
-{
- return GLRO(dl_aarch64_cap_flags)[idx];
-};
-
+#define _dl_procinfo(type, word) -1
/* Number of HWCAP bits set. */
#define _DL_HWCAP_COUNT 13
@@ -66,6 +37,13 @@ _dl_hwcap_string (int idx)
library search. */
#define HWCAP_IMPORTANT HWCAP_CPUID
+static inline const char *
+__attribute__ ((unused))
+_dl_hwcap_string (int idx)
+{
+ return (unsigned)idx < _DL_HWCAP_COUNT ? GLRO(dl_aarch64_cap_flags)[idx] : "";
+};
+
static inline int
__attribute__ ((unused))
_dl_string_hwcap (const char *str)