Module Name: src Committed By: christos Date: Thu Feb 27 02:05:03 UTC 2025
Modified Files: src/lib/libc/arch/arm/misc: arm_initfini.c Log Message: PR/59063: Martin Husemann: Avoid using malloc through sysctlbyname by doing the sysctl name to mib translation directly. Thanks martin@ for testing! To generate a diff of this commit: cvs rdiff -u -r1.7 -r1.8 src/lib/libc/arch/arm/misc/arm_initfini.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/lib/libc/arch/arm/misc/arm_initfini.c diff -u src/lib/libc/arch/arm/misc/arm_initfini.c:1.7 src/lib/libc/arch/arm/misc/arm_initfini.c:1.8 --- src/lib/libc/arch/arm/misc/arm_initfini.c:1.7 Sun Sep 8 09:15:53 2013 +++ src/lib/libc/arch/arm/misc/arm_initfini.c Wed Feb 26 21:05:03 2025 @@ -29,7 +29,7 @@ #include <sys/cdefs.h> -__RCSID("$NetBSD: arm_initfini.c,v 1.7 2013/09/08 13:15:53 matt Exp $"); +__RCSID("$NetBSD: arm_initfini.c,v 1.8 2025/02/27 02:05:03 christos Exp $"); #include "namespace.h" @@ -44,12 +44,17 @@ __RCSID("$NetBSD: arm_initfini.c,v 1.7 2 #include <sys/sysctl.h> #include <stdbool.h> +#include <string.h> #include <stddef.h> __dso_hidden int _libc_arm_fpu_present; #ifndef __ARM_ARCH_EXT_IDIV__ __dso_hidden int _libc_arm_hwdiv_present; +# define NENTRIES 2 +#else +# define NENTRIES 1 #endif + static bool _libc_aapcs_initialized; void _libc_aapcs_init(void) __attribute__((__constructor__, __used__)); @@ -57,14 +62,39 @@ void _libc_aapcs_init(void) __attribute_ void __section(".text.startup") _libc_aapcs_init(void) { - if (!_libc_aapcs_initialized) { - size_t len = sizeof(_libc_arm_fpu_present); - _libc_aapcs_initialized = true; - (void)sysctlbyname("machdep.fpu_present", - &_libc_arm_fpu_present, &len, NULL, 0); + if (_libc_aapcs_initialized) + return; + + struct sysctlnode query, md[64]; + int mib[2]; + size_t len, mlen = sizeof(_libc_arm_fpu_present), nentries = 0; + + _libc_aapcs_initialized = true; + mib[0] = CTL_MACHDEP; + mib[1] = CTL_QUERY; + memset(&query, 0, sizeof(query)); + query.sysctl_flags = SYSCTL_VERSION; + len = sizeof(md); + if (sysctl(mib, 2, md, &len, &query, sizeof(query)) == -1) + return; + + for (size_t i = 0; i < len / sizeof(md[0]); i++) { + if (strcmp(md[i].sysctl_name, "fpu_present") == 0) { + mib[1] = md[i].sysctl_num; + (void)sysctl(mib, 2, &_libc_arm_fpu_present, &mlen, + NULL, 0); + nentries++; + + } #ifndef __ARM_ARCH_EXT_IDIV__ - (void)sysctlbyname("machdep.hwdiv_present", - &_libc_arm_hwdiv_present, &len, NULL, 0); + else if (strcmp(md[i].sysctl_name, "hwdiv_present") == 0) { + mib[1] = md[i].sysctl_num; + (void)sysctl(mib, 2, &_libc_arm_hwdiv_present, &mlen, + NULL, 0); + nentries++; + } #endif + if (nentries >= NENTRIES) + return; } }