From nobody Sat Apr 25 13:04:53 2026 X-Original-To: dev-commits-src-all@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 4g2qmq5YMWz6bT5M for ; Sat, 25 Apr 2026 13:04:59 +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 "R13" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4g2qmq32FMz4JBS for ; Sat, 25 Apr 2026 13:04:59 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1777122299; 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=klMmaVr0ZoXjjuf7EnNEqwFeq8PFUxAZFJ4TZYcjhes=; b=HZfOqWd1M4/R3CejVOSFz5LYozd/IKVuuDw1HmGqT18a78KzFgzqb+S1RMLGG2hooCJ5CZ 9MwkNd+ZhyupIT4Y4XQZ1kPF4DDSSUySjkqqoUW96I7Wr0HKppWFTP7RsaZYU89KfQDnbM Dva3IJl2jV+nEFcqU9QGFsRQXu/mqJXATZ86GY++T6gFygAQeiROBzXPcsMh9hWxiDXgo/ p3KehfT9vg9okeQIVJS6yf5BFWo4I/nEu2jMYL7afMYsQXZq9IX0uG4pdiixLoVR8wXorc 6EPg8wNlUWb7OOgb//5ZGRYvbg6XjGvb1e/D6tJ0ndH5L9VTt5Z9nTzWQeb0/g== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1777122299; a=rsa-sha256; cv=none; b=xmaZbOnJ6SR0U3atDfMT8be/xi8XoQSiROHZukqoyb86AnrLA4dB7fwdRiO6lOF2JF1U3B n5UG91Jtqk75s/7b9e7er8SkIXCWWeb+zCijjlYq9yKmpBjMZU6Y2DLCP2omDfdEVuu0pI duFQR5cD+K5SRcIKyOXOg/l8m/JS0Ceb3fXHsPUexLbb8JJ1CybHSFCGjyJkMGkKilwbUO 2GK+V8BSjhYr3T+GUWIvgK2PcTA8Mi4GCjn1sGPpSL6q5KeN7/6ybNtDN/Q4uWx3QwB2X2 p2c0y6vN6HGBeww63hta2fAQJOFNct4RiCJlBkj91r93PhAI8c/OoOByovj4nQ== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1777122299; 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=klMmaVr0ZoXjjuf7EnNEqwFeq8PFUxAZFJ4TZYcjhes=; b=npkwI7F06cHp1pTbr+y3lRQyvqBfOpHsVyDOCjDHMMd99L6EScVKy4wevROx9xJRLp7Vay PMeSvKQghLqJRG1nQMLHQW4mC14w22LZ5RhbH7+x0MWSjffkkztnqJnCJRU/KRlqRBwe1M 4pXOMFwqOZhd6wOpG9eFtTx+halV28nLxGruVgLEnr+vxabrgENijXq/XmblncYEPAAAgS JXNlGb4nz9/C/LBUCLIavAJKeR70HNOY50qdq7U1WivHd4gGgxBxBoth3Sc2E8Cv+SwgHW BEVhys0XtdcBDGD0mCP5d40r+5waK7VDUIemB/XMgdcqN6vB7/DWzdmDQJo9Dw== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4g2qmq08FjzZd8 for ; Sat, 25 Apr 2026 13:04:59 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 27f24 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Sat, 25 Apr 2026 13:04:53 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Jilles Tjoelker Subject: git: 7262e60119b8 - main - sh: Allow vfork on redirected simple commands List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: jilles X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 7262e60119b8840ee400d281421b8e65d8af9d84 Auto-Submitted: auto-generated Date: Sat, 25 Apr 2026 13:04:53 +0000 Message-Id: <69ecbbf5.27f24.19123d52@gitrepo.freebsd.org> The branch main has been updated by jilles: URL: https://cgit.FreeBSD.org/src/commit/?id=7262e60119b8840ee400d281421b8e65d8af9d84 commit 7262e60119b8840ee400d281421b8e65d8af9d84 Author: Jilles Tjoelker AuthorDate: 2026-04-25 13:03:29 +0000 Commit: Jilles Tjoelker CommitDate: 2026-04-25 13:04:10 +0000 sh: Allow vfork on redirected simple commands Things like `{ some_program; } >/dev/null` use vfork, so use vfork similarly for things like `some_program >/dev/null`. This cannot be done for command substitutions, because of two problems: * Redirections might cause the error message for later redirections or for an unknown command to be sent to the pipe (to be substituted), and this might cause a deadlock if the message is too long. * The assignment of the pipe needs to come before instead of after the redirections. Reviewed by: bdrewery Differential Revision: https://reviews.freebsd.org/D55190 --- bin/sh/eval.c | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 58 insertions(+), 3 deletions(-) diff --git a/bin/sh/eval.c b/bin/sh/eval.c index d0fddf160771..0c41c5e69eea 100644 --- a/bin/sh/eval.c +++ b/bin/sh/eval.c @@ -34,6 +34,7 @@ #include #include +#include #include #include #include @@ -803,6 +804,50 @@ safe_builtin(int idx, int argc, char **argv) return (0); } +/* + * Perform redirections, then execute a simple command with vfork. + * This cannot be used for command substitutions for two reasons: + * - Redirections might cause the error message for later redirections or for + * an unknown command to be sent to the pipe (to be substituted), and this + * might cause a deadlock if the message is too long. + * - The assignment of the pipe needs to come before instead of after the + * redirections. + */ +static bool +redirected_vforkexecshell(struct job *jp, union node *redir, char **argv, + char **envp, const char *path, int idx) +{ + struct jmploc jmploc; + struct jmploc *savehandler; + volatile int in_redirect = 1; + + savehandler = handler; + if (setjmp(jmploc.loc)) { + int e; + + handler = savehandler; + e = exception; + popredir(); + if (e == EXERROR && in_redirect) { + FORCEINTON; + return false; + } + longjmp(handler->loc, 1); + } else { + INTOFF; + handler = &jmploc; + redirect(redir, REDIR_PUSH); + in_redirect = 0; + INTON; + vforkexecshell(jp, argv, envp, path, idx, NULL); + } + INTOFF; + handler = savehandler; + popredir(); + INTON; + return true; +} + /* * Execute a simple command. * Note: This may or may not return if (flags & EV_EXIT). @@ -986,12 +1031,22 @@ evalcommand(union node *cmd, int flags, struct backcmd *backcmd) error("Pipe call failed: %s", strerror(errno)); } if (cmdentry.cmdtype == CMDNORMAL && - cmd->ncmd.redirect == NULL && + (cmd->ncmd.redirect == NULL || (flags & EV_BACKCMD) == 0) && varlist.count == 0 && (mode == FORK_FG || mode == FORK_NOJOB) && !disvforkset() && !iflag && !mflag) { - vforkexecshell(jp, argv, environment(), path, - cmdentry.u.index, flags & EV_BACKCMD ? pip : NULL); + if (cmd->ncmd.redirect != NULL) { + if (redirected_vforkexecshell(jp, + cmd->ncmd.redirect, + argv, environment(), path, + cmdentry.u.index)) + goto parent; + else + goto out; + } else + vforkexecshell(jp, argv, environment(), path, + cmdentry.u.index, + flags & EV_BACKCMD ? pip : NULL); goto parent; } if (forkshell(jp, cmd, mode) != 0)