git: d8e841a9aa1f - main - libc: treat execvpe as a week symbol

From: Ed Maste <emaste_at_FreeBSD.org>
Date: Tue, 22 Apr 2025 18:12:44 UTC
The branch main has been updated by emaste:

URL: https://cgit.FreeBSD.org/src/commit/?id=d8e841a9aa1f8c4ce50d98b01f1ba1376cdd9705

commit d8e841a9aa1f8c4ce50d98b01f1ba1376cdd9705
Author:     SHENGYI HONG <aokblast@FreeBSD.org>
AuthorDate: 2025-04-02 20:35:13 +0000
Commit:     Ed Maste <emaste@FreeBSD.org>
CommitDate: 2025-04-22 18:12:26 +0000

    libc: treat execvpe as a week symbol
    
    Some program intercepts the execvpe call in runtime. At the same time, the
    implementation of posix_spwan use execvpe. If execvpe is intercepted and
    then calls posix_spawn when intercepted. It wil create a infinite loop
    because the intercepted execvpe will spawn a posix_spwan call and will be
    intercepted again.
    
    See https://github.com/rizsotto/Bear/issues/557 for reference.
    
    Reviewed by:    brooks, kib, emaste
    Sponsored by:   FreeBSD Foundation
    Differential Revision: https://reviews.freebsd.org/D49733
---
 lib/libc/gen/exec.c             | 6 ++++--
 lib/libc/gen/posix_spawn.c      | 2 +-
 lib/libc/include/libc_private.h | 1 +
 3 files changed, 6 insertions(+), 3 deletions(-)

diff --git a/lib/libc/gen/exec.c b/lib/libc/gen/exec.c
index d9285733e965..926c50d64852 100644
--- a/lib/libc/gen/exec.c
+++ b/lib/libc/gen/exec.c
@@ -136,7 +136,7 @@ execv(const char *name, char * const *argv)
 int
 execvp(const char *name, char * const *argv)
 {
-	return (execvpe(name, argv, environ));
+	return (__libc_execvpe(name, argv, environ));
 }
 
 static int
@@ -288,7 +288,7 @@ execvP(const char *name, const char *path, char * const argv[])
 }
 
 int
-execvpe(const char *name, char * const argv[], char * const envp[])
+__libc_execvpe(const char *name, char * const argv[], char * const envp[])
 {
 	const char *path;
 
@@ -298,3 +298,5 @@ execvpe(const char *name, char * const argv[], char * const envp[])
 
 	return (execvPe(name, path, argv, envp));
 }
+
+__weak_reference(__libc_execvpe, execvpe);
diff --git a/lib/libc/gen/posix_spawn.c b/lib/libc/gen/posix_spawn.c
index ee2ce05ff317..a5b732696b8c 100644
--- a/lib/libc/gen/posix_spawn.c
+++ b/lib/libc/gen/posix_spawn.c
@@ -261,7 +261,7 @@ _posix_spawn_thr(void *data)
 	}
 	envp = psa->envp != NULL ? psa->envp : environ;
 	if (psa->use_env_path)
-		execvpe(psa->path, psa->argv, envp);
+		__libc_execvpe(psa->path, psa->argv, envp);
 	else
 		_execve(psa->path, psa->argv, envp);
 	psa->error = errno;
diff --git a/lib/libc/include/libc_private.h b/lib/libc/include/libc_private.h
index 4c244f962b2b..41b44456b6ee 100644
--- a/lib/libc/include/libc_private.h
+++ b/lib/libc/include/libc_private.h
@@ -345,6 +345,7 @@ struct __ucontext;
 struct __wrusage;
 enum idtype;
 
+int		__libc_execvpe(const char *, char * const *, char * const *);
 int		__libc_sigaction(int, const struct sigaction *,
 		    struct sigaction *) __hidden;
 int		__libc_sigprocmask(int, const __sigset_t *, __sigset_t *)