[committed,AArch64] Fix out of bound array access regression

Message ID 596DD6D3.9010401@arm.com
State Committed
Headers

Commit Message

Szabolcs Nagy July 18, 2017, 9:37 a.m. UTC
  Partially revert ea01a4da219011f4a4db97eef3c5bfc2f6e8fc6b
"aarch64: Add hwcap string routines" because _dl_procinfo cannot
be future proof and avoid oob access in _dl_hwcap_string.

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.
  

Patch

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)