Module Name: src
Committed By: christos
Date: Sun Oct 20 19:53:36 UTC 2024
Modified Files:
src/external/gpl3/gcc/dist/libsanitizer/sanitizer_common:
sanitizer_linux.cpp
Log Message:
Can't use __ps_strings because we are called from a constructor and rtld
has not ran the csu code yes to initialize __ps_strings.
To generate a diff of this commit:
cvs rdiff -u -r1.5 -r1.6 \
src/external/gpl3/gcc/dist/libsanitizer/sanitizer_common/sanitizer_linux.cpp
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/external/gpl3/gcc/dist/libsanitizer/sanitizer_common/sanitizer_linux.cpp
diff -u src/external/gpl3/gcc/dist/libsanitizer/sanitizer_common/sanitizer_linux.cpp:1.5 src/external/gpl3/gcc/dist/libsanitizer/sanitizer_common/sanitizer_linux.cpp:1.6
--- src/external/gpl3/gcc/dist/libsanitizer/sanitizer_common/sanitizer_linux.cpp:1.5 Fri Aug 4 03:40:05 2023
+++ src/external/gpl3/gcc/dist/libsanitizer/sanitizer_common/sanitizer_linux.cpp Sun Oct 20 15:53:36 2024
@@ -615,6 +615,41 @@ static void ReadNullSepFileToArray(const
}
#endif
+#if SANITIZER_NETBSD
+static char **
+load_vector(int m)
+{
+ size_t size;
+ int nv;
+ char **v, **ap, *bp, *buf, *endp;
+ int mib[4] = {CTL_KERN, KERN_PROC_ARGS, getpid(), 0};
+ size = sizeof(nv);
+ mib[3] = m == KERN_PROC_ARGV ? KERN_PROC_NARGV : KERN_PROC_NENV;
+ if (internal_sysctl(mib, 4, &nv, &size, NULL, 0) == -1) {
+ Printf("sysctl KERN_PROC_N{ARGV,ENV} failed\n");
+ Die();
+ }
+ v = (char **)MmapOrDie((nv + 1) * sizeof(char *), "Arg vector");
+ buf = (char *)MmapOrDie(ARG_MAX, "Arg space");
+ size = ARG_MAX;
+ mib[3] = m;
+ if (internal_sysctl(mib, 4, buf, &size, NULL, 0) == -1) {
+ Printf("sysctl KERN_PROC_{ARGV,ENV} failed\n");
+ Die();
+ }
+ bp = buf;
+ ap = v;
+ endp = bp + size;
+
+ while (bp < endp) {
+ *ap++ = bp;
+ bp += internal_strlen(bp) + 1;
+ }
+ *ap = NULL;
+ return v;
+}
+#endif
+
static void GetArgsAndEnv(char ***argv, char ***envp) {
#if SANITIZER_FREEBSD
// On FreeBSD, retrieving the argument and environment arrays is done via the
@@ -629,8 +664,8 @@ static void GetArgsAndEnv(char ***argv,
*argv = pss->ps_argvstr;
*envp = pss->ps_envstr;
#elif SANITIZER_NETBSD
- *argv = __ps_strings->ps_argvstr;
- *envp = __ps_strings->ps_envstr;
+ *argv = load_vector(KERN_PROC_ARGV);
+ *envp = load_vector(KERN_PROC_ENV);
#else // SANITIZER_FREEBSD
#if !SANITIZER_GO
if (&__libc_stack_end) {