diff options
author | Joe Simmons-Talbott <josimmon@redhat.com> | 2023-06-13 10:05:03 -0400 |
---|---|---|
committer | Adhemerval Zanella <adhemerval.zanella@linaro.org> | 2023-06-26 10:17:47 -0300 |
commit | 9a17a193b4ea5730aed0b9e532ae741418dd10d3 (patch) | |
tree | ac73d2cd98e20e36558eeb192546d28eb81bceb3 | |
parent | 48170127d984f41cd59dfc1b9ee40f729d953bf9 (diff) | |
download | glibc-9a17a193b4ea5730aed0b9e532ae741418dd10d3.tar.gz glibc-9a17a193b4ea5730aed0b9e532ae741418dd10d3.tar.xz glibc-9a17a193b4ea5730aed0b9e532ae741418dd10d3.zip |
check_native: Get rid of alloca
Use malloc rather than alloca to avoid potential stack overflow. Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
-rw-r--r-- | sysdeps/unix/sysv/linux/check_native.c | 35 |
1 files changed, 11 insertions, 24 deletions
diff --git a/sysdeps/unix/sysv/linux/check_native.c b/sysdeps/unix/sysv/linux/check_native.c index 34876ca624..c4aaf4af19 100644 --- a/sysdeps/unix/sysv/linux/check_native.c +++ b/sysdeps/unix/sysv/linux/check_native.c @@ -48,11 +48,20 @@ __check_native (uint32_t a1_index, int *a1_native, nladdr.nl_family = AF_NETLINK; socklen_t addr_len = sizeof (nladdr); - bool use_malloc = false; if (fd < 0) return; + /* Netlink requires that user buffer needs to be either 8kb or page size + (whichever is bigger), however this has been changed over time and now + 8Kb is sufficient (check NLMSG_DEFAULT_SIZE on Linux + linux/include/linux/netlink.h). */ + const size_t buf_size = 8192; + char *buf = malloc (buf_size); + + if (buf == NULL) + goto out; + if (__bind (fd, (struct sockaddr *) &nladdr, sizeof (nladdr)) != 0 || __getsockname (fd, (struct sockaddr *) &nladdr, &addr_len) != 0) goto out; @@ -81,26 +90,6 @@ __check_native (uint32_t a1_index, int *a1_native, memset (&nladdr, '\0', sizeof (nladdr)); nladdr.nl_family = AF_NETLINK; -#ifdef PAGE_SIZE - /* Help the compiler optimize out the malloc call if PAGE_SIZE - is constant and smaller or equal to PTHREAD_STACK_MIN/4. */ - const size_t buf_size = PAGE_SIZE; -#else - const size_t buf_size = __getpagesize (); -#endif - char *buf; - - if (__libc_use_alloca (buf_size)) - buf = alloca (buf_size); - else - { - buf = malloc (buf_size); - if (buf != NULL) - use_malloc = true; - else - goto out; - } - struct iovec iov = { buf, buf_size }; if (TEMP_FAILURE_RETRY (__sendto (fd, (void *) &req, sizeof (req), 0, @@ -170,7 +159,5 @@ __check_native (uint32_t a1_index, int *a1_native, out: __close_nocancel_nostatus (fd); - - if (use_malloc) - free (buf); + free (buf); } |