about summary refs log tree commit diff
path: root/sysdeps/i386/i686
diff options
context:
space:
mode:
authorWilco Dijkstra <wilco.dijkstra@arm.com>2022-06-10 17:13:29 +0100
committerWilco Dijkstra <wdijkstr@arm.com>2022-06-10 17:13:29 +0100
commitfdaf78656fb6cc7caeb7b4e37068e8a8bf4dc639 (patch)
tree05302f7351e2b505af1d50d165bbbe371123d15d /sysdeps/i386/i686
parentf107b7b30d815f191181617e2c14f21e6af4ddcf (diff)
downloadglibc-fdaf78656fb6cc7caeb7b4e37068e8a8bf4dc639.tar.gz
glibc-fdaf78656fb6cc7caeb7b4e37068e8a8bf4dc639.tar.xz
glibc-fdaf78656fb6cc7caeb7b4e37068e8a8bf4dc639.zip
Add bounds check to __libc_ifunc_impl_list
Add a proper bounds check to __libc_ifunc_impl_list. This makes MAX_IFUNC
redundant and fixes several targets that will write outside the array.
To avoid unnecessary large diffs, pass the maximum in the argument 'i' to
IFUNC_IMPL_ADD - 'max' can be used in new ifunc definitions and existing
ones can be updated if desired.

Passes buildmanyglibc.

Reviewed-by: Adhemerval Zanella  <adhemerval.zanella@linaro.org>
Diffstat (limited to 'sysdeps/i386/i686')
-rw-r--r--sysdeps/i386/i686/multiarch/ifunc-impl-list.c9
1 files changed, 2 insertions, 7 deletions
diff --git a/sysdeps/i386/i686/multiarch/ifunc-impl-list.c b/sysdeps/i386/i686/multiarch/ifunc-impl-list.c
index c014f52bf9..9237b589f5 100644
--- a/sysdeps/i386/i686/multiarch/ifunc-impl-list.c
+++ b/sysdeps/i386/i686/multiarch/ifunc-impl-list.c
@@ -22,9 +22,6 @@
 #include <ifunc-impl-list.h>
 #include "init-arch.h"
 
-/* Maximum number of IFUNC implementations.  */
-#define MAX_IFUNC	4
-
 /* Fill ARRAY of MAX elements with IFUNC implementations for function
    NAME and return the number of valid entries.  */
 
@@ -32,9 +29,7 @@ size_t
 __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array,
 			size_t max)
 {
-  assert (max >= MAX_IFUNC);
-
-  size_t i = 0;
+  size_t i = max;
 
   /* Support sysdeps/i386/i686/multiarch/memchr.S.  */
   IFUNC_IMPL (i, name, memchr,
@@ -358,5 +353,5 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array,
 	      IFUNC_IMPL_ADD (array, i, strncmp, 1, __strncmp_ia32))
 #endif
 
-  return i;
+  return 0;
 }