From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 10D92534445; Wed, 9 Sep 2026 10:43:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788950622; cv=none; b=QJtV86eI2pSkg3u6j9QZkzSg7eXTddO+xFadlM8NIzcF1FxSIpz6mRjtzo2dc3DgwgV3xLps8c/FvgsZBhMmWbYk1tq97sU1F9/atzqejjB6HmthxTK+24Ip4+5rU5hp/kXrvhjSew17Vzfgb+U6zNA3cHWW2fVFKULqOsZwqa8= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788950622; c=relaxed/simple; bh=93dvwazGQmyhpLGOG6YC1oHD3PgppRUiN9FyAp69QeA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=jp2HT+uBuMbUT0hgdhhMIbCkTvXb+PCWqPOhyvmJ9QxVw7xC364KOh/2JLxqFr5dphliOHeVTBXwMrLeQ80yltbeAD0ZgMUdi+qzd0fm6QKqt/7oTSZd1jAf6GTb7znhcrB5rwquxPDZYSR3BcQ3i6+32OMutWAHVKmwZOfAZXM= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=eQPpa1/O; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="eQPpa1/O" Received: by smtp.kernel.org (Postfix) with ESMTPSA id CD1E31F00A3E; Wed, 9 Sep 2026 10:43:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1788950620; bh=vvhqs/opFW1MtRaaw0rgUb+gCmDOYHPkin1TdpYv3Uk=; h=From:Date:Subject:References:In-Reply-To:To:Cc; b=eQPpa1/Ocf/0CMF3tUn+eMHV1rZW5aao7LswwDQP+yJCEegBUQBEdjqtcDhO1Qub6 1sWZ70wLrntXkLWsz++kcAdYVgZbiknIzpF3bLij6Xys8tFwqTM7emSjVxHQ728ApK PqY0arlq5mpQyCc4kWNAzxGjI7IOc4Z+a7quM6Mz8zOztRNXuROfawNQwZEp1SN11D BljePL275l3HPEO3Uz5CaXxg9yi546zKa7qb1Ajti8nl6bycV0v24sfLiS9kysAeDE /YF68RJf+7TJhCef0Kahzh1RHo5QpaqqmdI91DjIV9wJ2YVvNN07/4WO4Q2DVJ3cqx JSqQIoA5zfk4Q== From: Christian Brauner Date: Wed, 09 Sep 2026 12:43:07 +0200 Subject: [PATCH v2 08/10] selftests/net: SO_PEERPIDFD_THREAD Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Message-Id: <20260909-work-unix-passpidfd-v2-8-7bd342abb2d1@kernel.org> References: <20260909-work-unix-passpidfd-v2-0-7bd342abb2d1@kernel.org> In-Reply-To: <20260909-work-unix-passpidfd-v2-0-7bd342abb2d1@kernel.org> To: Jakub Kicinski , Kuniyuki Iwashima , Oleg Nesterov Cc: "David S. Miller" , Eric Dumazet , Paolo Abeni , Simon Horman , Willem de Bruijn , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Alexander Viro , Jan Kara , linux-fsdevel@vger.kernel.org, Alexander Mikhalitsyn , "Christian Brauner (Amutable)" X-Mailer: b4 0.17-dev-db0b7 X-Developer-Signature: v=1; a=openpgp-sha256; l=3150; i=brauner@kernel.org; h=from:subject:message-id; bh=93dvwazGQmyhpLGOG6YC1oHD3PgppRUiN9FyAp69QeA=; b=owGbwMvMwCU28Zj0gdSKO4sYT6slMWQttLCZl/m5ZPXC2/9X2NxRbtjvWnDOaMnMXP/IpslFV 4tuxu9Z21HKwiDGxSArpsji0G4SLrecp2KzUaYGzBxWJpAhDFycAjCRxXMY/hktYF31IsjktPO1 u3Vs7KFreXW3Mxov2fGAz+P79w0//vUxMpy4FyTK+XWHjEzL8c+W26Ilti9ky+Jh95zWYBqyoGL xOgYA X-Developer-Key: i=brauner@kernel.org; a=openpgp; fpr=4880B8C9BD0E5106FC070F4F7B3C391EFEA93624 Add tests for SO_PEERPIDFD_THREAD. Signed-off-by: Christian Brauner (Amutable) --- tools/testing/selftests/net/af_unix/scm_pidfd.c | 97 +++++++++++++++++++++++++ 1 file changed, 97 insertions(+) diff --git a/tools/testing/selftests/net/af_unix/scm_pidfd.c b/tools/testing/selftests/net/af_unix/scm_pidfd.c index 019c48e1cdcd..bbbd5e7b4fa7 100644 --- a/tools/testing/selftests/net/af_unix/scm_pidfd.c +++ b/tools/testing/selftests/net/af_unix/scm_pidfd.c @@ -32,6 +32,10 @@ #define SO_PASSPIDFD_THREAD 86 #endif +#ifndef SO_PEERPIDFD_THREAD +#define SO_PEERPIDFD_THREAD 87 +#endif + #define CHILD_EXIT_CODE_OK 123 static void child_die() @@ -822,4 +826,97 @@ TEST(scm_pidfd_thread_creds) EXPECT_EQ(ids.pid, info.tgid); } +static void *peer_connect_thread(void *arg) +{ + struct sock_addr *sa = arg; + struct thread_ids ids = { + .pid = getpid(), + .tid = gettid(), + }; + int fd; + char sync; + + fd = socket(AF_UNIX, SOCK_STREAM, 0); + if (fd < 0) + return (void *)1; + + if (connect(fd, (struct sockaddr *)&sa->listen_addr, sa->addrlen)) + return (void *)1; + + if (send(fd, &ids, sizeof(ids), 0) != sizeof(ids)) + return (void *)1; + + /* stay alive until the server has looked at our pidfd */ + if (read(fd, &sync, 1) != 1) + return (void *)1; + + close(fd); + return NULL; +} + +static int peer_pidfd_info(int fd, int optname, struct pidfd_info *info) +{ + int pidfd; + socklen_t len = sizeof(pidfd); + + if (getsockopt(fd, SOL_SOCKET, optname, &pidfd, &len)) { + log_err("getsockopt(SO_PEERPIDFD*)"); + return -1; + } + + info->mask = PIDFD_INFO_PID; + if (ioctl(pidfd, PIDFD_GET_INFO, info)) { + log_err("ioctl(PIDFD_GET_INFO)"); + close(pidfd); + return -1; + } + + close(pidfd); + return 0; +} + +/* SO_PEERPIDFD_THREAD returns a pidfd for the peer's connecting thread. */ +TEST(so_peerpidfd_thread) +{ + struct sock_addr sa; + struct thread_ids ids; + struct pidfd_info info; + pthread_t thread; + void *tret; + int server, cfd; + + server = socket(AF_UNIX, SOCK_STREAM, 0); + ASSERT_LE(0, server); + + fill_sockaddr(&sa, true); + ASSERT_EQ(0, bind(server, (struct sockaddr *)&sa.listen_addr, sa.addrlen)); + ASSERT_EQ(0, listen(server, 1)); + + ASSERT_EQ(0, pthread_create(&thread, NULL, peer_connect_thread, &sa)); + + cfd = accept(server, NULL, NULL); + ASSERT_LE(0, cfd); + + ASSERT_EQ(sizeof(ids), recv(cfd, &ids, sizeof(ids), MSG_WAITALL)); + ASSERT_NE(ids.pid, ids.tid); + + /* SO_PEERPIDFD refers to the peer's thread-group. */ + ASSERT_EQ(0, peer_pidfd_info(cfd, SO_PEERPIDFD, &info)); + EXPECT_EQ(ids.pid, info.pid); + EXPECT_EQ(ids.pid, info.tgid); + + /* SO_PEERPIDFD_THREAD refers to the connecting thread. */ + ASSERT_EQ(0, peer_pidfd_info(cfd, SO_PEERPIDFD_THREAD, &info)); + EXPECT_EQ(ids.tid, info.pid); + EXPECT_EQ(ids.pid, info.tgid); + + /* release the connecting thread */ + ASSERT_EQ(1, write(cfd, "x", 1)); + ASSERT_EQ(0, pthread_join(thread, &tret)); + ASSERT_EQ(NULL, tret); + + close(cfd); + close(server); +} + TEST_HARNESS_MAIN -- 2.53.0