From nobody Wed Oct 8 10:03:00 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 69F8F2417FB for ; Sun, 29 Jun 2025 21:45:03 +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=1751233505; cv=none; b=IVMOuDFV/07o/LGpWQeP6roz0R9j3TY3IDq1QuqVUmKcw6iTuMPns98L/YkcSFNEH2QxCB1stXX/ytkU40WeixGRyH0EFgVozl2NrYWgycPScUaA8YxuPWMWj6LzV5mOGEBoVRtxcDl333bXnH7mR2GXWoFY21IkkPFyiZQoO5s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751233505; c=relaxed/simple; bh=EifaHAoAApf7q/Mkx9Mw3DETHvUJ2q8UmDQ+dVcocek=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=sa4tm/OYVdYLipW5vcnvIute56O+3Ao4W+Pd8VK2T7sctPfcocf3/Mng4hpe69/IrDG2gSXQkBHB8Pa38SM+zGoqWAqFaILk7NP9g2znOQeyQ9p/cNoxH2Rj033FzYNT5sgsJ+MttIGOxx+eus2rkbKY4HG093MU92fv9aExtFw= 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=r8M1vDd1; 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="r8M1vDd1" Received: from mail-ed1-f70.google.com (mail-ed1-f70.google.com [209.85.208.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 AF0AD3F1F0 for ; Sun, 29 Jun 2025 21:45:00 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=canonical.com; s=20210705; t=1751233500; bh=G60zTzgwmIGQw3RA46ispul5I6p3fmOYvxZfvnCsXEE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=r8M1vDd1cwJ0yuDvn+mYozcvUXOhKixhfo2U7q6/fkVNXvULmP9FmEDyPEfjn+MI6 Zzg1bW6Oif2IObcV49xUEbgqCzaN24HAqM1L01o3xgj2YUoNQd/adgagUqa4Z6RFBs jzK7lRs7fixLE/HYoaEbm0rFfFvA05ahPYPOkxwW0cskxNIeWQ+vUtHw8o8JtoNST8 JMhRKGtQcgfVnqinmEZls4ht1ofq7WgIJ0lM+U53I2IlonvD+wHiQ4urZJSDebrW9k D4I6XkisBMzLvc0Uetwuk51JUTa+pMGgRNHdFsn8k2tAlUPCn2u9tWoY3uOW11n1L+ MOukzNPqf1ZaA== Received: by mail-ed1-f70.google.com with SMTP id 4fb4d7f45d1cf-6077833ae13so2800752a12.1 for ; Sun, 29 Jun 2025 14:45:00 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1751233500; x=1751838300; 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=G60zTzgwmIGQw3RA46ispul5I6p3fmOYvxZfvnCsXEE=; b=MNtTZMasydIA1SXq6Kxt/UqBe+qUyquukm8fSCSvotPMHExtCyXEaugt2NHTsK59Em VTaAszyzBv9zOAcwfuc30vEr55LTr7O2/8tVuVN0e1E/dtmBy3c4TpVBjsJQFVMTmj8t Ah1xt7qZQpNDDDTklbK5UPgDn94a08KMS2W+k1dJppZBWzaXjAjMGXrtfdDLicr06/Uq 8xhTDrugpbWC3ngq6uGSrm3M8lLlf6UCHMueVRh4GzA8ZyQHOacnk4cMwXK9iD/MQmb1 e26e2gSDUg2RsrZ33cHwCVDpIa/CXHRik7JmWZvF6QfKpmHlglGPSkbTzT2YgTBYC0+r Bk0g== X-Forwarded-Encrypted: i=1; AJvYcCVYZRu3+xTvH/7ln8NRZc14rtWLGEriKFXvLuG5jM1IdmhqfeAkxYojmWs163pBgjSN8QxVXMfOubg4vW8=@vger.kernel.org X-Gm-Message-State: AOJu0Yw009mMJNABEUCAt0HE198mNcx1Zxv3OHFrd2+Jz9zaiKW97cvF 7xawQgBn+gJqIm2tv8y6xAg0n1H1hq0zvGVWYa9o1nbifT4E/RK7jFmt8ekRF/SQKVq35God2GN N3kBdTvof423pNNNsX7s++PrPMnv87U0TDK82kwGbT6qVLjnxMgqSth2OZukCHMZnSCphEhYx50 MafFB3Gw== X-Gm-Gg: ASbGncuSK748uGMzT+wCbUc8beaG56TwiSLfAZRUapb+sUkrOYaRLZ0BbpsAY4IEnLM FAVUMSTmc+lhd6XsBCJFaWPiXuJ49j9TVxjnz1luDM7De6hGGBi8g0HHJ2VaiqgZ/FeR+veyK7a OCenQVO5rRfo0ce0jkFEKU2HCtQUBZ9QFePcUxj4NMyE26uRpskY6+gjvwxyDx0IX2Mum7AkDAf F7wCWYK2Z5uVepUXHlyegx1knYPNJHdDrzuPr/ZOa1SDDBaVf7c9OdpY2MLiLd6Tx0+HLBHr/3N lzN0HtaGVoyeXEzkLPqOinJPXNk9MIVAQRxmx9u4Z7nNOhQOIw== X-Received: by 2002:a05:6402:2101:b0:60c:4bc0:453e with SMTP id 4fb4d7f45d1cf-60c88b38471mr8622085a12.2.1751233500224; Sun, 29 Jun 2025 14:45:00 -0700 (PDT) X-Google-Smtp-Source: AGHT+IH2xPyY82dEZPtNOjLLgnJHoQ4Iup9xB3PZexu/WprfMu8neYWm8eCcLIXuCERFbcQhVsIVLg== X-Received: by 2002:a05:6402:2101:b0:60c:4bc0:453e with SMTP id 4fb4d7f45d1cf-60c88b38471mr8622063a12.2.1751233499849; Sun, 29 Jun 2025 14:44:59 -0700 (PDT) Received: from amikhalitsyn.lan ([178.24.219.243]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-60c828e1a96sm4712037a12.19.2025.06.29.14.44.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 29 Jun 2025 14:44:58 -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 , Kuniyuki Iwashima Subject: [RESEND PATCH net-next 1/6] af_unix: rework unix_maybe_add_creds() to allow sleep Date: Sun, 29 Jun 2025 23:44:38 +0200 Message-ID: <20250629214449.14462-2-aleksandr.mikhalitsyn@canonical.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250629214449.14462-1-aleksandr.mikhalitsyn@canonical.com> References: <20250629214449.14462-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 --- net/unix/af_unix.c | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c index 129388c309b0..6072d89ce2e7 100644 --- a/net/unix/af_unix.c +++ b/net/unix/af_unix.c @@ -1955,21 +1955,26 @@ 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 skb = if needed. + * * Some apps rely on write() giving SCM_CREDENTIALS * We include credentials if source or destination socket * asserted SOCK_PASSCRED. + * + * Context: May sleep. */ -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 +2109,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 +2221,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 +2264,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 +2287,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 +2380,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 +2414,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 10:03:00 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 0A32722FE08 for ; Sun, 29 Jun 2025 21:45:05 +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=1751233506; cv=none; b=JjQBBtO/LNE6PRJ9pi+rwiEn6y7lBHyD+rj6MCOpplLTftIa2CRCaTsE+81Sd2/JmH+s3Y5PRnIGnKkzM85Co3oeHm+WI2W4T4/6nt2rdYcyyDRKPkNtTfBJQ72CE2AI2hrC6kaWkBOZLtUmaiFSunOIXo2l5W9VuTJamqPESO8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751233506; c=relaxed/simple; bh=TdHSpDKAJsP8MFQsAqAYBhsn02nXa3EymYXhSGpLXcs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=FzT797/NwOR54IEiUZ4SVh+G7VCqD29HUyw921VTmZhvDS8LDcwTfYYUQ7eW9UsVS33JeAomdQMMeqYjkL/N4oMSw4A9rRnuKScOcBN/H3VysOS4pFLwVjQQCdWtP2Aw057Dk9wyuJhfWbS2aUjOOdyEZJa27SMK5/s1YpDGxyg= 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=ib8FcY9L; 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="ib8FcY9L" Received: from mail-ed1-f72.google.com (mail-ed1-f72.google.com [209.85.208.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-0.canonical.com (Postfix) with ESMTPS id BA4BC3FE23 for ; Sun, 29 Jun 2025 21:45:03 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=canonical.com; s=20210705; t=1751233503; bh=RRIGUpCZvKb+B8PoLoEDlD3ZTey+s+col6Ou5XQorys=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ib8FcY9LDB6r8xJmLsqlDQ2VH0mSEV/lkzmkyx3PUrXedfVByrfFjfmuiCw0DpEgH rswxTmi//57Kc4oTpEvJU+hXMHZEiKs/vcbX8q2dQ7HIPNCR5IVbLc/O/Z1O7pH9x8 qoGTAm9wXOkOpEGsCnf6L1h+stwg4Lpmxm6TLxquC5jo52cxqoBp+OxjYwZefQ852f YGnfcWVWN1mT6Y2zlKuzqSekGxYgTLDAbu/CzFRbJ+/vqp2uSw8qIUUDYxmRgpV5B7 yiBR5UuMVGK4MSK9zxHfjp3Vv9rNyZukSvOGdT6XQ/pO4h7moj9qZq9M3aSwSdFvpu 1T8uV+h5P/LmQ== Received: by mail-ed1-f72.google.com with SMTP id 4fb4d7f45d1cf-607142010bcso990940a12.0 for ; Sun, 29 Jun 2025 14:45:03 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1751233503; x=1751838303; 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=RRIGUpCZvKb+B8PoLoEDlD3ZTey+s+col6Ou5XQorys=; b=cdj1VKeLUSYjg7wg7U57zLGP0QOW7qbxyMv7+2isQ+t/H78BahQGadXKzVLQt3JaLz /UB+pEzN152CssXwGnRISYkTwBFV/ZzJlgWW2c6II+PlDTZJVan/HhbqvZF7+OzYYn/e /b67EJh0G9RiAdSssjhP1glI975ouUKVOkV1rUOVvE/fqO5xSm7J0Ykhxv4CFHkBJBUK MvKnZogarFfWP94BM0Enu2JYRpxA1oZG8llCCwXWVLiRHsUGnxUGA3xuFt8/0Mpcdt8v 3AGFZFsl3fjPIvKQpWgMtUd2oYQ94dhxJRBcsF5FTP1HiWJIFL7QTfPVQf1xKkl2Znnv p+fw== X-Forwarded-Encrypted: i=1; AJvYcCXr6FRU+FZ4NLc8SsrAUgWo7krxt/nwaKWRqQXAcIvi8pSiNDsY6U3cBGLCIKnXqRDZRFiE3kEX4cn3Gi4=@vger.kernel.org X-Gm-Message-State: AOJu0YztUzFraFTjuX2i9IdAMPak3kaValaiJ3yIi9aFFAVCEvVfuw7Q Cd9seIqRnfEAGJUr/oMBOQW65CA/RnLqnjd1oIPD89qs09YcW3EUS1M0z1KcfPLF0KjFF0qqoPa DkTo44F6AV0aoEf9uv/TLn+SPIisls9go07dETMFm2/xf3ZOjMoRN94Pr/6DRRKqzkHiIrWpLmY acYoImaw== X-Gm-Gg: ASbGncv69PA2P4rZZUw0gY5PuT/PUl5jY/oF+YDxTmGk29gKHrfBjYUir8GuItOSDYg fWOFgpcoP5Ukk9uq6LTv0yhid9kFmFVwkFPMOFXpNeZ0eMztVBYDMJCtSONTaN441EKxM+SDmJ9 g1at0D2vuTbJFQsDpgHIsBKrxyo+IxPIlImOIDh/l93p0Npag4tQ++8/hmgbMwm17GorAu8Hpjg 37oKa52t1TLKvnSltGOTvLXsRjBzFwRFv91s4afW8xjIgEKsz4H9guRKhO6Lc5AKaWuGkJujTCe 0nnnk3+9BEWrklkP8fZdVkjUwDKiTN1JKpYKhwM+D4EYCMwliA== X-Received: by 2002:a05:6402:5192:b0:604:e6fb:e2e1 with SMTP id 4fb4d7f45d1cf-60c88e8ea14mr9052239a12.33.1751233503127; Sun, 29 Jun 2025 14:45:03 -0700 (PDT) X-Google-Smtp-Source: AGHT+IH9xBDB9NgljSr2Dmn9+gkgZzFKRns66Vls9DnddU65DI4e8vmYDTMY48hrh5jBiTpMmnrXjQ== X-Received: by 2002:a05:6402:5192:b0:604:e6fb:e2e1 with SMTP id 4fb4d7f45d1cf-60c88e8ea14mr9052222a12.33.1751233502705; Sun, 29 Jun 2025 14:45:02 -0700 (PDT) Received: from amikhalitsyn.lan ([178.24.219.243]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-60c828e1a96sm4712037a12.19.2025.06.29.14.45.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 29 Jun 2025 14:45:02 -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 , Kuniyuki Iwashima Subject: [RESEND PATCH net-next 2/6] af_unix: introduce unix_skb_to_scm helper Date: Sun, 29 Jun 2025 23:44:39 +0200 Message-ID: <20250629214449.14462-3-aleksandr.mikhalitsyn@canonical.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250629214449.14462-1-aleksandr.mikhalitsyn@canonical.com> References: <20250629214449.14462-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: Christian Brauner Reviewed-by: Kuniyuki Iwashima --- 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 6072d89ce2e7..5efe6e44abdf 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 skb = if needed. * * Some apps rely on write() giving SCM_CREDENTIALS @@ -2561,8 +2567,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) @@ -2947,8 +2952,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 10:03:00 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 1A556242900 for ; Sun, 29 Jun 2025 21:45:07 +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=1751233509; cv=none; b=JAQqdrIsde/Pse9rE5QWAMcmh4PfFza6epXofsRd7z58B4SdLK7ruf+w82gonI6w+WPNn/nojADn6h+ssOX+Hbf75E7ZoHUAOCFD+XDONHFmW1QQHanGY6cmu/KOoeRqCwY1WmJF/xz7looDoy7IAcgNczUUVxmK29gIm7nT04M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751233509; c=relaxed/simple; bh=VRa2MsmaJdr/14P5DkDEck3hvc0gsQ2yKcWjIECRYOo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=EWoFNwbzKTFZTui/ui5ITyzDhfBNr9MNkOfCC9tpcLdtwbrXShHphaL1T2+T0284Y5ScbJo8JO+wGSPICKqB3gwRqmhDCHM489rJqSG+WTU6tQnN1XmRxsC0dh5Hq3d7eF2Xou4wPJFSYc/GxPTG4vXFbmLtgdSam0uGsnvxyRA= 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=g13Ckl3y; 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="g13Ckl3y" Received: from mail-ed1-f71.google.com (mail-ed1-f71.google.com [209.85.208.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 907073FE1F for ; Sun, 29 Jun 2025 21:45:06 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=canonical.com; s=20210705; t=1751233506; bh=JxsSezFVcVddszGhnOOW8/cd5yQH/kkJ8Bo6svEZqIk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=g13Ckl3yXk/yG1GIG/l5vtMT800ZmLndClnzpB10hdCp3DJLctwjT2yRDHga7UYcd D5YhjcTd8IcLYXUJNfSnL/j7IlJI+y66+AuRSi90HFQfflYAAFPt9xG/ZIZFSsg5Ig Z3G7n0P+oLuPYLYvRawqz3k4pzX+aLqqHThDknpxmMkLWjsH3BtQtWMl29ZGVI7iWo TTIV9lw7LRWvizLMVCtzv5EDaZ3jT6FwR1cWhLW2muJ9QdCV3QUECuVnIJ+nLJdat1 lxHgervzeRIxZGMLpPPCYQ1c0BIdJvgisBeoHBxgURj3SjXDG+7dzguLlspGz9bdYF D69YTFuMsVLGQ== Received: by mail-ed1-f71.google.com with SMTP id 4fb4d7f45d1cf-60c9d8a169cso1338067a12.0 for ; Sun, 29 Jun 2025 14:45:06 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1751233506; x=1751838306; 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=JxsSezFVcVddszGhnOOW8/cd5yQH/kkJ8Bo6svEZqIk=; b=tV9sdaDmqH8cGTyGwbjwfpmUbqNjaXKENPedVllZY1XBxLQB/Q7yLGS9ctCdDUmDB+ tR3fG5dR6wqSoYZHhJon+j3+0KAvma1n9nmmplt+SIzHZHsyLCHMr455n3Xu56cLX7Il Tx1v2WJ/beH/jwZMqUqgtBfyh8CuTABE9EiZJPAGOwcxpGiqMYtdLMvec1KIV2cBEcVh WrLby+Gh0ftM1IFgE+50qmt/uDxkokr2+C7P5pYzHAZLKz2kYwm3A/zJI78S6Lp2N4is 6JuV+WbZzidFN40FkIMtCC+m0jYygtApFYiiGdHGRLJQN2V9I4o9NbHR3cNuSDvCLc8s zj8w== X-Forwarded-Encrypted: i=1; AJvYcCUvsXczQTagg/2o+7l2rzJBe4aVgtB7YMLno0PBaZxN5gqDuZl06f36OzPmPDfp1XNBfPprByX6QbOtzSo=@vger.kernel.org X-Gm-Message-State: AOJu0YxAqLBo6wHO+oETmB3iUMoLgA6MRMI73N0vQJlkni4pF04RSEqc qQy90ktexH/VTWc8kUj6KJp8BYZ4uSjsJ9A9ZhXzuyj2Vhwo0n5P+YpuiDD8Z6vPO+FD00DjnJB DnnZtKUcX5QiPTjv0qcWPfXv4LHfQUcsiLaqU/sWAYrUNyRXOcZLh6c/dPQdyudQldur5760SLt eva6EW+g== X-Gm-Gg: ASbGncsxFpUFGsQGE3HqET942Ygu4t83lDU+A/sP9ngA2E6he3RpGk2EgRE0hdZ20ei l1xRpK+5Hv4og4OsjKpLfd+d4dORcbLaJEBUHhJoho0oP9MCAnTX2tOz3igiD99UCKG4exUC94B P4vq7xC0pznBnEgYLCCr4kvzZelQLfIc+4WYDT7+aTu2oelhj+4DcWFRI39bkfvpsxkZO72WEjs Nhw5XsUydT4Ilf1aHcSLmjce328hxKA7hQ0kUxiaJascNCR20mzzrlEd9ecz3Up7xMSdWsmhWiz Z5Ohy1XSLWOJEvu+ESOw70iQaE/lsIMAZm+O2Mn6jZbT74ReXQ== X-Received: by 2002:a50:d6c4:0:b0:60e:f46:326d with SMTP id 4fb4d7f45d1cf-60e0f46379fmr524115a12.33.1751233506004; Sun, 29 Jun 2025 14:45:06 -0700 (PDT) X-Google-Smtp-Source: AGHT+IGeG0HXUZS+VZqUBDBm8csLUlE85Zu71t9cWNi9cmpg397iu6ZGZalKE0CjWDY0LX20CtiqaA== X-Received: by 2002:a50:d6c4:0:b0:60e:f46:326d with SMTP id 4fb4d7f45d1cf-60e0f46379fmr524095a12.33.1751233505618; Sun, 29 Jun 2025 14:45:05 -0700 (PDT) Received: from amikhalitsyn.lan ([178.24.219.243]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-60c828e1a96sm4712037a12.19.2025.06.29.14.45.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 29 Jun 2025 14:45: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 , Kuniyuki Iwashima Subject: [RESEND PATCH net-next 3/6] af_unix: introduce and use __scm_replace_pid() helper Date: Sun, 29 Jun 2025 23:44:40 +0200 Message-ID: <20250629214449.14462-4-aleksandr.mikhalitsyn@canonical.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250629214449.14462-1-aleksandr.mikhalitsyn@canonical.com> References: <20250629214449.14462-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 --- include/net/scm.h | 10 ++++++++++ net/core/scm.c | 11 ++++++++--- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/include/net/scm.h b/include/net/scm.h index 84c4707e78a5..856eb3a380f6 100644 --- a/include/net/scm.h +++ b/include/net/scm.h @@ -88,6 +88,16 @@ static __inline__ void scm_destroy(struct scm_cookie *sc= m) __scm_destroy(scm); } =20 +static __inline__ int __scm_replace_pid(struct scm_cookie *scm, struct pid= *pid) +{ + /* drop all previous references */ + scm_destroy_cred(scm); + + scm->pid =3D get_pid(pid); + scm->creds.pid =3D pid_vnr(pid); + return 0; +} + static __inline__ int scm_send(struct socket *sock, struct msghdr *msg, struct scm_cookie *scm, bool forcecreds) { diff --git a/net/core/scm.c b/net/core/scm.c index 0225bd94170f..0e71d5a249a1 100644 --- a/net/core/scm.c +++ b/net/core/scm.c @@ -189,15 +189,20 @@ 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; + + err =3D __scm_replace_pid(p, pid); + /* Release what we get from find_get_pid() as + * __scm_replace_pid() takes all necessary refcounts. + */ + put_pid(pid); + if (err) + goto error; } =20 err =3D -EINVAL; --=20 2.43.0 From nobody Wed Oct 8 10:03:00 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 CD244242D94 for ; Sun, 29 Jun 2025 21:45:10 +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=1751233512; cv=none; b=oDSNr1OGr9qh8UOI6MtOaX4KmAGBlTmnBtHUDWmZ+AhtGIZyHe7gVTXnevBlgyBKym7tjNzyKIwxJ5Xk0jqhxFnF+qH1mQ4jl89xaxHPjyzruesflyeysHoLIYkGqJJtvys9Sepz2tMjGN60UNPE9HznlH+4j/cGZfBig/SCil0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751233512; c=relaxed/simple; bh=NzVgcHKoOIUZwVOYDvnzpsp4Ixb3PiP6jwJB7yn9Lm0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=SvxulH06uSHvGXLRXviGTCqJTJUfAEnJgB9+bMdetk7Yi6JUG4AyqLYPMB+DElfhESWHZ6PjNW0t0W4HyqkozvpRkMy+QriDbl/0kwkmhFv9Vy+KbrnlxFUrHJAiuB4427vybda/Cz9Nq1LHsGQTkUCedzyPUGQYFEfuK6HtWNs= 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=nBafJQyv; 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="nBafJQyv" Received: from mail-ed1-f70.google.com (mail-ed1-f70.google.com [209.85.208.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 7CC7A3F528 for ; Sun, 29 Jun 2025 21:45:09 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=canonical.com; s=20210705; t=1751233509; bh=jNbt7oyKjScEoIBZYdPyzN9axx/Wf/C6cCg96ND4tZ8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=nBafJQyvJ2EEPqdedbVsEUhKkknDbaqvtmOzTvHpf12PHiLFkAm5zVyiTlIZIa1h7 4e9mrq+N4czDaKZw82M8P62Mhv39PVDdtO1CpNrVaqcDT10hujklw+4YtLTDmr5Px1 vf2AaQxdoVM7bqeK2EKgBykKR7aWc46a2H8oImW2Y4a/9FAyWTzi7djytYrlBirzD8 up9hYYVCL6sIvJtxIEUt+/n1fNL2+k5nG3so571PoaFbHH9ZnuOBnMQwA//M+6k/B0 F1QOtJuoJ+66DOHjCaNR6aLGQgRq9m3PhM2CBa4yzn4+U1jO2dEoVvBgVBd86OSQ8g 8GKPRFHAthKCQ== Received: by mail-ed1-f70.google.com with SMTP id 4fb4d7f45d1cf-60c776678edso3448884a12.1 for ; Sun, 29 Jun 2025 14:45:09 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1751233509; x=1751838309; 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=jNbt7oyKjScEoIBZYdPyzN9axx/Wf/C6cCg96ND4tZ8=; b=wJzn2nEfejKkp0y39W3kJR8uA4YQD77ogg2craRco1DD6gmxoUHtnQHB59snCYj0eW YdxUEHNal9gLXMzOW8bVBXQ48txODRkPmTWsN7FC0fa6CNFQ/t1PTBcuvjEqBaAZ3cQz aZ5mSuXerU4rl2iegv95H0cBp+N6EGmgpRj5JU2CNj7U6R4GMJUXsY9nU1UYVAnLUqxu ejLuCN6Zcpqf12gUrfPxS63md85uMk1HpjmsbU12g9ZN/BmOOtvSKayJ41MkjImU+veA qPCMUMPhuaLAXACBeywQKZx/nMqPk5r3NvXTv08CnbCwzBbafxmVWw0GBVmqa9XVr3QX 4B2w== X-Forwarded-Encrypted: i=1; AJvYcCVcTyuRXC23vF94FEzYK3lpYX0mTGsX8PUM9eH9BQboarDce5iabGKjYUQxZFQ8gRmz7PIm/NSc8meX8yA=@vger.kernel.org X-Gm-Message-State: AOJu0YyecetP2zuJ+a7QWKSo8Dr6tKEuHCRyFBjtyOExGeDuV+cq8nB3 352IjGkNu3FyWBaJJsPOHMHlDISC8aWY6uBFZeYva8tbovh0UXHkTWi5kPhqzMsdBNTRS2KTjs/ XNSvp9es3X7UYC8M5HpW9I1rICvGiWHOFwqCN+nn/qXRQfCqvL7slrAS0ibkUMMG8FN/MTPYcpT ZWlCMiwQ== X-Gm-Gg: ASbGncsrt879Pz0i05kHoIjloUoJke/Qn7pZDSGQBd0IJJiY9RHLrgFbCHG84CURZtu aEy+HQ8UNTnc0MIHBv2p8+8lXeqnBJq4PpztC/WRft4Z9hUx73m6WIBG+zryyoWuiKiG5y3nYbV gm2h6kG5jfZ2vX9JSuny4Ytcw9wEUCF3pOynEPEg0XCpRZMFZ2z+HyBYhTtxg894sYoww9NHHjw PyqTxbTWw9xSupgCNV8hLKXz4aILezzLzXpmioNO8i4qvpeSSyoSHj1JKErafMISDq20szjQD5/ kE6xSh65opaPWXVjtEUNecbK182DAekFvJv8s3KSu/UkHsIhmQ== X-Received: by 2002:a05:6402:50cc:b0:601:d0ec:fea0 with SMTP id 4fb4d7f45d1cf-60c88eb1c90mr9129617a12.5.1751233509016; Sun, 29 Jun 2025 14:45:09 -0700 (PDT) X-Google-Smtp-Source: AGHT+IE4uKLPcGCI7v0Uifs9eHQmntR5QIGSGL+oic23vZukTBXZ3gZ43gYtsuo5c4s6dBF0o4jh2Q== X-Received: by 2002:a05:6402:50cc:b0:601:d0ec:fea0 with SMTP id 4fb4d7f45d1cf-60c88eb1c90mr9129595a12.5.1751233508641; Sun, 29 Jun 2025 14:45:08 -0700 (PDT) Received: from amikhalitsyn.lan ([178.24.219.243]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-60c828e1a96sm4712037a12.19.2025.06.29.14.45.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 29 Jun 2025 14:45:08 -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 , Kuniyuki Iwashima Subject: [RESEND PATCH net-next 4/6] af_unix: stash pidfs dentry when needed Date: Sun, 29 Jun 2025 23:44:41 +0200 Message-ID: <20250629214449.14462-5-aleksandr.mikhalitsyn@canonical.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250629214449.14462-1-aleksandr.mikhalitsyn@canonical.com> References: <20250629214449.14462-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 --- include/net/scm.h | 35 ++++++++++++++++++++++++++++++----- net/unix/af_unix.c | 36 +++++++++++++++++++++++++++++++++--- 2 files changed, 63 insertions(+), 8 deletions(-) diff --git a/include/net/scm.h b/include/net/scm.h index 856eb3a380f6..d1ae0704f230 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,37 @@ 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; + + 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; +} + +static __inline__ void scm_set_cred(struct scm_cookie *scm, + struct pid *pid, kuid_t uid, kgid_t gid) +{ + /* __scm_set_cred() can't fail when pidfs_register =3D=3D false */ + (void) __scm_set_cred(scm, pid, false, uid, gid); } =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) @@ -90,9 +109,15 @@ static __inline__ void scm_destroy(struct scm_cookie *s= cm) =20 static __inline__ int __scm_replace_pid(struct scm_cookie *scm, struct pid= *pid) { + int err; + /* drop all previous references */ scm_destroy_cred(scm); =20 + err =3D pidfs_register_pid(pid); + if (err) + return err; + scm->pid =3D get_pid(pid); scm->creds.pid =3D pid_vnr(pid); return 0; @@ -105,7 +130,7 @@ static __inline__ int scm_send(struct socket *sock, str= uct msghdr *msg, 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()); + __scm_set_cred(scm, task_tgid(current), true, current_uid(), current_gid= ()); unix_get_peersec_dgram(sock, scm); if (msg->msg_controllen <=3D 0) return 0; diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c index 5efe6e44abdf..1f4a5fe8a1f7 100644 --- a/net/unix/af_unix.c +++ b/net/unix/af_unix.c @@ -1924,12 +1924,34 @@ 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 __skb_set_pid(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; + + /* Pass ownership of struct pid from skb to scm cookie. + * + * We rely on scm_destroy() -> scm_destroy_cred() to properly + * release everything. + */ + scm.pid =3D UNIXCB(skb).pid; + UNIXCB(skb).pid =3D NULL; + if (UNIXCB(skb).fp) unix_detach_fds(&scm, skb); =20 @@ -1943,7 +1965,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 __skb_set_pid(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; @@ -1976,7 +2001,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 __skb_set_pid(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 10:03:00 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 B6038242D94 for ; Sun, 29 Jun 2025 21:45:15 +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=1751233518; cv=none; b=lo86wfccdyTBdhotAbP9T+cotLJ2OGkA+EtOaJSUHBAe+nw86+0RTrPTTFBjkHbmU5H4Zri9n4kbpOayfpfMBaG8cwRssS81f5Cmkrw64yUH0PBWc/Khjzkonh4lscAxl9U6mJuMrlPfGY39/rSof0LlWT0gAJenOZl55zwQMPg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751233518; c=relaxed/simple; bh=UsMulxUXfXc+mVSRj66gJP12dihbtpyStx6D4VTt0YY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ON+LKs/EAS+IShHEU5NvFEf7kBwlxtYL+8SdyPnu7sHglMhDJl9VlIp0qxpNScDRRYOb0Odcu7ULlaBSr95fGC8rep0BRt74gSsmIcgX6n1cP1p7ZB5aGlsmppvs5JozDs9bq63zGSyDYAz4kAlfRdbdp9tgrbTKOziZgyDSatQ= 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=N190CB0n; 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="N190CB0n" Received: from mail-ed1-f72.google.com (mail-ed1-f72.google.com [209.85.208.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-0.canonical.com (Postfix) with ESMTPS id BC6853F657 for ; Sun, 29 Jun 2025 21:45:13 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=canonical.com; s=20210705; t=1751233513; bh=gE/SBo0jtAJ3S3J1SQz/ldeuJLsn+kPIOiU+zq4e5hI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=N190CB0nfRPzbgv+WIRaiPeHevDnTbSyb9r14pvd1ynx9GiUuA2/ZTo9/ikhwj+s3 DakpzUZKlOfdlAtyMubkFMnNLDbrvDr03v8MNt+z62jxuPlEv1IE6XT9nGhZ4efU4I TpoBokM0E5DMLISfWEMS4Ok2xr38yd3k2zgsChAYCO7U95MZ9PlKeqmytVYeqb5U2t Er+PNhEsC2wIVs+SVdWAM7C+G6iFeTrYOPfIQP37rQd0dfXLbbdT2YI+ZGXeE3W4WD iRxfqsC4g+uWqkgA5MB8lDFgD/3ojD+slvtyjVK1DPGsjX111csAGlEu9Mjx4y/WUm ic9H4YSiktchQ== Received: by mail-ed1-f72.google.com with SMTP id 4fb4d7f45d1cf-60724177a1fso3557340a12.3 for ; Sun, 29 Jun 2025 14:45:13 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1751233513; x=1751838313; 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=gE/SBo0jtAJ3S3J1SQz/ldeuJLsn+kPIOiU+zq4e5hI=; b=v1fCcwQQgTIxU298ZS/6Ub2JkzdPPxqQZ6X8YlYLHnTR0yrKQwhELeMm6ip81biOOT qRYhlB/pAfTtewvNMyKlOMcnog1mf1tg7MO2RwJrtehXRckrCK4nIYNBW4CxITp1rsG1 vQHDkNRER4Fh3of5O+kdvlDH12CApJg2P2KCqt3B/ZUOOJfvvA50ajuh4smKyZr7v+v7 qSzoShc/RyHNfcGumeHkOX58kwdsaAfVPhUU+cZCcIe22AswiJCEVf7BtAE/Ox/vSyN2 jU9rEou39mCqPn4Ud19/mncgnpqIynALbdvfnwrziVH9/X/7BWqzJb9Ad6FZevQoW2xm 3j+w== X-Forwarded-Encrypted: i=1; AJvYcCXTJ5wjgTs3YMQwWoTQjclLPejDwKtn1nb3DX4phegAjYwa+NAE/aNV47TRY5kQAFVIhOHRYsrouAaSm8U=@vger.kernel.org X-Gm-Message-State: AOJu0Yycmuwhru4QwL1/SHZio3rEETXNFBS8GoSkolTinLsdjjPXlXUY kOF644C6Fmu8npL9oDzEICT4LMwWegt3srVZPWztakuoCGfuSfdkpB89LMuIPt+mpI8Z2ZayuQT PNBwXR8Pqs5NLgeVBNTA6INS7fIwQfbX/07WPQ4FVYCOR/vYid1DBaBebMRzUjkpzxJJOtrC/MI 5aNg6FIA== X-Gm-Gg: ASbGncvRadEUsarA89JnVEaHl3buy3OG7FPujSEY40lrtRAxtuheHsnvSJJRO34wYsZ JTIG73vnLfHJqSbTuLmhAhjFJzMMnyenMMe8hNVcJsNP+fir6IJcG71FNVgKvd3E47oLKMtVAiu znKiD5Kpy5VO524iaqNzJXSIQugphXMC+2Xc/5sM18GYCIwr6BYz/ZaLZ/eftOwWnXwD/fHNHD7 AEKCVi8AsCB/fsF5Q07Sn0xzcbzfR1RvJ46rGN/UjfPCt53qAZu+U2hmGA452VBGCsm+2cnNjLK acAapTTqM66NTaU5DdyOn6VAo/ceHobg9QMV8oB3518EUcwgng== X-Received: by 2002:a05:6402:90a:b0:5fd:c426:9d17 with SMTP id 4fb4d7f45d1cf-60c88e750a8mr9082140a12.34.1751233512828; Sun, 29 Jun 2025 14:45:12 -0700 (PDT) X-Google-Smtp-Source: AGHT+IFmhOkFUd0s3cRSSvV50wOIhAEwTNb1KausZupuU/kQ9vYIV4alre59EPicBcrvLzCaJw2cyw== X-Received: by 2002:a05:6402:90a:b0:5fd:c426:9d17 with SMTP id 4fb4d7f45d1cf-60c88e750a8mr9082128a12.34.1751233512402; Sun, 29 Jun 2025 14:45:12 -0700 (PDT) Received: from amikhalitsyn.lan ([178.24.219.243]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-60c828e1a96sm4712037a12.19.2025.06.29.14.45.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 29 Jun 2025 14:45:11 -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 , Kuniyuki Iwashima Subject: [RESEND PATCH net-next 5/6] af_unix: enable handing out pidfds for reaped tasks in SCM_PIDFD Date: Sun, 29 Jun 2025 23:44:42 +0200 Message-ID: <20250629214449.14462-6-aleksandr.mikhalitsyn@canonical.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250629214449.14462-1-aleksandr.mikhalitsyn@canonical.com> References: <20250629214449.14462-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 d1ae0704f230..1960c2b4f0b1 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 0e71d5a249a1..022d5035d146 100644 --- a/net/core/scm.c +++ b/net/core/scm.c @@ -464,7 +464,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 10:03:00 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 A89E0245000 for ; Sun, 29 Jun 2025 21:45: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=1751233522; cv=none; b=ShmS3FwKpaOrT/AK8j1hQV7+e3WbY3H+j2D2gwRbtSTZxhGUF1MxQDDYH2tcKq3CcNre7lbZk0+YNYclwSljP4w3lBp+8GS/94UnteNNy73bcwRDyYG0dWD8ExCrrcqJA3wwZTx6F4jFminKui4ygf0L5t4xzWu+fUg7AKepoow= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751233522; c=relaxed/simple; bh=G/61B5x6m5HWYLNss1aWHcp1JZl7vwCXB6QgizYMTKk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=KROzQuedz0j0gsAyl1t6SKcmvGyoItLSCM1O714THUeRXp49LwKOWylx1BpVPH/o9OqX+oGuotN7pd0xbdPWAxtBLZb65CMiqzo5LGQkkb9sFEWyBV0VlOqc788/p5syzb7oCNVKbCqz17VOgCDBPjQofEpERJJxf8/sKs4qZy8= 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=iy2yalHB; 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="iy2yalHB" Received: from mail-ed1-f72.google.com (mail-ed1-f72.google.com [209.85.208.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-0.canonical.com (Postfix) with ESMTPS id 46E833F52A for ; Sun, 29 Jun 2025 21:45:19 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=canonical.com; s=20210705; t=1751233519; bh=/1BBk1xnWMXbQKeMLQK9jlxe2oTJlnw7Zx+SrOAU8+o=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=iy2yalHBCVi1ft/uVQPQHBC5xmP7IEdaD66MrEOlxmux+b8z+nkL/+SWxxC6/f4iw dko8cjgXxtreCP62jiBrP84OGMZXr0nVZQtWmtruCGI1OBWNK9s0Cw9C+cYLFFRxYY llPOjXqoOWeB8XB/ZkK8eLwSMbdCjzgTO1WLRHBuEsprbTYKG6pzV0pjhJ8XXIvBj6 UxpwBJcDfoFA2jMNRNVeGJCx0b0+8T1f1tHxvE+TwUbFYO5zJqeyOdeOV9+GfZfphr mqq3ze71l3XCL4Ss2E5PvH0OsGBeXMWEBrm4CJqw5isCM9zPIAJAGMZzx0T0AzkCav 0fyhBmFFSZ6wg== Received: by mail-ed1-f72.google.com with SMTP id 4fb4d7f45d1cf-6090274dd37so1324897a12.0 for ; Sun, 29 Jun 2025 14:45:19 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1751233517; x=1751838317; 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=/1BBk1xnWMXbQKeMLQK9jlxe2oTJlnw7Zx+SrOAU8+o=; b=lbG5Wrkiq3PEhGTLdVFWAlh+x6l+yISBUlBLaRQVbY3Ef6OcWJOwFEu023ZRksQBG3 9Jid54Mvfhn3kqYmgIonpqWpZzqcRrIWux6sAox2e0HPMeWL/g1ZlTd5XpYz59E3aEYO EzWvLm2/l5W/tAEkDN5UMYe82JmDp0Ej0Xb7BunG69BNl3ivCfJLb0PKKOP6vLTzECpp NJBBrIEEBoXJ1kM2crt4oMUi1HD73Gl8d7Qqe80Q/aWbBapC8j0Ypz75AYWJOJQiS3LQ 93B7o/rqZl06UB3JbQFXownqAHJxHbacZP9HW+YVt/B23sfoRottx7vOk46XaxXTEp1p LHtg== X-Forwarded-Encrypted: i=1; AJvYcCXdOmSKvGGI8eyrkWiMMgy8BZEH/GCTicTRGn2kdf+tqYKdn5D1tM24bbL0pupSUqQY3Psz7WPzWThGdTs=@vger.kernel.org X-Gm-Message-State: AOJu0YwwypMHZz3X3uhptfOTPe/tfKWUglW5SjIIw1mu7PQPuOl3zrwQ i5Vzh4KLkRma4TS0tZ7tpX8NbZOffz1UnvkqoSxLwF5GtJIKg9IANtnxSX2ZXbXfFGD+/sVmzAZ 1lwi23kofIFXe0b+Li7rqvSTpS6z5XbJ+bLLU82q0TUuwv0Ee22IToGuDL7IGER5vjnmpgjlEAW E8IE9gqw== X-Gm-Gg: ASbGncvSeSAXE7f/YRkZHMtOVwWK7NG5TZTGz7Ew7u+T8PMHq4iIRuKpUon9etpjMw4 QY3YTOsiYTq5BRp3dKKZqXhN/oKmXYrKDz0bFGw+KfL943DhorpJBqsSEW2NHvb2B1i+IdiatsE rsvaBd/C28fSB0wi1WKoZfWxsjIM1JL9BTh0w9Wqw/yMrUFQs91BHYKPNOJMA4WNw12iL3Uo+ze cpbpTyFPrdtbRojNifDvpIxM2uvzGfRkbR9us/P+cd3EJb6zKY/KKemHISLLMwApos+FPa26cAA bTCnfF02Wbt2N/2Ab59HKTTgtV5lucC4nuZrL5xkie7xESvbxA== X-Received: by 2002:a05:6402:254b:b0:5fd:1c90:e5cd with SMTP id 4fb4d7f45d1cf-60c88dd96b1mr9221547a12.20.1751233517191; Sun, 29 Jun 2025 14:45:17 -0700 (PDT) X-Google-Smtp-Source: AGHT+IE8jizv2tS0inqrEmzuPiGpHZgTWGHT7Ac+lf6PwaXUePpN1H8DVPNfjkvYGk+DrsJzND/r4Q== X-Received: by 2002:a05:6402:254b:b0:5fd:1c90:e5cd with SMTP id 4fb4d7f45d1cf-60c88dd96b1mr9221537a12.20.1751233516749; Sun, 29 Jun 2025 14:45:16 -0700 (PDT) Received: from amikhalitsyn.lan ([178.24.219.243]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-60c828e1a96sm4712037a12.19.2025.06.29.14.45.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 29 Jun 2025 14:45:15 -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 , Kuniyuki Iwashima Subject: [RESEND PATCH net-next 6/6] selftests: net: extend SCM_PIDFD test to cover stale pidfds Date: Sun, 29 Jun 2025 23:44:43 +0200 Message-ID: <20250629214449.14462-7-aleksandr.mikhalitsyn@canonical.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250629214449.14462-1-aleksandr.mikhalitsyn@canonical.com> References: <20250629214449.14462-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