From nobody Mon May 29 09:18:44 2023 X-Original-To: dev-commits-src-main@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4QV91w6X3Sz4XSdq; Mon, 29 May 2023 09:18:44 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4QV91w5nksz4Js6; Mon, 29 May 2023 09:18:44 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1685351924; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=fxvOV89gxAY0IFJvP63Icm2kxhjNIuO0WNAXex608+0=; b=cCFGqgIpzCFDgopY93Cm9mKnB8chLoW6bfqfukbXqIWHTo1sl+6ZZYAxkzbucmuGHBJP5K 3uyiSQKVMFmtOcfM7rQ16GgIBG61NajxXSRCmfbxZK8duuSpHCKdAB/vQSBd8iRbAyX6n+ mc6um8iYtCMkNSlVFuhrox4cQ5KRi0+Xw9ZEcR8ZWE0NZnfsaF93h6xJicOHA63xHD7g5A EUa6Enw1qs6L1ZfClQzM/6i2M1a6hJfvo98chkI3xmxSMdIsObUhnFqUY/nqV4pqsiTjpt QM7lzm19+76kQWpTBra92ctK+fNZFrnn8wcvba/AjL73Pr7lf5PfCRxx1f9PIA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1685351924; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=fxvOV89gxAY0IFJvP63Icm2kxhjNIuO0WNAXex608+0=; b=FFK8BZw/ysM6i+Zf32HrS/VkrbIs7cAiFSIvSzFvrWJhDiznKlxFf8Gjv6Fx1ULe7on1Zc EFC4WpwYzAfD3bOBdoa/I9pBhkGB6lCT0auLvgJiEPw5TtC+DZbA3XC6nWqqoopvGYJ056 WqSNY3uLeOeq5OoV0llEjEu4jKFTNC7mPYpRLFk7krUcRecfEK8mrP9mrUFNPDRfyRzfpB o5WIVFU/3FXz5mMgw2+65CZM1Bz1H+94c+gyz675nF0CIz0rRKs3mLDRslCYkGYKnkwvxb CqXa1nVVtmU6jyInYlVWOu2c2flhNbypPqf1peZfGfoTdLS//9n7N3fJXcs52A== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1685351924; a=rsa-sha256; cv=none; b=B7U8NytgI+fSlINeKyT8rV4E/mXg3zaorY1d5A9/OdeR48/P/Mmzv0usOYT175NHW/YKmP tHz9bcAyT+xTZhZMshiZjOHUUwhsLTPeNMuUf/wuonoGspzVOlN5H9uKOBvxia4GwOc0Se Zpn+9A/udIPuPrlrOEmkK/aKnhd7VsihD1TabAkzTaIK0nkaJWJBS3bzMolCm55eJ/+yv/ a53kd/q2LJNDL6gtiU335YaCOUgvVGuNsSvW6eaTM1fQxkIvm4a/GzO9HK+b5ReKXvnpjT FbFczqK3f469Lc+abOA5tfCdo/lFNn1+l1UDsB3oSuo2s9Z5RvBJvhcBVl0YXg== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4QV91w4rcwz15mN; Mon, 29 May 2023 09:18:44 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 34T9IiAt063371; Mon, 29 May 2023 09:18:44 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 34T9Iisq063370; Mon, 29 May 2023 09:18:44 GMT (envelope-from git) Date: Mon, 29 May 2023 09:18:44 GMT Message-Id: <202305290918.34T9Iisq063370@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Dmitry Chagin Subject: git: 8340b03425cf - main - linux(4): Add a dedicated linux_exec_copyin_args() List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-main@freebsd.org X-BeenThere: dev-commits-src-main@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: dchagin X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 8340b03425cfa61ec17ad6a9b576590df3afd509 Auto-Submitted: auto-generated X-ThisMailContainsUnwantedMimeParts: N The branch main has been updated by dchagin: URL: https://cgit.FreeBSD.org/src/commit/?id=8340b03425cfa61ec17ad6a9b576590df3afd509 commit 8340b03425cfa61ec17ad6a9b576590df3afd509 Author: Dmitry Chagin AuthorDate: 2023-05-29 09:18:16 +0000 Commit: Dmitry Chagin CommitDate: 2023-05-29 09:18:16 +0000 linux(4): Add a dedicated linux_exec_copyin_args() Because Linux allows to exec binaries with 0 argc. Reviewed by: brooks Differential Revision: https://reviews.freebsd.org/D40148 MFC after: 2 month --- sys/amd64/linux/syscalls.master | 4 +- sys/amd64/linux32/linux32_machdep.c | 14 ------ sys/amd64/linux32/syscalls.master | 4 +- sys/arm64/linux/syscalls.master | 4 +- sys/compat/linux/linux_misc.c | 87 +++++++++++++++++++++++++++++++++++-- sys/i386/linux/syscalls.master | 4 +- 6 files changed, 92 insertions(+), 25 deletions(-) diff --git a/sys/amd64/linux/syscalls.master b/sys/amd64/linux/syscalls.master index 420c029fa892..e4ac2ef99edf 100644 --- a/sys/amd64/linux/syscalls.master +++ b/sys/amd64/linux/syscalls.master @@ -439,8 +439,8 @@ 59 AUE_EXECVE STD { int linux_execve( char *path, - char **argp, - char **envp + l_uintptr_t *argp, + l_uintptr_t *envp ); } 60 AUE_EXIT STD { diff --git a/sys/amd64/linux32/linux32_machdep.c b/sys/amd64/linux32/linux32_machdep.c index 4e5d6eb55fc6..bcbf51082c64 100644 --- a/sys/amd64/linux32/linux32_machdep.c +++ b/sys/amd64/linux32/linux32_machdep.c @@ -114,20 +114,6 @@ linux_copyout_rusage(struct rusage *ru, void *uaddr) return (copyout(&lru, uaddr, sizeof(struct l_rusage))); } -int -linux_execve(struct thread *td, struct linux_execve_args *args) -{ - struct image_args eargs; - int error; - - error = freebsd32_exec_copyin_args(&eargs, args->path, UIO_USERSPACE, - args->argp, args->envp); - if (error == 0) - error = linux_common_execve(td, &eargs); - AUDIT_SYSCALL_EXIT(error == EJUSTRETURN ? 0 : error, td); - return (error); -} - CTASSERT(sizeof(struct l_iovec32) == 8); int diff --git a/sys/amd64/linux32/syscalls.master b/sys/amd64/linux32/syscalls.master index 777ffd865b8b..382b681fdde1 100644 --- a/sys/amd64/linux32/syscalls.master +++ b/sys/amd64/linux32/syscalls.master @@ -102,8 +102,8 @@ 11 AUE_EXECVE STD { int linux_execve( char *path, - uint32_t *argp, - uint32_t *envp + l_uintptr_t *argp, + l_uintptr_t *envp ); } 12 AUE_CHDIR STD { diff --git a/sys/arm64/linux/syscalls.master b/sys/arm64/linux/syscalls.master index 2a564f0e3c5d..b9dda787389c 100644 --- a/sys/arm64/linux/syscalls.master +++ b/sys/arm64/linux/syscalls.master @@ -1357,8 +1357,8 @@ 221 AUE_EXECVE STD { int linux_execve( char *path, - char **argp, - char **envp + l_uintptr_t *argp, + l_uintptr_t *envp ); } 222 AUE_MMAP STD { diff --git a/sys/compat/linux/linux_misc.c b/sys/compat/linux/linux_misc.c index b5d48d106be6..583cc25f1c43 100644 --- a/sys/compat/linux/linux_misc.c +++ b/sys/compat/linux/linux_misc.c @@ -2555,7 +2555,89 @@ linux_seccomp(struct thread *td, struct linux_seccomp_args *args) } } -#ifndef COMPAT_LINUX32 +/* + * Custom version of exec_copyin_args(), to copy out argument and environment + * strings from the old process address space into the temporary string buffer. + * Based on freebsd32_exec_copyin_args. + */ +static int +linux_exec_copyin_args(struct image_args *args, const char *fname, + enum uio_seg segflg, l_uintptr_t *argv, l_uintptr_t *envv) +{ + char *argp, *envp; + l_uintptr_t *ptr, arg; + int error; + + bzero(args, sizeof(*args)); + if (argv == NULL) + return (EFAULT); + + /* + * Allocate demand-paged memory for the file name, argument, and + * environment strings. + */ + error = exec_alloc_args(args); + if (error != 0) + return (error); + + /* + * Copy the file name. + */ + error = exec_args_add_fname(args, fname, segflg); + if (error != 0) + goto err_exit; + + /* + * extract arguments first + */ + ptr = argv; + for (;;) { + error = copyin(ptr++, &arg, sizeof(arg)); + if (error) + goto err_exit; + if (arg == 0) + break; + argp = PTRIN(arg); + error = exec_args_add_arg(args, argp, UIO_USERSPACE); + if (error != 0) + goto err_exit; + } + + /* + * This comment is from Linux do_execveat_common: + * When argv is empty, add an empty string ("") as argv[0] to + * ensure confused userspace programs that start processing + * from argv[1] won't end up walking envp. + */ + if (args->argc == 0 && + (error = exec_args_add_arg(args, "", UIO_SYSSPACE) != 0)) + goto err_exit; + + /* + * extract environment strings + */ + if (envv) { + ptr = envv; + for (;;) { + error = copyin(ptr++, &arg, sizeof(arg)); + if (error) + goto err_exit; + if (arg == 0) + break; + envp = PTRIN(arg); + error = exec_args_add_env(args, envp, UIO_USERSPACE); + if (error != 0) + goto err_exit; + } + } + + return (0); + +err_exit: + exec_free_args(args); + return (error); +} + int linux_execve(struct thread *td, struct linux_execve_args *args) { @@ -2564,11 +2646,10 @@ linux_execve(struct thread *td, struct linux_execve_args *args) LINUX_CTR(execve); - error = exec_copyin_args(&eargs, args->path, UIO_USERSPACE, + error = linux_exec_copyin_args(&eargs, args->path, UIO_USERSPACE, args->argp, args->envp); if (error == 0) error = linux_common_execve(td, &eargs); AUDIT_SYSCALL_EXIT(error == EJUSTRETURN ? 0 : error, td); return (error); } -#endif diff --git a/sys/i386/linux/syscalls.master b/sys/i386/linux/syscalls.master index 9175bcd45dcf..c7168f7da80e 100644 --- a/sys/i386/linux/syscalls.master +++ b/sys/i386/linux/syscalls.master @@ -102,8 +102,8 @@ 11 AUE_EXECVE STD { int linux_execve( char *path, - char **argp, - char **envp + l_uintptr_t *argp, + l_uintptr_t *envp ); } 12 AUE_CHDIR STD {