about summary refs log tree commit diff
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.gz
glibc-00d7a3777369bac3d8d44152dde2bb7381984ef6.tar.xz
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)