From patchwork Wed Oct 30 20:37:31 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Tycho Andersen X-Patchwork-Id: 13857143 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id C566FD6B6D4 for ; Wed, 30 Oct 2024 20:38:30 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 3CFA18D0002; Wed, 30 Oct 2024 16:38:30 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 37F3E8D0001; Wed, 30 Oct 2024 16:38:30 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 1F8708D0002; Wed, 30 Oct 2024 16:38:30 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0010.hostedemail.com [216.40.44.10]) by kanga.kvack.org (Postfix) with ESMTP id F0BB38D0001 for ; Wed, 30 Oct 2024 16:38:29 -0400 (EDT) Received: from smtpin09.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay08.hostedemail.com (Postfix) with ESMTP id 82FC1140E6B for ; Wed, 30 Oct 2024 20:38:29 +0000 (UTC) X-FDA: 82731430110.09.6E81BFD Received: from fhigh-b5-smtp.messagingengine.com (fhigh-b5-smtp.messagingengine.com [202.12.124.156]) by imf23.hostedemail.com (Postfix) with ESMTP id 44E2114001A for ; Wed, 30 Oct 2024 20:38:08 +0000 (UTC) Authentication-Results: imf23.hostedemail.com; dkim=pass header.d=tycho.pizza header.s=fm2 header.b=c6L15Xnn; dkim=pass header.d=messagingengine.com header.s=fm3 header.b=EIBGCnWG; dmarc=none; spf=pass (imf23.hostedemail.com: domain of tycho@tycho.pizza designates 202.12.124.156 as permitted sender) smtp.mailfrom=tycho@tycho.pizza ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1730320587; a=rsa-sha256; cv=none; b=bVKbDaE95CG01oh4P6yCoFUN9v9mMhkWYxFTASmIjjerjme7DXPkWWnjgoPR25l2WWiOON EjwxuuSMB5y47HINRm7oA9YL4Ct5V7DJB1ZZFxAcZIJK+GB3rZLaRiOF0W7QrioEYEK4zw vIkO5KoowdGIgvYRwLSSSmpiYiloYLY= ARC-Authentication-Results: i=1; imf23.hostedemail.com; dkim=pass header.d=tycho.pizza header.s=fm2 header.b=c6L15Xnn; dkim=pass header.d=messagingengine.com header.s=fm3 header.b=EIBGCnWG; dmarc=none; spf=pass (imf23.hostedemail.com: domain of tycho@tycho.pizza designates 202.12.124.156 as permitted sender) smtp.mailfrom=tycho@tycho.pizza ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1730320587; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding:in-reply-to: references:dkim-signature; bh=jPlW8lpVwjQjFu6EM0sMGNKdNqoUomEoUkzIuxowlG4=; b=EQwLjtcrEL4selEjm//AZaPIRmNxpeeJCNtHxNB/WjytSXCxWLA+96kYNhjzRKcTAgAyTM XOyAkaDux5BCTG2KH1MTrODgrvdbk0Qyq/mHh/Ok1XzpyeV7ngrHB5CHUPoC/isXxr5vn+ IfskqKUClhVM/5fPZ9xaJzXsWHPyqQM= Received: from phl-compute-07.internal (phl-compute-07.phl.internal [10.202.2.47]) by mailfhigh.stl.internal (Postfix) with ESMTP id DB33E25400F2; Wed, 30 Oct 2024 16:38:23 -0400 (EDT) Received: from phl-mailfrontend-02 ([10.202.2.163]) by phl-compute-07.internal (MEProxy); Wed, 30 Oct 2024 16:38:24 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tycho.pizza; h= cc:cc:content-transfer-encoding:content-type:content-type:date :date:from:from:in-reply-to:message-id:mime-version:reply-to :subject:subject:to:to; s=fm2; t=1730320703; x=1730407103; bh=jP lW8lpVwjQjFu6EM0sMGNKdNqoUomEoUkzIuxowlG4=; b=c6L15XnnPdIx76gYls mLPF+Vj8HhekzJlPdwh00/LuPwaztVz5W6E3Zufy+9NAVbCq2Z34ALuRmg+yfkfQ CqbCs1vP4HxwOP+rviHSOW9P9vsyLWAUHg95cVoV6i4r5/WNaBradrCUROex6L0E uUW0yp3/O90QxV+uWh92Pdao1ZbtU8Qj75K5THQWjHka7OjxeefUFN9G8HaAAB0r x8G8w+G8KJZq4OFfdh8Ql2ZVpQhU84Q943CuA35v50+26eoaaAgCluJBubgM2nnj sotGQHnRDM+CrVOgtRpGNt60EuLZEzP0eFuq9+4OKgqjmKXlzjKUl1z+qaC519Wl cHEQ== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:content-type:date:date:feedback-id:feedback-id :from:from:in-reply-to:message-id:mime-version:reply-to:subject :subject:to:to:x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s= fm3; t=1730320703; x=1730407103; bh=jPlW8lpVwjQjFu6EM0sMGNKdNqoU omEoUkzIuxowlG4=; b=EIBGCnWGiWp0ccL6z7gBbF+e04ercRMGUfkF1/9JGyaa Uiw8TaJ7jL2hkapoSh9KUwRp9nH0+ygGKKBzIzfJ2BG63fuhBC13iOV7VuOVSbOK sgFlaxjJgeSRV6K1aFYJK2cA4kZv6Xi034lAshJ+1vg8Zg4m6EPto4WPxfouKckP kV8U5RtcvHJU80rZa6u1s0+3rBtPxDzdZlVEgBs8OsOZnEsqTv34iKgGuNEwX86t qHKni9IFOjvTUaJdhpgQRNHzROi6s7tImOQuO69Yq0LftkWjzu3A5M2lpnJIsdzo Y7T6HG6h6d1EyugTzfgP0dtrYy7Z6+SAaxHUKYSsaw== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeeftddrvdekfedgudefkecutefuodetggdotefrod ftvfcurfhrohhfihhlvgemucfhrghsthforghilhdpggftfghnshhusghstghrihgsvgdp uffrtefokffrpgfnqfghnecuuegrihhlohhuthemuceftddtnecusecvtfgvtghiphhivg hnthhsucdlqddutddtmdenucfjughrpefhvfevufffkffogggtgfesthekredtredtjeen ucfhrhhomhepvfihtghhohcutehnuggvrhhsvghnuceothihtghhohesthihtghhohdrph hiiiiirgeqnecuggftrfgrthhtvghrnhepueeuueejffffkeehvedviedufffgtdetvedu vdethfegudffheduvdejfffhgfeunecuffhomhgrihhnpehgihhthhhusgdrtghomhenuc evlhhushhtvghrufhiiigvpedtnecurfgrrhgrmhepmhgrihhlfhhrohhmpehthigthhho sehthigthhhordhpihiiiigrpdhnsggprhgtphhtthhopedugedpmhhouggvpehsmhhtph houhhtpdhrtghpthhtohepvhhirhhoseiivghnihhvrdhlihhnuhigrdhorhhgrdhukhdp rhgtphhtthhopegsrhgruhhnvghrsehkvghrnhgvlhdrohhrghdprhgtphhtthhopehjrg gtkhesshhushgvrdgtiidprhgtphhtthhopegvsghivgguvghrmhesgihmihhsshhiohhn rdgtohhmpdhrtghpthhtohepkhgvvghssehkvghrnhgvlhdrohhrghdprhgtphhtthhope hskhhhrghnsehlihhnuhigfhhouhhnuggrthhiohhnrdhorhhgpdhrtghpthhtohepiigs hihsiigvkhesihhnrdifrgifrdhplhdprhgtphhtthhopegthihphhgrrhestgihphhhrg hrrdgtohhmpdhrtghpthhtoheplhhinhhugidqfhhsuggvvhgvlhesvhhgvghrrdhkvghr nhgvlhdrohhrgh X-ME-Proxy: Feedback-ID: i21f147d5:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Wed, 30 Oct 2024 16:38:20 -0400 (EDT) From: Tycho Andersen To: Alexander Viro , Christian Brauner , Jan Kara , Eric Biederman , Kees Cook , Shuah Khan Cc: =?utf-8?q?Zbigniew_J=C4=99drzejewski-Szmek?= , Aleksa Sarai , linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, Tycho Andersen , Tycho Andersen Subject: [PATCH 1/2] exec: fix up /proc/pid/comm in the execveat(AT_EMPTY_PATH) case Date: Wed, 30 Oct 2024 14:37:31 -0600 Message-Id: <20241030203732.248767-1-tycho@tycho.pizza> X-Mailer: git-send-email 2.34.1 MIME-Version: 1.0 X-Rspamd-Queue-Id: 44E2114001A X-Rspam-User: X-Rspamd-Server: rspam05 X-Stat-Signature: 9ztje1mfrarxjcit587jnuqagrt3ppxs X-HE-Tag: 1730320688-336828 X-HE-Meta: U2FsdGVkX1+B8adXunNoWxU5gKCQ7WrnK6IH2bkvDNwrZw1Y4A6TzpxRloa1s7m4935tGrKUrkfcGKmGxGCtzGy1EFtitnvUqLw0l8/inHLZex48z0ZAPhSMZ6d/usbjQTropROtuej07vO9gM7BpQAgjInHw4wGXCAqvxwrf6ERDhd19B3FnQLN1mDEkZNqak19QLZ3vD60MDJ02rQFWL9ODw6tsFsquy55Xl+OarA/4rdslSX6YFdL6xCsDNtKTDV+H1jXL5VG6CCif0rTJHdnTpPTP9TqFUMd87Cl+kTQ0CrBsL6KGDDFMoCnnoAgNY9TvxLf2it7UtnSpCdzl9FcpdDbtEidmfzqd/1DRmPrTZpDR0+1AfdBCMC4is/R07MwHKxaEkayT9KUi9SKpsJxsrOt+gfTR0umQeuY1nHXXIHoOpKqPB20Uzuh32xlyZPxpx4ydPT8GmWJJv/EEhCLawy6seJv4yj/Bm6ruiciOVlcmQ09pKy8qFoDTIspgQ8bMoMYFdfQdVFnFSu1QQ6XWeBGPEWvwchSNaSOKzAAvhGBlpowSDkDrAaQc6SSqpGYQSkzlBeimmFFG7WBxKVWTvwPEX9VWKUV22sbh8ErWTN8kMn2LOWM/z/mQaioAzpZu8u9qcOqezl9Zhi5MC76RNX+DikcQcO32UiTBje3qnlwFzrhEcQqMjpk2NfAkmY/HgcKfGroQsttyyhr4gEuErOCqJOLflHzJC28wMiHSN2oMOPgU9getr6QSTR0bxnDG/FdM7OFwzTMjXI3nkckVSn/KhExZa9itYJIKt3A2TOu89i01D5dA+iugnyFueM4dFXHk30dlCHq9Dk4BfvELK23FbIv/UP9eOUhR6gKmciP9RVUf7J36EOHNAoZ9iUvGKM3Br65mP0E8C036m1g5Ly5ix27iM9d+AGDpCH3/TUc/fdrzz4dx2KPgLx4N0NOO7mcsxKEqWsuvj0 QYHNU7n4 yZKJ3ZwUO4SShsZsAYSBkf0LLURjUPe1iyYHdyioQy1sOhw9YLgCc3v6zVNmomF5GPUXAxH2Y/T7F+iGnFs8g18kzqXR2JpzJd+KpbQT3w/r725aNnfHlxfaidk+ZU3taDk2JBphQ6m8ZZgtLB2OlT4SE3GV6mnxNtzpSDJ9ZsCxjNEjiSvm0doy1l/cQnjIOphOLoLIQBFoClrRqSsrF/Wae1g+1OUYMxgpg9XancNXrsuSbMmXl7KkhOC5wr86F2SUUkLx1XaRddc1xlGJ05k47RYJJsqcJv9URB7D81g+Y5CNxD8A5n08APgPdlAM9wttmkjXgSp4v8WSemEtsOgpLno1rYxBjcKpJAlYwaIw8z150qqPPWJ5c8SCfWI8lklwWX82SIP1HgpFTZU3oEF0Z8tXOvv4GIrWqo2c71Bdrpfg5n6UJEJYWshbqsFog3feRB93E0xPQVlid+eDK3knYzq++kZHQ+2nbZMZjCPYq+48= X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: From: Tycho Andersen Zbigniew mentioned at Linux Plumber's that systemd is interested in switching to execveat() for service execution, but can't, because the contents of /proc/pid/comm are the file descriptor which was used, instead of the path to the binary. This makes the output of tools like top and ps useless, especially in a world where most fds are opened CLOEXEC so the number is truly meaningless. Change exec path to fix up /proc/pid/comm in the case where we have allocated one of these synthetic paths in bprm_init(). This way the actual exec machinery is unchanged, but cosmetically the comm looks reasonable to admins investigating things. Signed-off-by: Tycho Andersen Suggested-by: Zbigniew Jędrzejewski-Szmek CC: Aleksa Sarai Link: https://github.com/uapi-group/kernel-features#set-comm-field-before-exec --- v2: * drop the flag, everyone :) * change the rendered value to f_path.dentry->d_name.name instead of argv[0], Eric v3: * fix up subject line, Eric v4: * switch to no flag, always rewrite approach, with some cleanup suggested by Kees --- fs/exec.c | 36 +++++++++++++++++++++++++++++++++++- include/linux/binfmts.h | 1 + 2 files changed, 36 insertions(+), 1 deletion(-) base-commit: c1e939a21eb111a6d6067b38e8e04b8809b64c4e diff --git a/fs/exec.c b/fs/exec.c index 6c53920795c2..3b559f598c74 100644 --- a/fs/exec.c +++ b/fs/exec.c @@ -1347,7 +1347,16 @@ int begin_new_exec(struct linux_binprm * bprm) set_dumpable(current->mm, SUID_DUMP_USER); perf_event_exec(); - __set_task_comm(me, kbasename(bprm->filename), true); + + /* + * If argv0 was set, alloc_bprm() made up a path that will + * probably not be useful to admins running ps or similar. + * Let's fix it up to be something reasonable. + */ + if (bprm->argv0) + __set_task_comm(me, kbasename(bprm->argv0), true); + else + __set_task_comm(me, kbasename(bprm->filename), true); /* An exec changes our domain. We are no longer part of the thread group */ @@ -1497,9 +1506,28 @@ static void free_bprm(struct linux_binprm *bprm) if (bprm->interp != bprm->filename) kfree(bprm->interp); kfree(bprm->fdpath); + kfree(bprm->argv0); kfree(bprm); } +static int bprm_add_fixup_comm(struct linux_binprm *bprm, + struct user_arg_ptr argv) +{ + const char __user *p = get_user_arg_ptr(argv, 0); + + /* + * If p == NULL, let's just fall back to fdpath. + */ + if (!p) + return 0; + + bprm->argv0 = strndup_user(p, MAX_ARG_STRLEN); + if (bprm->argv0) + return 0; + + return -EFAULT; +} + static struct linux_binprm *alloc_bprm(int fd, struct filename *filename, int flags) { struct linux_binprm *bprm; @@ -1906,6 +1934,12 @@ static int do_execveat_common(int fd, struct filename *filename, goto out_ret; } + if (unlikely(bprm->fdpath)) { + retval = bprm_add_fixup_comm(bprm, argv); + if (retval != 0) + goto out_free; + } + retval = count(argv, MAX_ARG_STRINGS); if (retval == 0) pr_warn_once("process '%s' launched '%s' with NULL argv: empty string added\n", diff --git a/include/linux/binfmts.h b/include/linux/binfmts.h index e6c00e860951..bab5121a746b 100644 --- a/include/linux/binfmts.h +++ b/include/linux/binfmts.h @@ -55,6 +55,7 @@ struct linux_binprm { of the time same as filename, but could be different for binfmt_{misc,script} */ const char *fdpath; /* generated filename for execveat */ + const char *argv0; /* argv0 from execveat */ unsigned interp_flags; int execfd; /* File descriptor of the executable */ unsigned long loader, exec; From patchwork Wed Oct 30 20:37:32 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tycho Andersen X-Patchwork-Id: 13857144 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 3281ED6B6D6 for ; Wed, 30 Oct 2024 20:38:32 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id CAB3C8D0003; Wed, 30 Oct 2024 16:38:30 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id C592C8D0001; Wed, 30 Oct 2024 16:38:30 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id A84038D0003; Wed, 30 Oct 2024 16:38:30 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0017.hostedemail.com [216.40.44.17]) by kanga.kvack.org (Postfix) with ESMTP id 8DDFA8D0001 for ; Wed, 30 Oct 2024 16:38:30 -0400 (EDT) Received: from smtpin27.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay04.hostedemail.com (Postfix) with ESMTP id 4888D1A01E7 for ; Wed, 30 Oct 2024 20:38:30 +0000 (UTC) X-FDA: 82731430488.27.08A990D Received: from fhigh-b5-smtp.messagingengine.com (fhigh-b5-smtp.messagingengine.com [202.12.124.156]) by imf21.hostedemail.com (Postfix) with ESMTP id 740F11C0018 for ; Wed, 30 Oct 2024 20:37:38 +0000 (UTC) Authentication-Results: imf21.hostedemail.com; dkim=pass header.d=tycho.pizza header.s=fm2 header.b="m PikVvj"; dkim=pass header.d=messagingengine.com header.s=fm3 header.b=UjSz8CwY; spf=pass (imf21.hostedemail.com: domain of tycho@tycho.pizza designates 202.12.124.156 as permitted sender) smtp.mailfrom=tycho@tycho.pizza; dmarc=none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1730320547; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=0r+XHUZuZsMcFUus8OxUh/faPdt2sC3qEYpfg2ntVAY=; b=S7yW4o/chSsQwhSJYBcg3raNM7/0HOLkZ5kBVEXuVRyJq7IDOVxHkti1OTRGrsgPmfL1bM vl4g4kvVWC7aeiK/V7AWHA3vLcJkBjMmADuj3zFJ/lNxT16HvK4MqQWjDiRZyYC+IsvIAc PhaGS9DwhAJCwmluPO1w+/jwxNMnjZc= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1730320547; a=rsa-sha256; cv=none; b=4Fdbejj6oBl6MtZ+c9kkDnF3yG8GXTWKV/jC4FkSXAoYFw8Usb90/+gcduPR01nO73leIS vw0H2qmFfYpgoAjONsRdoxGgANwocfzVDup6PPOfoaBOiriOxxT7QpcNHtOeucsxiPkt5d Dp5r4yAM40B0fvPjt6auynodSXBcCik= ARC-Authentication-Results: i=1; imf21.hostedemail.com; dkim=pass header.d=tycho.pizza header.s=fm2 header.b="m PikVvj"; dkim=pass header.d=messagingengine.com header.s=fm3 header.b=UjSz8CwY; spf=pass (imf21.hostedemail.com: domain of tycho@tycho.pizza designates 202.12.124.156 as permitted sender) smtp.mailfrom=tycho@tycho.pizza; dmarc=none Received: from phl-compute-04.internal (phl-compute-04.phl.internal [10.202.2.44]) by mailfhigh.stl.internal (Postfix) with ESMTP id 3C97D25400FD; Wed, 30 Oct 2024 16:38:27 -0400 (EDT) Received: from phl-mailfrontend-02 ([10.202.2.163]) by phl-compute-04.internal (MEProxy); Wed, 30 Oct 2024 16:38:27 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tycho.pizza; h= cc:cc:content-transfer-encoding:content-type:date:date:from:from :in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to; s=fm2; t=1730320707; x= 1730407107; bh=0r+XHUZuZsMcFUus8OxUh/faPdt2sC3qEYpfg2ntVAY=; b=m PikVvjpOOulDgJtt8fgJTv9y0iR5xoLilAgtN6rIt4VVviX/+ngC9myYslvm/doh BJvXJFkgmvCETTLYEODn7SulKFV7FWMcl8JO1FCtZbP01LrCQ/SDZAwk4g8QW8Bk sQAJBim33GWyg/irw9rXQ0TyWQ1WIJo/JRPUM5BwqR/fbokPszgZ+aUPyuNRuATc fC34fYM5q6EFIttJlGQjWSptyN7mkfS07nxTfpNqAdayUt8UyFMPFlAOZXW+GWG9 mHlzbYvCAC+zthlVkg6Oc/b+2mXYeNX+Tzy83saT7TyYnV4KQuT/NrVB/7yjtFDK 3FpBnzmiCACXWZnL4g87w== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:date:date:feedback-id:feedback-id:from:from :in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to:x-me-proxy:x-me-sender :x-me-sender:x-sasl-enc; s=fm3; t=1730320707; x=1730407107; bh=0 r+XHUZuZsMcFUus8OxUh/faPdt2sC3qEYpfg2ntVAY=; b=UjSz8CwY2Ltr8JVOc KvByOmqULkJtsP4Om3hiYbwJ0nDqXUcNidrQg0YsM5ueB6BfceukpCsorVRBGao2 uLJX0YKuwALEvDBPlISSHXKc5oK8lF1VdU6h1xazpDP5ecLxI2jTf0hQC6XqlN/4 QXizqbm4iwoWxYOtl4Hx0H8OfRbL6ot6DkTpxxGcVPJIN3GquoiJZnQVqnvZhSpH 4+hi/wqYD0v6422jQ5dgF6AoZVKLLgroXcfeOtUq1YnhMkaZJTt0ww4XVzA9baec oAUmm3fbbc/0J8dXidWmfjmNAf84Zh/E3817Ze4CaRfnvPd3c7RJmOicLI7zyLQ1 IUPJw== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeeftddrvdekfedgudefkecutefuodetggdotefrod ftvfcurfhrohhfihhlvgemucfhrghsthforghilhdpggftfghnshhusghstghrihgsvgdp uffrtefokffrpgfnqfghnecuuegrihhlohhuthemuceftddtnecusecvtfgvtghiphhivg hnthhsucdlqddutddtmdenucfjughrpefhvfevufffkffojghfggfgsedtkeertdertddt necuhfhrohhmpefvhigthhhoucetnhguvghrshgvnhcuoehthigthhhosehthigthhhord hpihiiiigrqeenucggtffrrghtthgvrhhnpefhvefhvddvffeufffgffejheelffeffeff ueehgeevvdeggfeufeekudeikefgleenucffohhmrghinhepkhgvrhhnvghlrdhorhhgne cuvehluhhsthgvrhfuihiivgeptdenucfrrghrrghmpehmrghilhhfrhhomhepthihtghh ohesthihtghhohdrphhiiiiirgdpnhgspghrtghpthhtohepudegpdhmohguvgepshhmth hpohhuthdprhgtphhtthhopehvihhrohesiigvnhhivhdrlhhinhhugidrohhrghdruhhk pdhrtghpthhtohepsghrrghunhgvrheskhgvrhhnvghlrdhorhhgpdhrtghpthhtohepjh grtghksehsuhhsvgdrtgiipdhrtghpthhtohepvggsihgvuggvrhhmseigmhhishhsihho nhdrtghomhdprhgtphhtthhopehkvggvsheskhgvrhhnvghlrdhorhhgpdhrtghpthhtoh epshhkhhgrnheslhhinhhugihfohhunhgurghtihhonhdrohhrghdprhgtphhtthhopeii sgihshiivghksehinhdrfigrfidrphhlpdhrtghpthhtoheptgihphhhrghrsegthihphh grrhdrtghomhdprhgtphhtthhopehlihhnuhigqdhfshguvghvvghlsehvghgvrhdrkhgv rhhnvghlrdhorhhg X-ME-Proxy: Feedback-ID: i21f147d5:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Wed, 30 Oct 2024 16:38:24 -0400 (EDT) From: Tycho Andersen To: Alexander Viro , Christian Brauner , Jan Kara , Eric Biederman , Kees Cook , Shuah Khan Cc: =?utf-8?q?Zbigniew_J=C4=99drzejewski-Szmek?= , Aleksa Sarai , linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, Tycho Andersen , Tycho Andersen Subject: [PATCH 2/2] selftests/exec: add a test for execveat()'s comm Date: Wed, 30 Oct 2024 14:37:32 -0600 Message-Id: <20241030203732.248767-2-tycho@tycho.pizza> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20241030203732.248767-1-tycho@tycho.pizza> References: <20241030203732.248767-1-tycho@tycho.pizza> MIME-Version: 1.0 X-Stat-Signature: q1o8bzdammr8r6jbkbefwefeq1cd4467 X-Rspamd-Queue-Id: 740F11C0018 X-Rspam-User: X-Rspamd-Server: rspam08 X-HE-Tag: 1730320658-258610 X-HE-Meta: U2FsdGVkX1+LbKdn5pO4WOx+n8RLLej53CXrghS9bWmfA4XPvlabEdn0RR2EBe5k1+ZhBjCb2Z9CiMnqklVzyEMhZZscmvtvOPUP2uzjzLKT2QWim+xDAhb9wS4A/i0MRKVy/MHGsZk1V/eiXOSK2JlDPr7kiR4s3b28Vr6z4A9/zGSuwgRK6lmsTMGSB8vxUEd3gi6oLXvpfMm16y0MaiptO+lV38k1vu4Gykwkq+1QpQcVnA09KI9GX2pnRiWuaDoDa0c6yDCh/bVR9mEIxW/6tfDuMPnLSJ1inNZz9Q1lqEdkJbVM2ex4srwFSjPVcdzZLX3d3o8BNy168i/KoGGHIW4+BGwzECEtjk/raEEB72vJep+pXWmnmidHH9n3TZYQb4Mt1E1rep/n5TOiBzmVDBGMcwObf2RD2JoiQdnPe3Gk4fCPzjiTevOZwwP8tH+zGL/GoNYzEqM6DmyB0g6Bl4It5YwlwSYdKRhbbNB73CgMCsUpY7uM38XKpmHeAuaYsUrvw37PvhGa1WdADZ2hHKGeX326dgXuxAzc5MjlBJVn022LheQIaWP8qgsnxzPQaPeifu+lEdiL/uS5I3OFHoT7V9cMoNTL1Eh2hDU6rI062AQmXgxqVDtprPa5yP4xfPxyLxm66Y94w7yMMkR7nebi/geXKnJIlNuxGY7YCyM0i3phKJ46PTo/5k/fE3Z1gh41QNFWVYgrp0wK1Q3UtpA4WVooiBI8rfBtarOQs/7uQiXF98jRkCjaLxpv7Edgcm/FEYt3230CFrIN05LNQBmcXc4i5smHIINfcK+4hAeEW/PG8VjtLa2GEKPv+ZUlvNjefiMQm5tQqkiezYc4k9gqE06rsuSwcUpz4kN3y9Eer+DB9XSOONte1ELXDucliKPAXy+0oOD/XJjVfD1HxMwY0sfQkviu6CmfynRoG3ku306mJdnD9NK3uVNibUPQHERhCxTaZjdsPXO 4GQUv5f2 Jhh5bzeeWCm1PhgqUukieDQVwqFBpuYomLowdyALYlCnc4aaFIBJ9G75KTSeiM+s2PyniOuIFOKAmtCTRFjlECvKd2Dcv7Z+j89jxmiMo5YeM5BnWD30nEucn5R/nyU3AAJs6iAhqhQULOiIUpqVdudhAeQ+th+HsKUOUk8nkOAvIFvyvxQG92l1zL3NjhOLgWdjkf/K8NtpgyraGKWVvM5tFtRGqLrgGTFiqMWD+1PXeDKp/jAi6vizxRWwpTJxf0k7bEvbRkmMwtQWYCI9fMJno9XrbPTmDBQl3SE+d4JxSTGmmgbnntMwVeNVgCKpcclptBX7Ps3W1XzUdkczLjk6lOBMRGehS14B+vnXtZcWTblNsLwUqt4V2WCJUviu5wrRlbnRDZtQyGE8BAfMpmTcdLQ== X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: From: Tycho Andersen In the previous patch we've defined a couple behaviors: 1. execveat(fd, AT_EMPTY_PATH, {"foo"}, ...) should render argv[0] as /proc/pid/comm 2. execveat(fd, AT_EMPTY_PATH, {NULL}, ...) should keep the old behavior of rendering the fd as /proc/pid/comm and just to be sure keeps working with symlinks, which was a concern in [1], I've added a test for that as well. The test itself is a bit ugly, because the existing check_execveat_fail() helpers use a hardcoded envp and argv, and we want to "pass" things via the environment to test various argument values, but it seemed cleaner than passing one in everywhere in all the existing tests. Output looks like: ok 51 Check success of execveat(6, 'home/tycho/packages/...yyyyyyyyyyyyyyyyyyyy', 0)... # Check execveat(AT_EMPTY_PATH)'s comm is sentinel ok 52 Check success of execveat(9, '', 4096)... # Check execveat(AT_EMPTY_PATH)'s comm is sentinel ok 53 Check success of execveat(11, '', 4096)... # Check execveat(AT_EMPTY_PATH)'s comm is 9 [ 25.579272] process 'execveat' launched '/dev/fd/9' with NULL argv: empty string added ok 54 Check success of execveat(9, '', 4096)... [1]: https://lore.kernel.org/all/20240925.152228-private.conflict.frozen.trios-TdUGhuI5Sb4v@cyphar.com/ Signed-off-by: Tycho Andersen --- v4: fix up commit message, use ksft_perror() vs perror(), Shuah --- tools/testing/selftests/exec/execveat.c | 77 ++++++++++++++++++++++++- 1 file changed, 74 insertions(+), 3 deletions(-) diff --git a/tools/testing/selftests/exec/execveat.c b/tools/testing/selftests/exec/execveat.c index 071e03532cba..3a05f8cbd815 100644 --- a/tools/testing/selftests/exec/execveat.c +++ b/tools/testing/selftests/exec/execveat.c @@ -23,9 +23,11 @@ #include "../kselftest.h" -#define TESTS_EXPECTED 51 +#define TESTS_EXPECTED 54 #define TEST_NAME_LEN (PATH_MAX * 4) +#define CHECK_COMM "CHECK_COMM" + static char longpath[2 * PATH_MAX] = ""; static char *envp[] = { "IN_TEST=yes", NULL, NULL }; static char *argv[] = { "execveat", "99", NULL }; @@ -237,12 +239,36 @@ static int check_execveat_pathmax(int root_dfd, const char *src, int is_script) return fail; } +static int check_execveat_comm(int fd, char *argv0, char *expected) +{ + char buf[128], *old_env, *old_argv0; + int ret; + + snprintf(buf, sizeof(buf), CHECK_COMM "=%s", expected); + + old_env = envp[1]; + envp[1] = buf; + + old_argv0 = argv[0]; + argv[0] = argv0; + + ksft_print_msg("Check execveat(AT_EMPTY_PATH)'s comm is %s\n", + expected); + ret = check_execveat_invoked_rc(fd, "", AT_EMPTY_PATH, 0, 0); + + envp[1] = old_env; + argv[0] = old_argv0; + + return ret; +} + static int run_tests(void) { int fail = 0; char *fullname = realpath("execveat", NULL); char *fullname_script = realpath("script", NULL); char *fullname_symlink = concat(fullname, ".symlink"); + char fd_buf[10]; int subdir_dfd = open_or_die("subdir", O_DIRECTORY|O_RDONLY); int subdir_dfd_ephemeral = open_or_die("subdir.ephemeral", O_DIRECTORY|O_RDONLY); @@ -389,6 +415,15 @@ static int run_tests(void) fail += check_execveat_pathmax(root_dfd, "execveat", 0); fail += check_execveat_pathmax(root_dfd, "script", 1); + + /* /proc/pid/comm gives argv[0] by default */ + fail += check_execveat_comm(fd, "sentinel", "sentinel"); + /* /proc/pid/comm gives argv[0] when invoked via link */ + fail += check_execveat_comm(fd_symlink, "sentinel", "sentinel"); + /* /proc/pid/comm gives fdno if NULL is passed */ + snprintf(fd_buf, sizeof(fd_buf), "%d", fd); + fail += check_execveat_comm(fd, NULL, fd_buf); + return fail; } @@ -415,9 +450,13 @@ int main(int argc, char **argv) int ii; int rc; const char *verbose = getenv("VERBOSE"); + const char *check_comm = getenv(CHECK_COMM); - if (argc >= 2) { - /* If we are invoked with an argument, don't run tests. */ + if (argc >= 2 || check_comm) { + /* + * If we are invoked with an argument, or no arguments but a + * command to check, don't run tests. + */ const char *in_test = getenv("IN_TEST"); if (verbose) { @@ -426,6 +465,38 @@ int main(int argc, char **argv) ksft_print_msg("\t[%d]='%s\n'", ii, argv[ii]); } + /* If the tests wanted us to check the command, do so. */ + if (check_comm) { + /* TASK_COMM_LEN == 16 */ + char buf[32]; + int fd, ret; + + fd = open("/proc/self/comm", O_RDONLY); + if (fd < 0) { + ksft_perror("open() comm failed"); + exit(1); + } + + ret = read(fd, buf, sizeof(buf)); + if (ret < 0) { + ksft_perror("read() comm failed"); + close(fd); + exit(1); + } + close(fd); + + // trim off the \n + buf[ret-1] = 0; + + if (strcmp(buf, check_comm)) { + ksft_print_msg("bad comm, got: %s expected: %s", + buf, check_comm); + exit(1); + } + + exit(0); + } + /* Check expected environment transferred. */ if (!in_test || strcmp(in_test, "yes") != 0) { ksft_print_msg("no IN_TEST=yes in env\n");