From nobody Wed Oct 8 07:45:45 2025 Received: from smtp-relay-internal-1.canonical.com (smtp-relay-internal-1.canonical.com [185.125.188.123]) (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 A9F4125EFBD for ; Tue, 1 Jul 2025 08:40:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.125.188.123 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751359234; cv=none; b=HckFPSkNkhdtsHJO7lIQbOS4AxqPD5JefpRVakGMAIvzBl2xK+/EFysUtsBfDJVR1WkbvuwNYAUZr/BzOTnwp73kXM/ZNJka0bWzgsKcwQ7TBrYWbj0AJjZvezy0fux4tO5RvS9slQDfTNnBi3fAYNOnQWHntNS7lxpS/oXGtms= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751359234; c=relaxed/simple; bh=Lbn8rzjh7RE6O7oYUHPkiHveEVz+1OAXcJd7WAjkpP4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=IgU2qzuxGjDwsFspDwap8ldbBK0CqVVZm0yQXXoOEnzKbtfAZT0zbaKg+qiGe8X5ifhcK0Uq9ANnXGiqeEKVI8vJb/TgK5WIr/YLFFzCm6s/2fDrA8jtUKcn5KAXayPxSbaz9Mn4nxDxOG8zKBZC6Faych38/8I1gIpiJQIFB7Y= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=canonical.com; spf=pass smtp.mailfrom=canonical.com; dkim=pass (2048-bit key) header.d=canonical.com header.i=@canonical.com header.b=hKeXv3NI; arc=none smtp.client-ip=185.125.188.123 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=canonical.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=canonical.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=canonical.com header.i=@canonical.com header.b="hKeXv3NI" Received: from mail-ej1-f72.google.com (mail-ej1-f72.google.com [209.85.218.72]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by smtp-relay-internal-1.canonical.com (Postfix) with ESMTPS id 71AD63F18C for ; Tue, 1 Jul 2025 08:40:30 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=canonical.com; s=20210705; t=1751359230; bh=d+q77i3nRFEpD8HnFtkd3zMitsksPFCi2UIIvgg4IUI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=hKeXv3NIbN1wUt+k8Kchm0hNeI7/Sk1ukS/Jg0yxd9k61C/Sb5UcgAt1Fj3Ku4TxD umfU8phfDNpHdNxzBUKzmwWbmMssaXRUET4PnA/ikSoWmf9+IbeIcG5OWNd86An54z 91DsuT7zb5ZL+F7OQNwArNP8karyJqWAu2cRpL0u+B34LNbkwAVFz1LXSC7APpYENx BQKra41hsSqVXdEp3tCmuBrSIizu3b2/uHgazd1c6rt5f3I6pule42tJGqZsZ5pYJ+ xEIJxEvnURLSWit7mnic7+tBPtQxvEz0scFBnTtXxGcOt5Ub/gp1dQj+lbd7U9T4y6 KmRPZ4LgmQPLQ== Received: by mail-ej1-f72.google.com with SMTP id a640c23a62f3a-ae3b2630529so23487266b.1 for ; Tue, 01 Jul 2025 01:40:30 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1751359230; x=1751964030; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=d+q77i3nRFEpD8HnFtkd3zMitsksPFCi2UIIvgg4IUI=; b=BBBrT0P6YHO1AiMYQYgutvndXOnZw910Bb34oL+trHQAW2mC28JBQmpuMfIC5YoViT 8CcN1lzXJJY/oSbnrl2LDvRZ3yi5ZZJTocuNZrENuoHTh2uLgQRSTCC2YqF98glpeYuS LHbEQ8Gnlpb9A8Slg1+yglnjUpDngBtbVbJxdI6+3yx/WN16SonHGTjb6HlegtYkYD2K 2U3J3Zsg6Q54uFJCnsb5TXy3Jq3GYfMTBDV4zDBhmU613jSbrPoQSOFbsTlMpdfnDq3b Q5KxiiMFgIZNlPtHDP+hdnwqNqs4sVnvcC/iaQX0yxLV0BlpNeddiMnSi6CXkZnW5iA9 E+lA== X-Forwarded-Encrypted: i=1; AJvYcCVv77HqDfBWht8NlPtG3n7w7DNtkcfQD+rlGeyHRf+FRyb14cZ2bqzcaL6x0WTqYpQmXTubZmDjRQNLZlY=@vger.kernel.org X-Gm-Message-State: AOJu0Ywy32wiv7n29l5YkY8Nml1+PGyCh1yDR+xv+QbmpknN5iaXI3az 0gmYcYino3EcSmaFkLSVEKV+/RapPGSgen9WSKqyF+wF2Qw4DIjU6DhyDSBKx2nD/QkcMmlq0sA kxQsi/4t5sPebo0fQjnSogoXwORxm2S97qUDNxJuh0gYMH0icgbR9VJiLwRPxlOppMIY8tGQelN FNXFJs4Q== X-Gm-Gg: ASbGnctWY/cr+OkiqrPhNALHV6lu3zXaQy7vEuD7vbpIzFNtPL81P7Y9NT5mYJsZR6T I4rs1zTL/hsTMkSpJz4Uix5NhI1IpoM1j564oiLJtgquFtT8M2oCwFe2oi9mem2miv2YXSrrwyf 3YG73vGWgOrlbTBST4eqautBnIlLofYq3rAUXZ5aUYDMtSeYnzQ+sQD0B207uNjBW4zPnLVhdoW 59iFXnCH5fiS/VOqRsNUiY7EiiyDk6uJdFtSjtvEpJWNvm4Hflp2FaYSBw6RJjvbs4cc1APtpsx 1MduMOhMCme7uO7zxDbzIYnHffu8v0qq7t5lABt+qScM+5HdEw== X-Received: by 2002:a17:907:97cb:b0:ade:9b52:4da0 with SMTP id a640c23a62f3a-ae3501a1608mr1429781866b.60.1751359229822; Tue, 01 Jul 2025 01:40:29 -0700 (PDT) X-Google-Smtp-Source: AGHT+IHm38a4fIG5d97STV7PS1v47gd+0RVwmdaJeweffwuD+F/nL2Rv8S9KkYbLtZuIL5p9B+XmPg== X-Received: by 2002:a17:907:97cb:b0:ade:9b52:4da0 with SMTP id a640c23a62f3a-ae3501a1608mr1429778366b.60.1751359229276; Tue, 01 Jul 2025 01:40:29 -0700 (PDT) Received: from amikhalitsyn.lan ([178.24.219.243]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-ae35363b416sm812427166b.28.2025.07.01.01.40.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 01 Jul 2025 01:40:28 -0700 (PDT) From: Alexander Mikhalitsyn To: kuniyu@google.com Cc: Alexander Mikhalitsyn , linux-kernel@vger.kernel.org, netdev@vger.kernel.org, "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Leon Romanovsky , Arnd Bergmann , Christian Brauner , Lennart Poettering , Luca Boccassi , David Rheinsberg Subject: [PATCH net-next v2 1/6] af_unix: rework unix_maybe_add_creds() to allow sleep Date: Tue, 1 Jul 2025 10:39:11 +0200 Message-ID: <20250701083922.97928-3-aleksandr.mikhalitsyn@canonical.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250701083922.97928-1-aleksandr.mikhalitsyn@canonical.com> References: <20250701083922.97928-1-aleksandr.mikhalitsyn@canonical.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" As a preparation for the next patches we need to allow sleeping in unix_maybe_add_creds() and also return err. Currently, we can't do that as unix_maybe_add_creds() is being called under unix_state_lock(). There is no need for this, really. So let's move call sites of this helper a bit and do necessary function signature changes. Cc: linux-kernel@vger.kernel.org Cc: netdev@vger.kernel.org Cc: "David S. Miller" Cc: Eric Dumazet Cc: Jakub Kicinski Cc: Paolo Abeni Cc: Simon Horman Cc: Leon Romanovsky Cc: Arnd Bergmann Cc: Christian Brauner Cc: Kuniyuki Iwashima Cc: Lennart Poettering Cc: Luca Boccassi Cc: David Rheinsberg Signed-off-by: Alexander Mikhalitsyn Reviewed-by: Christian Brauner --- v2: - fixed kdoc for unix_maybe_add_creds() [ thanks to Kuniyuki's review ] --- net/unix/af_unix.c | 32 +++++++++++++++++++++++++------- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c index 129388c309b0..fba50ceab42b 100644 --- a/net/unix/af_unix.c +++ b/net/unix/af_unix.c @@ -1955,21 +1955,30 @@ static int unix_scm_to_skb(struct scm_cookie *scm, = struct sk_buff *skb, bool sen return err; } =20 -/* +/** + * unix_maybe_add_creds() - Adds current task uid/gid and struct pid to sk= b if needed. + * @skb: skb to attach creds to. + * @sk: Sender sock. + * @other: Receiver sock. + * * Some apps rely on write() giving SCM_CREDENTIALS * We include credentials if source or destination socket * asserted SOCK_PASSCRED. + * + * Return: On success zero, on error a negative error code is returned. */ -static void unix_maybe_add_creds(struct sk_buff *skb, const struct sock *s= k, - const struct sock *other) +static int unix_maybe_add_creds(struct sk_buff *skb, const struct sock *sk, + const struct sock *other) { if (UNIXCB(skb).pid) - return; + return 0; =20 if (unix_may_passcred(sk) || unix_may_passcred(other)) { UNIXCB(skb).pid =3D get_pid(task_tgid(current)); current_uid_gid(&UNIXCB(skb).uid, &UNIXCB(skb).gid); } + + return 0; } =20 static bool unix_skb_scm_eq(struct sk_buff *skb, @@ -2104,6 +2113,10 @@ static int unix_dgram_sendmsg(struct socket *sock, s= truct msghdr *msg, goto out_sock_put; } =20 + err =3D unix_maybe_add_creds(skb, sk, other); + if (err) + goto out_sock_put; + restart: sk_locked =3D 0; unix_state_lock(other); @@ -2212,7 +2225,6 @@ static int unix_dgram_sendmsg(struct socket *sock, st= ruct msghdr *msg, if (sock_flag(other, SOCK_RCVTSTAMP)) __net_timestamp(skb); =20 - unix_maybe_add_creds(skb, sk, other); scm_stat_add(other, skb); skb_queue_tail(&other->sk_receive_queue, skb); unix_state_unlock(other); @@ -2256,6 +2268,10 @@ static int queue_oob(struct sock *sk, struct msghdr = *msg, struct sock *other, if (err < 0) goto out; =20 + err =3D unix_maybe_add_creds(skb, sk, other); + if (err) + goto out; + skb_put(skb, 1); err =3D skb_copy_datagram_from_iter(skb, 0, &msg->msg_iter, 1); =20 @@ -2275,7 +2291,6 @@ static int queue_oob(struct sock *sk, struct msghdr *= msg, struct sock *other, goto out_unlock; } =20 - unix_maybe_add_creds(skb, sk, other); scm_stat_add(other, skb); =20 spin_lock(&other->sk_receive_queue.lock); @@ -2369,6 +2384,10 @@ static int unix_stream_sendmsg(struct socket *sock, = struct msghdr *msg, =20 fds_sent =3D true; =20 + err =3D unix_maybe_add_creds(skb, sk, other); + if (err) + goto out_free; + if (unlikely(msg->msg_flags & MSG_SPLICE_PAGES)) { skb->ip_summed =3D CHECKSUM_UNNECESSARY; err =3D skb_splice_from_iter(skb, &msg->msg_iter, size, @@ -2399,7 +2418,6 @@ static int unix_stream_sendmsg(struct socket *sock, s= truct msghdr *msg, goto out_free; } =20 - unix_maybe_add_creds(skb, sk, other); scm_stat_add(other, skb); skb_queue_tail(&other->sk_receive_queue, skb); unix_state_unlock(other); --=20 2.43.0 From nobody Wed Oct 8 07:45:45 2025 Received: from smtp-relay-internal-0.canonical.com (smtp-relay-internal-0.canonical.com [185.125.188.122]) (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 E2CB624503F for ; Tue, 1 Jul 2025 08:40:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.125.188.122 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751359255; cv=none; b=fORFDY3mZuXsbozDfD0Em6bud018wv8bKwMeKmlq2f1fWrRb/4Hs7mOss6odlk6p8x+uCxmQrlGp+4JIh9Caru43eROoE/qRyOVqerxCExSwEFbGTzNrm4LgS+3zy4OcUUKGQWs4/szCZZmXf9OK80oxCdrJuIeLWBhb20/N63E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751359255; c=relaxed/simple; bh=bHvpc94HXYih2FMFgeA+sRP/r2c8MhvpzQoiO5z8z9s=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ZTVlDxvGGTQ9Hwwc9//rswzapqeejI2ChiwDL1dbUqGovMXFKrVp0kx3j2oOOfDKxNhrlIGpdhowBD9Yz+bNee7ercIGqX+pP+IFXhJfaZXg5JfMfUmPzDFKKaY0/UW8CKPhnfW8RGDSRFie/I0H4pASe9P/ujm0MAUczTnMPok= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=canonical.com; spf=pass smtp.mailfrom=canonical.com; dkim=pass (2048-bit key) header.d=canonical.com header.i=@canonical.com header.b=wWZNUGIS; arc=none smtp.client-ip=185.125.188.122 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=canonical.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=canonical.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=canonical.com header.i=@canonical.com header.b="wWZNUGIS" Received: from mail-ej1-f70.google.com (mail-ej1-f70.google.com [209.85.218.70]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by smtp-relay-internal-0.canonical.com (Postfix) with ESMTPS id 0B4723FE1F for ; Tue, 1 Jul 2025 08:40:52 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=canonical.com; s=20210705; t=1751359252; bh=isC54dUAY8UhtPmgzK1RBnnEBnnC6mxj6C9AzalU9ag=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=wWZNUGISf4jsOi2Acc3X4GzxRtSG0z9AAMFMpPMa3QLem2UGzFlRjBneH4c2YFbwA fSUAImIzSPltHKC7EbrxONYFMvqYeCO6D+BE7APOxkZF9htRDYbCYqKQd56pKM04GK DwdR+8lJqIqzOFQgf313XxIbzqUgBvSG3+SHr+Rcd89ekJGH+5jRQ0ymbs7E/T85Pk aGPDhXb21mOXYDgQi9iMEVwrc9uR3ImLLyrlgMOffLkY0zftde3rQrGVFjDRq5c7df cRcULDkCDpK0xeFRE9W7aYIHnQdvcdyE+CLLP9k/31liZwI0sWtJrSCqf8BD/fLgnT VsLZctgOxTHdw== Received: by mail-ej1-f70.google.com with SMTP id a640c23a62f3a-ae37a8f000bso151933366b.0 for ; Tue, 01 Jul 2025 01:40:52 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1751359251; x=1751964051; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=isC54dUAY8UhtPmgzK1RBnnEBnnC6mxj6C9AzalU9ag=; b=BaRrsTcr1VW4YynhLFtJCIHac4KTpOIyvnyKJS5MVg+o1/eP0+2AIkMhq/05noc89N MkZNsTpyfI0wxU2/CvUrgioo7lrupt77BWpwyGNKy1BhZQOR9Gm5M9EoDygvjnOOFf1g sz0eE70vszSxivGxoySCgaif3mD3AV7V3lHrdnkt+2cUNi44f/AH8dLAVQxhD1YSx+po 1zR7mtnDTF0RhRhHJL0dHgly3oCD+JNOJQXRSNGnRp87m64aeqPdXeK/4ilWLIHULrIG aW1E/6b4rHWmaRQxQxBf6zaDTbbGLPjchNp4nvfnVyrl9DKHbWeZuJfCtYWYWdnat0Gt OELQ== X-Forwarded-Encrypted: i=1; AJvYcCVS80c2kesQIB0VN6Tg9yZUqZUiOMi04KP3sGBGjYxR9nEpnGhR5Y1WaD1LaNEaz7vCnPhqwAXLWINnKq0=@vger.kernel.org X-Gm-Message-State: AOJu0YwJl28kolRryuodiArnwnl0cb9maWfkzxxwhK/rvOPSpq+5Gine 5OwMNrPSb0SDFFdgtlQa6TyMiYZDOU1zXtChhJ5QmGLNsGc6MnH7dhSJY/tSp4NfjljD+VMnJVi C4/AKpjlgIh9R8AZM3nMW90SGpnbskLqX/qJdcTWo8Vfsf8y6Nj2L5HpXTZHwls14MMKSPlU7bf Y85ymfCQ== X-Gm-Gg: ASbGncubEbrCEhJ2BQA1Ivj4d8vni6L3v1V0gDeUsP8gYi64/o8D+EdfIzUdTa2/agx /wyzpEY5jGpOf5cgoHZQrr7/26BiyUKigTC24U4UqxAR+0xXb5Bwem0jsfsMCWzWraRM+VNqPa1 DB5h8VpmfV9NHVyhrrkS6u9Evp74/XGzabNpzURc4gYVeQziYUtE9i/+BIec9vzB3cLkZADmvZb bvH1YLoro6qbowzlNfGWDAVo9W/UEQt8cqjK/EX8wTqhJowckJiWsUZaOxoKloTmhxZujeX8JGO FnuYTwzt1OYodEwJZvFi42drrxx6hF0httkFBCvk5g2ZXIcDwg== X-Received: by 2002:a17:907:1c0e:b0:ae3:8c9b:bd64 with SMTP id a640c23a62f3a-ae38c9bc02cmr913626966b.29.1751359251430; Tue, 01 Jul 2025 01:40:51 -0700 (PDT) X-Google-Smtp-Source: AGHT+IH9IOjQfHIhysscWrtfEdQ+J9BlfvEQTu1lLk5fVoZ7wydBDYyGcWaFaf5++ub1XyOVdcY+6g== X-Received: by 2002:a17:907:1c0e:b0:ae3:8c9b:bd64 with SMTP id a640c23a62f3a-ae38c9bc02cmr913624666b.29.1751359250996; Tue, 01 Jul 2025 01:40:50 -0700 (PDT) Received: from amikhalitsyn.lan ([178.24.219.243]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-ae35363b416sm812427166b.28.2025.07.01.01.40.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 01 Jul 2025 01:40:50 -0700 (PDT) From: Alexander Mikhalitsyn To: kuniyu@google.com Cc: Alexander Mikhalitsyn , linux-kernel@vger.kernel.org, netdev@vger.kernel.org, "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Leon Romanovsky , Arnd Bergmann , Christian Brauner , Lennart Poettering , Luca Boccassi , David Rheinsberg Subject: [PATCH net-next v2 2/6] af_unix: introduce unix_skb_to_scm helper Date: Tue, 1 Jul 2025 10:39:13 +0200 Message-ID: <20250701083922.97928-5-aleksandr.mikhalitsyn@canonical.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250701083922.97928-1-aleksandr.mikhalitsyn@canonical.com> References: <20250701083922.97928-1-aleksandr.mikhalitsyn@canonical.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Instead of open-coding let's consolidate this logic in a separate helper. This will simplify further changes. Cc: linux-kernel@vger.kernel.org Cc: netdev@vger.kernel.org Cc: "David S. Miller" Cc: Eric Dumazet Cc: Jakub Kicinski Cc: Paolo Abeni Cc: Simon Horman Cc: Leon Romanovsky Cc: Arnd Bergmann Cc: Christian Brauner Cc: Kuniyuki Iwashima Cc: Lennart Poettering Cc: Luca Boccassi Cc: David Rheinsberg Signed-off-by: Alexander Mikhalitsyn Reviewed-by: Kuniyuki Iwashima Reviewed-by: Christian Brauner --- net/unix/af_unix.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c index fba50ceab42b..df2174d9904d 100644 --- a/net/unix/af_unix.c +++ b/net/unix/af_unix.c @@ -1955,6 +1955,12 @@ static int unix_scm_to_skb(struct scm_cookie *scm, s= truct sk_buff *skb, bool sen return err; } =20 +static void unix_skb_to_scm(struct sk_buff *skb, struct scm_cookie *scm) +{ + scm_set_cred(scm, UNIXCB(skb).pid, UNIXCB(skb).uid, UNIXCB(skb).gid); + unix_set_secdata(scm, skb); +} + /** * unix_maybe_add_creds() - Adds current task uid/gid and struct pid to sk= b if needed. * @skb: skb to attach creds to. @@ -2565,8 +2571,7 @@ int __unix_dgram_recvmsg(struct sock *sk, struct msgh= dr *msg, size_t size, =20 memset(&scm, 0, sizeof(scm)); =20 - scm_set_cred(&scm, UNIXCB(skb).pid, UNIXCB(skb).uid, UNIXCB(skb).gid); - unix_set_secdata(&scm, skb); + unix_skb_to_scm(skb, &scm); =20 if (!(flags & MSG_PEEK)) { if (UNIXCB(skb).fp) @@ -2951,8 +2956,7 @@ static int unix_stream_read_generic(struct unix_strea= m_read_state *state, break; } else if (unix_may_passcred(sk)) { /* Copy credentials */ - scm_set_cred(&scm, UNIXCB(skb).pid, UNIXCB(skb).uid, UNIXCB(skb).gid); - unix_set_secdata(&scm, skb); + unix_skb_to_scm(skb, &scm); check_creds =3D true; } =20 --=20 2.43.0 From nobody Wed Oct 8 07:45:45 2025 Received: from smtp-relay-internal-1.canonical.com (smtp-relay-internal-1.canonical.com [185.125.188.123]) (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 5361B26B740 for ; Tue, 1 Jul 2025 08:41:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.125.188.123 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751359273; cv=none; b=QlQm9AXpskv9yO9dyvYj5Lypo/wO7LkfavtA0+s8knXxnzMRIkHkTRiFa2GoHh7Qu2Juyd0erbuqGhkpP2gR/aa8gnDnWmPURc1ez77ndFeuowvZSDu6US6BApRHdOfWeqwWiyYjm6SBQ90mxq5lQIgNtmw15aZ5yc4O1g6jAyU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751359273; c=relaxed/simple; bh=+sMr3wZCfdlUWMneZGOreaseAAkc+23zMJM5ICDMpeg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=OjY1tjM2g+WgSb84Nlv+BnYYLaz8ST4+pVHgkCxDEWuynirjVQpvLD8+En3FVIjuP20bJDoi5R/deiBl7Pq43Wb5d6m9dMMX/gFUD1Hhg8mHDcWsUgTvkQUQFB/IoR9APXqsSbfagWQiPcR2nL0csS3vmZALMcSAGS5Sy+9P+As= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=canonical.com; spf=pass smtp.mailfrom=canonical.com; dkim=pass (2048-bit key) header.d=canonical.com header.i=@canonical.com header.b=wGp+weWF; arc=none smtp.client-ip=185.125.188.123 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=canonical.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=canonical.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=canonical.com header.i=@canonical.com header.b="wGp+weWF" Received: from mail-ej1-f70.google.com (mail-ej1-f70.google.com [209.85.218.70]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by smtp-relay-internal-1.canonical.com (Postfix) with ESMTPS id 5DCCB3F91D for ; Tue, 1 Jul 2025 08:41:10 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=canonical.com; s=20210705; t=1751359270; bh=7R6rS2KkskS84A736qIaYQIuu8ODnigBZBalat5fXfs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=wGp+weWFWS1rVvecGxPfw27CCBLMJ7awFd9vu9ZiidPrarP/T3jFJ9xeLZ7DBsVRS vGa2UsBui05TeekZjH984b8S1t1pon9JykxCp2xR1vIaBNjEW3YzUKIanyKygUygf/ dBXifNP0+MJAwcIv7Lv7FcEFHihZP1NZxv7QMlMcHzB5OyaTGkTs9ARdybykHcx6fE j4Bzn4KakaVoXCQ3OxdXZEqUbkMaMz0CIXSIeQWHqSOMQHamlCRjzxdrZEymPiIEc6 kWlfZiO6oYqmwqaZQ4IAeWFiNsBBAewdCflCiErh7SBw6abobtJ1Rxuh6HwzbbvZkD T0WgAg1mch4lQ== Received: by mail-ej1-f70.google.com with SMTP id a640c23a62f3a-ade6db50b98so267270766b.0 for ; Tue, 01 Jul 2025 01:41:10 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1751359266; x=1751964066; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=7R6rS2KkskS84A736qIaYQIuu8ODnigBZBalat5fXfs=; b=WzPSzn19vhuEKzLgvfT9WCnjcxiFF3OS6xk8sf1LfEfe3zNddQA/G3EHi0lPDyKBHM +OlT8OGm96bBtOWvjbPjkqpSzagt3ve+0cM8PjAC8T5im+is2x2bhY+R24kI346SCRQa Ty0ebNXRvRNTApK0/+PC8lUF24keuxaK8AbfeM83tNK9foeSGapGF5yvuUJQr/v5ScoQ lRzBKHLPouv3vGyjSj62KD7+1+lpJKofHcpW2XERWjBY0WO8BDxrracXwakPe/pysbmX Rc1OM20P17krwtga2SyrwHDh8qFys97WIA/G3r2zDuC9JXIojHT+rUQM0SyrzJVR9KY3 u7CQ== X-Forwarded-Encrypted: i=1; AJvYcCU0Zz8WMmLoJv5VBwJp9wDcFcvjtbIy7evt4STxisGG9kaJ3LipKbA/e8I6epgiZdOS60YvHhm/CaWoCf4=@vger.kernel.org X-Gm-Message-State: AOJu0Yw5GtOvzzq2Pd9Q/c7mUN473MZCNBht82ApkG6ZU5QUm02KRZ8Y 8nARR2RgA0oikiAex/XqP57l5U/ocvUsUZuY4GmtipiX6maEOaE2GgVUSAoS/sn9M2ZRIBowvw/ cJgOPOE3TCjyZbPnC1fWQANAWnx79J0uAR151QtoxwRiAS8vOZ2/RQX28IzH8uQwOQSGjqaIiB7 Hr7quNXw== X-Gm-Gg: ASbGncuSAHDDVYs2VkB0JGkz3en5LZ6jiF3G+spwl6AMUyl50RJXYf+iinLk2C4VhNW dtFK2TVi2xJFHvdOFYOHOyCHUgABIEW8qzeV+bojSjlg+omtCtiJVXzAMl/BwP1uhnQC7zEJzhE +66sx40vpeevsK7AHCWknNoaMcszb1XGTsSSm4ktCtCXw1d4GTt7rCCTghOcRbluCmNdqHSEJpM bwxBhC0XwNzo3OHz/xT4g/dVTgGoYohbcMza7XqAm+jxZDneurtHwAeMenodjipPIEV7DHTBxgA P/awT+cCqyeYgMkdYehcMt+eXAublZAmCw35M5bkdkCkymy/wg== X-Received: by 2002:a17:907:1c1d:b0:ad8:9257:5724 with SMTP id a640c23a62f3a-ae34fede1f3mr1555850866b.24.1751359266301; Tue, 01 Jul 2025 01:41:06 -0700 (PDT) X-Google-Smtp-Source: AGHT+IHaxWqS0edeNnSzlYF7Upe9kcBqlFQjGh4bLnX05mhxtBxNtyIBKe65cIfpFwUWnDOoa0N5LQ== X-Received: by 2002:a17:907:1c1d:b0:ad8:9257:5724 with SMTP id a640c23a62f3a-ae34fede1f3mr1555848466b.24.1751359265842; Tue, 01 Jul 2025 01:41:05 -0700 (PDT) Received: from amikhalitsyn.lan ([178.24.219.243]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-ae35363b416sm812427166b.28.2025.07.01.01.41.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 01 Jul 2025 01:41:05 -0700 (PDT) From: Alexander Mikhalitsyn To: kuniyu@google.com Cc: Alexander Mikhalitsyn , linux-kernel@vger.kernel.org, netdev@vger.kernel.org, "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Willem de Bruijn , Leon Romanovsky , Arnd Bergmann , Christian Brauner , Lennart Poettering , Luca Boccassi , David Rheinsberg Subject: [PATCH net-next v2 3/6] af_unix: introduce and use __scm_replace_pid() helper Date: Tue, 1 Jul 2025 10:39:15 +0200 Message-ID: <20250701083922.97928-7-aleksandr.mikhalitsyn@canonical.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250701083922.97928-1-aleksandr.mikhalitsyn@canonical.com> References: <20250701083922.97928-1-aleksandr.mikhalitsyn@canonical.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Existing logic in __scm_send() related to filling an struct scm_cookie with a proper struct pid reference is already pretty tricky. Let's simplify it a bit by introducing a new helper. This helper will be extended in one of the next patches. Cc: linux-kernel@vger.kernel.org Cc: netdev@vger.kernel.org Cc: "David S. Miller" Cc: Eric Dumazet Cc: Jakub Kicinski Cc: Paolo Abeni Cc: Simon Horman Cc: Willem de Bruijn Cc: Leon Romanovsky Cc: Arnd Bergmann Cc: Christian Brauner Cc: Kuniyuki Iwashima Cc: Lennart Poettering Cc: Luca Boccassi Cc: David Rheinsberg Signed-off-by: Alexander Mikhalitsyn --- v2: - don't do get_pid() in __scm_replace_pid() [ as Kuniyuki suggested ] - move __scm_replace_pid() from scm.h to scm.c [ as Kuniyuki suggested ] --- net/core/scm.c | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/net/core/scm.c b/net/core/scm.c index 0225bd94170f..68441c024dd8 100644 --- a/net/core/scm.c +++ b/net/core/scm.c @@ -145,6 +145,16 @@ void __scm_destroy(struct scm_cookie *scm) } EXPORT_SYMBOL(__scm_destroy); =20 +static inline int __scm_replace_pid(struct scm_cookie *scm, struct pid *pi= d) +{ + /* drop all previous references */ + scm_destroy_cred(scm); + + scm->pid =3D pid; + scm->creds.pid =3D pid_vnr(pid); + return 0; +} + int __scm_send(struct socket *sock, struct msghdr *msg, struct scm_cookie = *p) { const struct proto_ops *ops =3D READ_ONCE(sock->ops); @@ -189,15 +199,21 @@ int __scm_send(struct socket *sock, struct msghdr *ms= g, struct scm_cookie *p) if (err) goto error; =20 - p->creds.pid =3D creds.pid; if (!p->pid || pid_vnr(p->pid) !=3D creds.pid) { struct pid *pid; err =3D -ESRCH; pid =3D find_get_pid(creds.pid); if (!pid) goto error; - put_pid(p->pid); - p->pid =3D pid; + + /* pass a struct pid reference from + * find_get_pid() to __scm_replace_pid(). + */ + err =3D __scm_replace_pid(p, pid); + if (err) { + put_pid(pid); + goto error; + } } =20 err =3D -EINVAL; --=20 2.43.0 From nobody Wed Oct 8 07:45:45 2025 Received: from smtp-relay-internal-0.canonical.com (smtp-relay-internal-0.canonical.com [185.125.188.122]) (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 2C6C926A1CD for ; Tue, 1 Jul 2025 08:41:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.125.188.122 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751359283; cv=none; b=q5373mGI6DKF1oO0Z34SPAwP8WGo0vp857d+CWaUHrSfVBWgjdXUPnisrhjc8aW7P4CG7XHRyIskw/O/TMwQ2ZAGzcts4yhkS9PpSMue0EE9EQvjuM1UNO7EG03mFUeK9jGQatdut0WNDXp36ne/LRxVGgv8dStPCsjx7Uu1PdM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751359283; c=relaxed/simple; bh=0akAzRxqSABVbwmPSbSZyQpcu7BC6CCroLhbO1qikaI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=R8BTUa+najpvry/mfIt9pkzHwLOIzWM4HKtu6wcxDO6MyQTOUMXW2TqMcxD+sJ7C159Y9Mh6SZCBLfvPUZuMxeRqEtsifK0fnQ1iWg7jkVCLBk7Ls6AoalvgU9sT3vEKe4Mage6Sh+QAlCi/GFiXKCfDTPSPcmdNyUXPoh5YNzs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=canonical.com; spf=pass smtp.mailfrom=canonical.com; dkim=pass (2048-bit key) header.d=canonical.com header.i=@canonical.com header.b=jOwu7N7P; arc=none smtp.client-ip=185.125.188.122 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=canonical.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=canonical.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=canonical.com header.i=@canonical.com header.b="jOwu7N7P" Received: from mail-ej1-f69.google.com (mail-ej1-f69.google.com [209.85.218.69]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by smtp-relay-internal-0.canonical.com (Postfix) with ESMTPS id 8BA473FE1F for ; Tue, 1 Jul 2025 08:41:19 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=canonical.com; s=20210705; t=1751359279; bh=6bRqWysSzHy3p2i0Lb/Op5tY8kYpY7PeuWK0tpwD9t4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=jOwu7N7PKYhRnSqNoRoIiq0nTzm134ezHpMyYsXT5jkOyDZJ0TlSJcQlj+L9h+Dg2 eYVmsWMWYO3Azqxo+DqBnK0fpDWZdvtRrifjZmxsr3T9YqgqSESYDgk3ACoAZYVG+K NxnCo6h7/3EXbzRBJ4vv7mQgfipWz9g9aJHLYLNeNHtPiXKGF1uJ9Ezf1fcN1JQLmr FtbP9gtt67cTSiIHp1IMPX1fpEismFKhMGc4Lo8JC+zMDzF6JZM+Z81i8is/KWx7Ka iOhpSaNX5KNqp2FPFZoBjh3o7wHrBw5P8WlqrInTWk6IYCwfyZywwlFr2+1+yp2qSj ZzXy6zTrj3tJA== Received: by mail-ej1-f69.google.com with SMTP id a640c23a62f3a-ade5b98537dso275686766b.2 for ; Tue, 01 Jul 2025 01:41:19 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1751359279; x=1751964079; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=6bRqWysSzHy3p2i0Lb/Op5tY8kYpY7PeuWK0tpwD9t4=; b=ANWX8aeQX92p3X/CHY43KhrZuF3VVSsJ9EaV4UEYE347zPu9Sowz8vVRwnFi7Kx/1b oywTc0hYEkQ0Towj7fT+kuu0E1rBLDXREnXl4GvPVp1RRG77fYsBkxvFDHaKJi5WO7wm NbR/yOXv/PHT4QkVJC/wP53MV49zL0+WikpJ8qJAJSaVhJiu0RSZRqhwI0H2pXnaNRe9 Tlf8xqIsmIYP4HuyThvKQF14N6Fw3ZM4ce1eRmXDIaL4HA7i8X6PnBvoc7XDswUDrMdm AfPKdbeNG8tvpDsewEtZPSP//WPYiOojO0jlAxECwSmnQ26qDnOcnwmgBpLEYGpo2TIv 5VkQ== X-Forwarded-Encrypted: i=1; AJvYcCXiUMNhS6K5o6ntNsSqUWsVFjJPrqfhhIxgxmB0aPQBCOAFVED5jSLypFQxYEKO9m8q45R70teiLkcZnlQ=@vger.kernel.org X-Gm-Message-State: AOJu0YybJ4G3McRzBF0BsuUFdXTrf2afocMmraOPl/VzTpDr3p4Esmf+ LcuvjGMbHC3ReL7NoAKPuBhbwdAHjTlw3I/zoVDLoODTZYpDeGp2Z+uZ9gE11NRj9OgSd/7vdMt TIxF3TNpEA2Wsxs13kV+0kyY/RCJIP9tGgaAmJ/eCP/Waepvz29pZ+Eq3MvItyUi1LYfh5PGp4Z 6WQoLGmQ== X-Gm-Gg: ASbGncv2Auq4irsc8htyMArVRfJLA9MC0SvqepGwMD/cuemrr6NpZcrgiOgY8Bk8ACL o07NBLnpFgIyWonhnOoeLDlCyA44j4bi0gmgxEbBZrzMZYvk464KP062t3chItpFyi/WxdHXU/i yd5slpyvL+10u1GKjAJ0ApuxUFvSnXbOiZytu6CKjb3QLmzZaIxKAXROpP4g1mL0jcy++4RGrN7 dP/hk4W6+JIfGYyiwTeJixsstwR9ImqFVlT+xtbmNEla2SgFuWGZ3/Mvc0J+EWkbq7TncGsnQfM LEJsVfLrpKSTMcbjdvwg9qyPDN5RjOsfmONqNKga56+JXAFStQ== X-Received: by 2002:a17:906:d7d8:b0:ae0:ce59:5952 with SMTP id a640c23a62f3a-ae35022a01fmr1393446566b.60.1751359278855; Tue, 01 Jul 2025 01:41:18 -0700 (PDT) X-Google-Smtp-Source: AGHT+IFVSKnOX/bJZRqAewogJx3Ti3Do04ydXpz2fF9gVxLvqDFndxPHqMizto+aqZ+cPRud7HQo1w== X-Received: by 2002:a17:906:d7d8:b0:ae0:ce59:5952 with SMTP id a640c23a62f3a-ae35022a01fmr1393443866b.60.1751359278381; Tue, 01 Jul 2025 01:41:18 -0700 (PDT) Received: from amikhalitsyn.lan ([178.24.219.243]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-ae35363b416sm812427166b.28.2025.07.01.01.41.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 01 Jul 2025 01:41:17 -0700 (PDT) From: Alexander Mikhalitsyn To: kuniyu@google.com Cc: Alexander Mikhalitsyn , linux-kernel@vger.kernel.org, netdev@vger.kernel.org, "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Leon Romanovsky , Arnd Bergmann , Christian Brauner , Lennart Poettering , Luca Boccassi , David Rheinsberg , Willem de Bruijn Subject: [PATCH net-next v2 4/6] af_unix: stash pidfs dentry when needed Date: Tue, 1 Jul 2025 10:39:17 +0200 Message-ID: <20250701083922.97928-9-aleksandr.mikhalitsyn@canonical.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250701083922.97928-1-aleksandr.mikhalitsyn@canonical.com> References: <20250701083922.97928-1-aleksandr.mikhalitsyn@canonical.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" We need to ensure that pidfs dentry is allocated when we meet any struct pid for the first time. This will allows us to open pidfd even after the task it corresponds to is reaped. Basically, we need to identify all places where we fill skb/scm_cookie with struct pid reference for the first time and call pidfs_register_pid(). Tricky thing here is that we have a few places where this happends depending on what userspace is doing: - [__scm_replace_pid()] explicitly sending an SCM_CREDENTIALS message and specified pid in a numeric format - [unix_maybe_add_creds()] enabled SO_PASSCRED/SO_PASSPIDFD but didn't send SCM_CREDENTIALS explicitly - [scm_send()] force_creds is true. Netlink case. Cc: linux-kernel@vger.kernel.org Cc: netdev@vger.kernel.org Cc: "David S. Miller" Cc: Eric Dumazet Cc: Jakub Kicinski Cc: Paolo Abeni Cc: Simon Horman Cc: Leon Romanovsky Cc: Arnd Bergmann Cc: Christian Brauner Cc: Kuniyuki Iwashima Cc: Lennart Poettering Cc: Luca Boccassi Cc: David Rheinsberg Signed-off-by: Alexander Mikhalitsyn --- v2: - renamed __skb_set_pid() -> unix_set_pid_to_skb() [ as Kuniyuki suggested= ] - get rid of extra helper (__scm_set_cred()) I've introduced before [ as K= uniyuki suggested ] - s/__inline__/inline/ for functions I touched [ as Kuniyuki suggested ] - get rid of chunk in unix_destruct_scm() with NULLifying UNIXCB(skb).pid = [ as Kuniyuki suggested ] - added proper error handling in scm_send() for scm_set_cred() return valu= e [ found by me during rework ] --- include/net/scm.h | 32 ++++++++++++++++++++++++-------- net/core/scm.c | 6 ++++++ net/unix/af_unix.c | 33 +++++++++++++++++++++++++++++---- 3 files changed, 59 insertions(+), 12 deletions(-) diff --git a/include/net/scm.h b/include/net/scm.h index 84c4707e78a5..597a40779269 100644 --- a/include/net/scm.h +++ b/include/net/scm.h @@ -8,6 +8,7 @@ #include #include #include +#include #include #include #include @@ -66,19 +67,28 @@ static __inline__ void unix_get_peersec_dgram(struct so= cket *sock, struct scm_co { } #endif /* CONFIG_SECURITY_NETWORK */ =20 -static __inline__ void scm_set_cred(struct scm_cookie *scm, - struct pid *pid, kuid_t uid, kgid_t gid) +static inline int scm_set_cred(struct scm_cookie *scm, + struct pid *pid, bool pidfs_register, + kuid_t uid, kgid_t gid) { - scm->pid =3D get_pid(pid); + if (pidfs_register) { + int err =3D pidfs_register_pid(pid); + if (err) + return err; + } + + scm->pid =3D get_pid(pid); + scm->creds.pid =3D pid_vnr(pid); scm->creds.uid =3D uid; scm->creds.gid =3D gid; + return 0; } =20 static __inline__ void scm_destroy_cred(struct scm_cookie *scm) { put_pid(scm->pid); - scm->pid =3D NULL; + scm->pid =3D NULL; } =20 static __inline__ void scm_destroy(struct scm_cookie *scm) @@ -88,14 +98,20 @@ static __inline__ void scm_destroy(struct scm_cookie *s= cm) __scm_destroy(scm); } =20 -static __inline__ int scm_send(struct socket *sock, struct msghdr *msg, - struct scm_cookie *scm, bool forcecreds) +static inline int scm_send(struct socket *sock, struct msghdr *msg, + struct scm_cookie *scm, bool forcecreds) { memset(scm, 0, sizeof(*scm)); scm->creds.uid =3D INVALID_UID; scm->creds.gid =3D INVALID_GID; - if (forcecreds) - scm_set_cred(scm, task_tgid(current), current_uid(), current_gid()); + + if (forcecreds) { + int err =3D scm_set_cred(scm, task_tgid(current), true, + current_uid(), current_gid()); + if (err) + return err; + } + unix_get_peersec_dgram(sock, scm); if (msg->msg_controllen <=3D 0) return 0; diff --git a/net/core/scm.c b/net/core/scm.c index 68441c024dd8..50dfec6f8a2b 100644 --- a/net/core/scm.c +++ b/net/core/scm.c @@ -147,9 +147,15 @@ EXPORT_SYMBOL(__scm_destroy); =20 static inline int __scm_replace_pid(struct scm_cookie *scm, struct pid *pi= d) { + int err; + /* drop all previous references */ scm_destroy_cred(scm); =20 + err =3D pidfs_register_pid(pid); + if (err) + return err; + scm->pid =3D pid; scm->creds.pid =3D pid_vnr(pid); return 0; diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c index df2174d9904d..18c677683ddc 100644 --- a/net/unix/af_unix.c +++ b/net/unix/af_unix.c @@ -1924,12 +1924,27 @@ static void unix_peek_fds(struct scm_cookie *scm, s= truct sk_buff *skb) scm->fp =3D scm_fp_dup(UNIXCB(skb).fp); } =20 +static int unix_set_pid_to_skb(struct sk_buff *skb, struct pid *pid, bool = pidfs_register) +{ + if (pidfs_register) { + int err; + + err =3D pidfs_register_pid(pid); + if (err) + return err; + } + + UNIXCB(skb).pid =3D get_pid(pid); + return 0; +} + static void unix_destruct_scm(struct sk_buff *skb) { struct scm_cookie scm; =20 memset(&scm, 0, sizeof(scm)); - scm.pid =3D UNIXCB(skb).pid; + scm.pid =3D UNIXCB(skb).pid; + if (UNIXCB(skb).fp) unix_detach_fds(&scm, skb); =20 @@ -1943,7 +1958,10 @@ static int unix_scm_to_skb(struct scm_cookie *scm, s= truct sk_buff *skb, bool sen { int err =3D 0; =20 - UNIXCB(skb).pid =3D get_pid(scm->pid); + err =3D unix_set_pid_to_skb(skb, scm->pid, false); + if (unlikely(err)) + return err; + UNIXCB(skb).uid =3D scm->creds.uid; UNIXCB(skb).gid =3D scm->creds.gid; UNIXCB(skb).fp =3D NULL; @@ -1957,7 +1975,8 @@ static int unix_scm_to_skb(struct scm_cookie *scm, st= ruct sk_buff *skb, bool sen =20 static void unix_skb_to_scm(struct sk_buff *skb, struct scm_cookie *scm) { - scm_set_cred(scm, UNIXCB(skb).pid, UNIXCB(skb).uid, UNIXCB(skb).gid); + /* scm_set_cred() can't fail when pidfs_register =3D=3D false */ + scm_set_cred(scm, UNIXCB(skb).pid, false, UNIXCB(skb).uid, UNIXCB(skb).gi= d); unix_set_secdata(scm, skb); } =20 @@ -1971,6 +1990,7 @@ static void unix_skb_to_scm(struct sk_buff *skb, stru= ct scm_cookie *scm) * We include credentials if source or destination socket * asserted SOCK_PASSCRED. * + * Context: May sleep. * Return: On success zero, on error a negative error code is returned. */ static int unix_maybe_add_creds(struct sk_buff *skb, const struct sock *sk, @@ -1980,7 +2000,12 @@ static int unix_maybe_add_creds(struct sk_buff *skb,= const struct sock *sk, return 0; =20 if (unix_may_passcred(sk) || unix_may_passcred(other)) { - UNIXCB(skb).pid =3D get_pid(task_tgid(current)); + int err; + + err =3D unix_set_pid_to_skb(skb, task_tgid(current), true); + if (unlikely(err)) + return err; + current_uid_gid(&UNIXCB(skb).uid, &UNIXCB(skb).gid); } =20 --=20 2.43.0 From nobody Wed Oct 8 07:45:45 2025 Received: from smtp-relay-internal-1.canonical.com (smtp-relay-internal-1.canonical.com [185.125.188.123]) (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 7AC9126B744 for ; Tue, 1 Jul 2025 08:41:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.125.188.123 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751359299; cv=none; b=P/IPr/Hm19rVJxii7WX7ucwzt12j6fRVIPSpAuLcTR7dbTHr+wR5pLKUlL37CY6PRAZZRKVwvi1wdE5XXlf6prAUNTX/I1IpzoCYyzY2P/1gXu5+SbF+izHd3z5H3f5t0JHEvN+Dfh9FhA7oj7EJQoomB105XvScV+iUzN+A0IQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751359299; c=relaxed/simple; bh=1nHyGmrpv5FF3xysV/SpLweCV2NUJ2mNgDUauaWEkfI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ZJSIauHD188cSNmW0gZQeDt7QOd2yNu6sCXTUZZ5coNt6BQnEGHsKAwGMe0vdOWPykBW5jhGllfSsSXkmNdSExC4NzRnmg3JGb4upKLw4x5RuQYpIgDDtThGY/CITig25/dYzXVpm/pWORRIGJS6cJYGr8IA1L+cHOMmJyys5w4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=canonical.com; spf=pass smtp.mailfrom=canonical.com; dkim=pass (2048-bit key) header.d=canonical.com header.i=@canonical.com header.b=pzZ8SLb2; arc=none smtp.client-ip=185.125.188.123 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=canonical.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=canonical.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=canonical.com header.i=@canonical.com header.b="pzZ8SLb2" Received: from mail-ej1-f69.google.com (mail-ej1-f69.google.com [209.85.218.69]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by smtp-relay-internal-1.canonical.com (Postfix) with ESMTPS id B01753F18C for ; Tue, 1 Jul 2025 08:41:33 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=canonical.com; s=20210705; t=1751359293; bh=Z9pX1VfTmwVxaOGXavGK5NoBC/cEjdayNk20LrQfJuk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=pzZ8SLb24Q9tdEBgAJ8EbeKQeakKTVhwhJnbkSc3azIdI9YuAaOgrgjnjj3sKBhRH 0XQXg57tpQ3PCohEV0KOAu7ajPJKxadMC4H6dHt/lujqoygbAa9YxWnvZ+3nfy9ht4 ke9+RUPS3EfCP5gCt6lxVqwl+vMS+ezh6KpnxGgPG1dq4EuZpv5tudA1T2NH/Ae+0S guZEo7xS9+3FfPIn3SwkOXX/7UQaiBffEi8IiQR8knKqFsMFggj7CswjgSZnRDbrvs Qk8mQrPJPAOrS3C13M+pZNjz3s0uVuF9/2JS+x7wvDxRHQusxgJgL27kMAh+ZtlZ22 KHyr1Wu+yxDKg== Received: by mail-ej1-f69.google.com with SMTP id a640c23a62f3a-ad56a52edc5so466398766b.0 for ; Tue, 01 Jul 2025 01:41:33 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1751359293; x=1751964093; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Z9pX1VfTmwVxaOGXavGK5NoBC/cEjdayNk20LrQfJuk=; b=OqjitDM98Z2HFwe0lU2B0OTXg4BnuBqqnLGSkJb9+gM9MkVQrZmoY9FJZDazPIdWwF Wn+cEfEGbQs/fUPvEWeQgcX426MGF+BhZI8oguwRltLCHPhbcUdjqk531EWduoL5B26q T/4qbTS5yzvd75g+wcfQKtW8xQVQX4+7+HDsQOQkt/XvbEHiz03Gs1SaodLo+liKltr0 gzySu+qb2V8qS4GIL5WPx8lM2wLSXFnfC/swvAaD+jbsgYT/Bbyh4UJaK1PFaiNKxt1k fg/vRcYdcufnztvwfNTy2m/b5AAEccUfDY+LNeK79UtjO/XPY/AQhkU3/RUsgHc+pXub HStg== X-Forwarded-Encrypted: i=1; AJvYcCVHQdFpsyKjQD8us2eQ7itcqzcnTNLzWXJX11sieKMnGV24xeXMaqejRTqf65xIYPb1FZVmUIEN7584ucw=@vger.kernel.org X-Gm-Message-State: AOJu0Yx6+r0zDn9KdgBosjJp5/qqBbJxuPGCWwyU4RKBarreB4LuM5sB s8FobbzgAx2+/Llfe5OKZ+zrZpuQJptnocj8+FkAFc889y1yQpb9BJhO7dxwoYWwTbsy22I4r9A patRfpDVJ+ziZHGW3RwWjHPpqp1GnwTe++dzCIW3Qo+EoTd3PyKCNCFHd6e6tj/sJXnv5yM2/cK TkIDnNxQ== X-Gm-Gg: ASbGncvpaLngqJ8lZ/SU1cF4IsxSY6ApAAqOxQX4raXSEH0TL7JJEeN61DX2MbSSeVE ljgAOAS+8Zntl+kv80JZMHYZme4dYg+/nRio3sazXyFOYGmENkEAw6hq3LGYLLZIgUzm9rkZPm1 d/MNXPQETEae4df5ZQqToU6uhVeI1VPPukl14n7xL2Yj5jr90y/rhbQD/Z+njuEDrHl0pFqiwql GmNHZsKvB6rN5ArumPMkImfHNS9GysKUIZLXRkvmya5sxw3bEVrFoJ4M4vE79+ie97lQx9iMCnY ioZ27VSqsYXMUr7KC1vYxfs27ez0OhPB7MdsCoOl25tiWlwsPg== X-Received: by 2002:a17:906:6a13:b0:ae0:de4a:3153 with SMTP id a640c23a62f3a-ae3501097c6mr1607050766b.38.1751359293118; Tue, 01 Jul 2025 01:41:33 -0700 (PDT) X-Google-Smtp-Source: AGHT+IHHYz6ade5ZUSuNmyvh/iYMmaOMtSfZC8fihJvxErHxG7jEJstf0bxN2jhvBPbeKySrJFBTJA== X-Received: by 2002:a17:906:6a13:b0:ae0:de4a:3153 with SMTP id a640c23a62f3a-ae3501097c6mr1607047266b.38.1751359292577; Tue, 01 Jul 2025 01:41:32 -0700 (PDT) Received: from amikhalitsyn.lan ([178.24.219.243]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-ae35363b416sm812427166b.28.2025.07.01.01.41.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 01 Jul 2025 01:41:32 -0700 (PDT) From: Alexander Mikhalitsyn To: kuniyu@google.com Cc: Alexander Mikhalitsyn , linux-kernel@vger.kernel.org, netdev@vger.kernel.org, "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Willem de Bruijn , Leon Romanovsky , Arnd Bergmann , Christian Brauner , Lennart Poettering , Luca Boccassi , David Rheinsberg Subject: [PATCH net-next v2 5/6] af_unix: enable handing out pidfds for reaped tasks in SCM_PIDFD Date: Tue, 1 Jul 2025 10:39:19 +0200 Message-ID: <20250701083922.97928-11-aleksandr.mikhalitsyn@canonical.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250701083922.97928-1-aleksandr.mikhalitsyn@canonical.com> References: <20250701083922.97928-1-aleksandr.mikhalitsyn@canonical.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Now everything is ready to pass PIDFD_STALE to pidfd_prepare(). This will allow opening pidfd for reaped tasks. Cc: linux-kernel@vger.kernel.org Cc: netdev@vger.kernel.org Cc: "David S. Miller" Cc: Eric Dumazet Cc: Jakub Kicinski Cc: Paolo Abeni Cc: Simon Horman Cc: Willem de Bruijn Cc: Leon Romanovsky Cc: Arnd Bergmann Cc: Christian Brauner Cc: Kuniyuki Iwashima Cc: Lennart Poettering Cc: Luca Boccassi Cc: David Rheinsberg Signed-off-by: Alexander Mikhalitsyn Reviewed-by: Christian Brauner --- include/net/scm.h | 1 + net/core/scm.c | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/include/net/scm.h b/include/net/scm.h index 597a40779269..288b4861cc68 100644 --- a/include/net/scm.h +++ b/include/net/scm.h @@ -8,6 +8,7 @@ #include #include #include +#include #include #include #include diff --git a/net/core/scm.c b/net/core/scm.c index 50dfec6f8a2b..69e7e0f6390e 100644 --- a/net/core/scm.c +++ b/net/core/scm.c @@ -481,7 +481,7 @@ static void scm_pidfd_recv(struct msghdr *msg, struct s= cm_cookie *scm) if (!scm->pid) return; =20 - pidfd =3D pidfd_prepare(scm->pid, 0, &pidfd_file); + pidfd =3D pidfd_prepare(scm->pid, PIDFD_STALE, &pidfd_file); =20 if (put_cmsg(msg, SOL_SOCKET, SCM_PIDFD, sizeof(int), &pidfd)) { if (pidfd_file) { --=20 2.43.0 From nobody Wed Oct 8 07:45:45 2025 Received: from smtp-relay-internal-0.canonical.com (smtp-relay-internal-0.canonical.com [185.125.188.122]) (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 2828E25C6EC for ; Tue, 1 Jul 2025 08:41:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.125.188.122 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751359312; cv=none; b=ZF8lieoPzxWPyrlgr+jy5TbfycORNMNd/YAMH+WDICVhCqNdfCTquuu8qiD5iIBiU0XuGW4QdP7Hv2U3C08RD0fs0jz98TGJlgAmS6MI8T7uf8nd6IJWap9tbNf5bt+mWgnB0Vs655aqt4qb1vK1z0gYd2TyDNFihfVY2FF8/ng= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751359312; c=relaxed/simple; bh=sNMgYuRRHDM5tU1JOzxhsMgU93et6+sqxnzyafhvyOg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Jas6PIUJBf2DHC/Rgb5PigY14kaunavD1AeY+h10M4tRgEOMVhNhUOa5ocR48Bz8QCTTcjSBWpYYWMcxMtLr8cb2SxkZ0hlAZSc6hIqskAw4ksH5gaPD/4iu93EdSj13ZgUcG5jYv17BA+Nt5Sy1+5AFd11wAiSJOmyIvB7mNGI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=canonical.com; spf=pass smtp.mailfrom=canonical.com; dkim=pass (2048-bit key) header.d=canonical.com header.i=@canonical.com header.b=kM0G5mz2; arc=none smtp.client-ip=185.125.188.122 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=canonical.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=canonical.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=canonical.com header.i=@canonical.com header.b="kM0G5mz2" Received: from mail-ej1-f71.google.com (mail-ej1-f71.google.com [209.85.218.71]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by smtp-relay-internal-0.canonical.com (Postfix) with ESMTPS id AAF073FE20 for ; Tue, 1 Jul 2025 08:41:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=canonical.com; s=20210705; t=1751359309; bh=3ACJj1pibTp1hDCcnssHwfTz2N2iBLhUH85nRukXflM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=kM0G5mz2pMxPJB5zRYHp+KjnQrbo9HDrLRCBOZDY2uSJtTn7j8F89HOgjjMuePkqA Cz0k/w1CZ4Rq9ZTdYuCl/Tau8xNEewyQCfjMJOSfXlb/ZXs6DVHBUBP10n+3cWV8WS bg3GBvNX+FdwxVISGElXIOiyf7FMUpmBOB9HfPjU2CHhEiLbYMFZ6sf2AybK5JFUeH yXkZvOVpQ4QkS85LfdS4Pfo5pNBpWn/wd83LgBL0UfQwu8g61CabIRwVRYp0H7Ay6H UR7HRjhykX4iX9XYvPKQ5WjV6/Hms98woqgEMB1E1Ym3jkvt+0W3lFV00TdD6YoP7O OK6rARG2nN8DA== Received: by mail-ej1-f71.google.com with SMTP id a640c23a62f3a-ade81d27cddso521477466b.0 for ; Tue, 01 Jul 2025 01:41:49 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1751359309; x=1751964109; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=3ACJj1pibTp1hDCcnssHwfTz2N2iBLhUH85nRukXflM=; b=gkOIdxQped/Llv9IGvjYQFQjB8XqLPw/MMsei3KQNAKwEIQVDWyJ+7TI+jlsGUpp7a FEdYN2clAP2o571okZQruuewcTLBJZRaeLrW6l9Xd0puUSp+MiM/qkD7LYmbFk6U4u+P kBrl3Szf+VybqiGK2nYM2FAk3rplvNjvQTOFgwMfnGVHDbY+BP2RWyH+kNsSlR9aR+rF XTc2pHXsCe6/UuU/6n84MJbdSmEhRRnEwfAdizq5qgZFbVxpkYku/XPDLwY903VsJURO HERsLP1gDK6wV/osjAEyrnXh5Ftw7ZxjIpiG9+jGb4SGYfxTrULJ/DLweqtmilwRx8AS 0gSQ== X-Forwarded-Encrypted: i=1; AJvYcCWaEnkKGsehP7OXj7zgSHKoWfHzn6mc9dBDb1Pnu+Bp9ckLNhZUCfeQ3iDCr1kAQgEBr58FWWyiDNO85Io=@vger.kernel.org X-Gm-Message-State: AOJu0YwGALqnfE40BEfdAlGpOOwmpannwi7Aesew0/f+WJ5rvUWQ+wtP sVFk1zsLJoO4CeTc55nS2Jjl70sGr2t3YVPMg8O6Rv0q/60o+tUyqAqpFUOGaYlQGh66unr5jm9 S+l/uCqvuxxyGadmL2Np/kEIG6O3rwUVmuxKacbvOjPfgli0PJKhr8i9B7G/34j4bonIcA+LwfT WPRKya0g== X-Gm-Gg: ASbGncvjWfaTwJ7V/gU8En2/us+DBM8hXNKJ3Bgg0io58BxycxyMO9U98Sd3jEe7iMi aNF3E5H9PPFHqlGKrWmf7XqHP51JcRPxkTHw9vtDZOnlcXfP+VDSy13Z8Y5Ja400YkEKHpQ0xeP MLRMXjymh0oBeckedgrTU0nrsXwDd0Vf0X74MJ93Ik+QMeXgNrlukYTqd9RJ+2oqCyolzI+cY3A 2MtJIB1eR9oKWfO3QO67n23wZKtqXHo4OilbDwWc1jp0J5UiNliSk5ajPGlfBodr/3kaQd/Baho Ybm/WjQawjUrVtGF2CWh5uwYespAT3fKjuzPEHe9I+98gJeZKg== X-Received: by 2002:a17:907:d2c8:b0:ae3:b654:165b with SMTP id a640c23a62f3a-ae3b6542a2bmr37281866b.24.1751359309008; Tue, 01 Jul 2025 01:41:49 -0700 (PDT) X-Google-Smtp-Source: AGHT+IGPvyXkJ7xxlUFVfvGUBKe1qmn9gYzE1YPTdbDiV+whqqCBKDQi+KNw6Dqm3Yw3xYlwRh9jZg== X-Received: by 2002:a17:907:d2c8:b0:ae3:b654:165b with SMTP id a640c23a62f3a-ae3b6542a2bmr37278266b.24.1751359308447; Tue, 01 Jul 2025 01:41:48 -0700 (PDT) Received: from amikhalitsyn.lan ([178.24.219.243]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-ae35363b416sm812427166b.28.2025.07.01.01.41.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 01 Jul 2025 01:41:48 -0700 (PDT) From: Alexander Mikhalitsyn To: kuniyu@google.com Cc: Alexander Mikhalitsyn , linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org, netdev@vger.kernel.org, Shuah Khan , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Christian Brauner , Lennart Poettering , Luca Boccassi , David Rheinsberg Subject: [PATCH net-next v2 6/6] selftests: net: extend SCM_PIDFD test to cover stale pidfds Date: Tue, 1 Jul 2025 10:39:21 +0200 Message-ID: <20250701083922.97928-13-aleksandr.mikhalitsyn@canonical.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250701083922.97928-1-aleksandr.mikhalitsyn@canonical.com> References: <20250701083922.97928-1-aleksandr.mikhalitsyn@canonical.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Extend SCM_PIDFD test scenarios to also cover dead task's pidfd retrieval and reading its exit info. Cc: linux-kselftest@vger.kernel.org Cc: linux-kernel@vger.kernel.org Cc: netdev@vger.kernel.org Cc: Shuah Khan Cc: "David S. Miller" Cc: Eric Dumazet Cc: Jakub Kicinski Cc: Paolo Abeni Cc: Simon Horman Cc: Christian Brauner Cc: Kuniyuki Iwashima Cc: Lennart Poettering Cc: Luca Boccassi Cc: David Rheinsberg Signed-off-by: Alexander Mikhalitsyn Reviewed-by: Christian Brauner --- .../testing/selftests/net/af_unix/scm_pidfd.c | 217 ++++++++++++++---- 1 file changed, 173 insertions(+), 44 deletions(-) diff --git a/tools/testing/selftests/net/af_unix/scm_pidfd.c b/tools/testin= g/selftests/net/af_unix/scm_pidfd.c index 7e534594167e..37e034874034 100644 --- a/tools/testing/selftests/net/af_unix/scm_pidfd.c +++ b/tools/testing/selftests/net/af_unix/scm_pidfd.c @@ -15,6 +15,7 @@ #include #include =20 +#include "../../pidfd/pidfd.h" #include "../../kselftest_harness.h" =20 #define clean_errno() (errno =3D=3D 0 ? "None" : strerror(errno)) @@ -26,6 +27,8 @@ #define SCM_PIDFD 0x04 #endif =20 +#define CHILD_EXIT_CODE_OK 123 + static void child_die() { exit(1); @@ -126,16 +129,65 @@ static pid_t get_pid_from_fdinfo_file(int pidfd, cons= t char *key, size_t keylen) return result; } =20 +struct cmsg_data { + struct ucred *ucred; + int *pidfd; +}; + +static int parse_cmsg(struct msghdr *msg, struct cmsg_data *res) +{ + struct cmsghdr *cmsg; + int data =3D 0; + + if (msg->msg_flags & (MSG_TRUNC | MSG_CTRUNC)) { + log_err("recvmsg: truncated"); + return 1; + } + + for (cmsg =3D CMSG_FIRSTHDR(msg); cmsg !=3D NULL; + cmsg =3D CMSG_NXTHDR(msg, cmsg)) { + if (cmsg->cmsg_level =3D=3D SOL_SOCKET && + cmsg->cmsg_type =3D=3D SCM_PIDFD) { + if (cmsg->cmsg_len < sizeof(*res->pidfd)) { + log_err("CMSG parse: SCM_PIDFD wrong len"); + return 1; + } + + res->pidfd =3D (void *)CMSG_DATA(cmsg); + } + + if (cmsg->cmsg_level =3D=3D SOL_SOCKET && + cmsg->cmsg_type =3D=3D SCM_CREDENTIALS) { + if (cmsg->cmsg_len < sizeof(*res->ucred)) { + log_err("CMSG parse: SCM_CREDENTIALS wrong len"); + return 1; + } + + res->ucred =3D (void *)CMSG_DATA(cmsg); + } + } + + if (!res->pidfd) { + log_err("CMSG parse: SCM_PIDFD not found"); + return 1; + } + + if (!res->ucred) { + log_err("CMSG parse: SCM_CREDENTIALS not found"); + return 1; + } + + return 0; +} + static int cmsg_check(int fd) { struct msghdr msg =3D { 0 }; - struct cmsghdr *cmsg; + struct cmsg_data res; struct iovec iov; - struct ucred *ucred =3D NULL; int data =3D 0; char control[CMSG_SPACE(sizeof(struct ucred)) + CMSG_SPACE(sizeof(int))] =3D { 0 }; - int *pidfd =3D NULL; pid_t parent_pid; int err; =20 @@ -158,53 +210,99 @@ static int cmsg_check(int fd) return 1; } =20 - for (cmsg =3D CMSG_FIRSTHDR(&msg); cmsg !=3D NULL; - cmsg =3D CMSG_NXTHDR(&msg, cmsg)) { - if (cmsg->cmsg_level =3D=3D SOL_SOCKET && - cmsg->cmsg_type =3D=3D SCM_PIDFD) { - if (cmsg->cmsg_len < sizeof(*pidfd)) { - log_err("CMSG parse: SCM_PIDFD wrong len"); - return 1; - } + /* send(pfd, "x", sizeof(char), 0) */ + if (data !=3D 'x') { + log_err("recvmsg: data corruption"); + return 1; + } =20 - pidfd =3D (void *)CMSG_DATA(cmsg); - } + if (parse_cmsg(&msg, &res)) { + log_err("CMSG parse: parse_cmsg() failed"); + return 1; + } =20 - if (cmsg->cmsg_level =3D=3D SOL_SOCKET && - cmsg->cmsg_type =3D=3D SCM_CREDENTIALS) { - if (cmsg->cmsg_len < sizeof(*ucred)) { - log_err("CMSG parse: SCM_CREDENTIALS wrong len"); - return 1; - } + /* pidfd from SCM_PIDFD should point to the parent process PID */ + parent_pid =3D + get_pid_from_fdinfo_file(*res.pidfd, "Pid:", sizeof("Pid:") - 1); + if (parent_pid !=3D getppid()) { + log_err("wrong SCM_PIDFD %d !=3D %d", parent_pid, getppid()); + close(*res.pidfd); + return 1; + } =20 - ucred =3D (void *)CMSG_DATA(cmsg); - } + close(*res.pidfd); + return 0; +} + +static int cmsg_check_dead(int fd, int expected_pid) +{ + int err; + struct msghdr msg =3D { 0 }; + struct cmsg_data res; + struct iovec iov; + int data =3D 0; + char control[CMSG_SPACE(sizeof(struct ucred)) + + CMSG_SPACE(sizeof(int))] =3D { 0 }; + pid_t client_pid; + struct pidfd_info info =3D { + .mask =3D PIDFD_INFO_EXIT, + }; + + iov.iov_base =3D &data; + iov.iov_len =3D sizeof(data); + + msg.msg_iov =3D &iov; + msg.msg_iovlen =3D 1; + msg.msg_control =3D control; + msg.msg_controllen =3D sizeof(control); + + err =3D recvmsg(fd, &msg, 0); + if (err < 0) { + log_err("recvmsg"); + return 1; } =20 - /* send(pfd, "x", sizeof(char), 0) */ - if (data !=3D 'x') { + if (msg.msg_flags & (MSG_TRUNC | MSG_CTRUNC)) { + log_err("recvmsg: truncated"); + return 1; + } + + /* send(cfd, "y", sizeof(char), 0) */ + if (data !=3D 'y') { log_err("recvmsg: data corruption"); return 1; } =20 - if (!pidfd) { - log_err("CMSG parse: SCM_PIDFD not found"); + if (parse_cmsg(&msg, &res)) { + log_err("CMSG parse: parse_cmsg() failed"); return 1; } =20 - if (!ucred) { - log_err("CMSG parse: SCM_CREDENTIALS not found"); + /* + * pidfd from SCM_PIDFD should point to the client_pid. + * Let's read exit information and check if it's what + * we expect to see. + */ + if (ioctl(*res.pidfd, PIDFD_GET_INFO, &info)) { + log_err("%s: ioctl(PIDFD_GET_INFO) failed", __func__); + close(*res.pidfd); return 1; } =20 - /* pidfd from SCM_PIDFD should point to the parent process PID */ - parent_pid =3D - get_pid_from_fdinfo_file(*pidfd, "Pid:", sizeof("Pid:") - 1); - if (parent_pid !=3D getppid()) { - log_err("wrong SCM_PIDFD %d !=3D %d", parent_pid, getppid()); + if (!(info.mask & PIDFD_INFO_EXIT)) { + log_err("%s: No exit information from ioctl(PIDFD_GET_INFO)", __func__); + close(*res.pidfd); return 1; } =20 + err =3D WIFEXITED(info.exit_code) ? WEXITSTATUS(info.exit_code) : 1; + if (err !=3D CHILD_EXIT_CODE_OK) { + log_err("%s: wrong exit_code %d !=3D %d", __func__, err, CHILD_EXIT_CODE= _OK); + close(*res.pidfd); + return 1; + } + + close(*res.pidfd); return 0; } =20 @@ -291,6 +389,24 @@ static void fill_sockaddr(struct sock_addr *addr, bool= abstract) memcpy(sun_path_buf, addr->sock_name, strlen(addr->sock_name)); } =20 +static int sk_enable_cred_pass(int sk) +{ + int on =3D 0; + + on =3D 1; + if (setsockopt(sk, SOL_SOCKET, SO_PASSCRED, &on, sizeof(on))) { + log_err("Failed to set SO_PASSCRED"); + return 1; + } + + if (setsockopt(sk, SOL_SOCKET, SO_PASSPIDFD, &on, sizeof(on))) { + log_err("Failed to set SO_PASSPIDFD"); + return 1; + } + + return 0; +} + static void client(FIXTURE_DATA(scm_pidfd) *self, const FIXTURE_VARIANT(scm_pidfd) *variant) { @@ -299,7 +415,6 @@ static void client(FIXTURE_DATA(scm_pidfd) *self, struct ucred peer_cred; int peer_pidfd; pid_t peer_pid; - int on =3D 0; =20 cfd =3D socket(AF_UNIX, variant->type, 0); if (cfd < 0) { @@ -322,14 +437,8 @@ static void client(FIXTURE_DATA(scm_pidfd) *self, child_die(); } =20 - on =3D 1; - if (setsockopt(cfd, SOL_SOCKET, SO_PASSCRED, &on, sizeof(on))) { - log_err("Failed to set SO_PASSCRED"); - child_die(); - } - - if (setsockopt(cfd, SOL_SOCKET, SO_PASSPIDFD, &on, sizeof(on))) { - log_err("Failed to set SO_PASSPIDFD"); + if (sk_enable_cred_pass(cfd)) { + log_err("sk_enable_cred_pass() failed"); child_die(); } =20 @@ -340,6 +449,12 @@ static void client(FIXTURE_DATA(scm_pidfd) *self, child_die(); } =20 + /* send something to the parent so it can receive SCM_PIDFD too and valid= ate it */ + if (send(cfd, "y", sizeof(char), 0) =3D=3D -1) { + log_err("Failed to send(cfd, \"y\", sizeof(char), 0)"); + child_die(); + } + /* skip further for SOCK_DGRAM as it's not applicable */ if (variant->type =3D=3D SOCK_DGRAM) return; @@ -398,7 +513,13 @@ TEST_F(scm_pidfd, test) close(self->server); close(self->startup_pipe[0]); client(self, variant); - exit(0); + + /* + * It's a bit unusual, but in case of success we return non-zero + * exit code (CHILD_EXIT_CODE_OK) and then we expect to read it + * from ioctl(PIDFD_GET_INFO) in cmsg_check_dead(). + */ + exit(CHILD_EXIT_CODE_OK); } close(self->startup_pipe[1]); =20 @@ -421,9 +542,17 @@ TEST_F(scm_pidfd, test) ASSERT_NE(-1, err); } =20 - close(pfd); waitpid(self->client_pid, &child_status, 0); - ASSERT_EQ(0, WIFEXITED(child_status) ? WEXITSTATUS(child_status) : 1); + /* see comment before exit(CHILD_EXIT_CODE_OK) */ + ASSERT_EQ(CHILD_EXIT_CODE_OK, WIFEXITED(child_status) ? WEXITSTATUS(child= _status) : 1); + + err =3D sk_enable_cred_pass(pfd); + ASSERT_EQ(0, err); + + err =3D cmsg_check_dead(pfd, self->client_pid); + ASSERT_EQ(0, err); + + close(pfd); } =20 TEST_HARNESS_MAIN --=20 2.43.0