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;
}
}