From nobody Fri Oct 2 12:24:36 2026 Received: from sender-of-o57.zoho.eu (sender-of-o57.zoho.eu [136.143.169.57]) (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 F315036F426; Sat, 1 Aug 2026 07:13:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=136.143.169.57 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785568428; cv=pass; b=Ab0D277LuQ0IK9R845d5sYBZ1fbkmzvB9NfXc918gUZbDlH08vG/6pjuJolyLWOgOgYEF+EN1uXV8wI1FI9CovDPmgnU6D5LEjTKv06tWrru+btxcgE9puresUVz+jhPK/1OG1b934IkF2z/jWmFHAa8/td9ZHXntFXGUXJB+Ho= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785568428; c=relaxed/simple; bh=oizwROL4CHKC60FysL967VYh8hqBgJnGvmTxG7Pv2ss=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Sn6+AkHrSBko5UvM/gUArqViL7P3BfFeK4iaTWV6dTQ86wOSNORdKRuqz84eKmnMVNuzCil61q8i74+oQHXz2xvAMhFWgBAlaWCywQTBmQbutB/zAXUNf/wiRRV3TKzAfMa4IuFY7C9SzaE5KL2KZCnasNOXjX8kvfeuPyDcfUA= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=iusegentoo.com; spf=pass smtp.mailfrom=iusegentoo.com; dkim=pass (1024-bit key) header.d=iusegentoo.com header.i=ali@iusegentoo.com header.b=hG2TByt3; arc=pass smtp.client-ip=136.143.169.57 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=iusegentoo.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=iusegentoo.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=iusegentoo.com header.i=ali@iusegentoo.com header.b="hG2TByt3" ARC-Seal: i=1; a=rsa-sha256; t=1785568405; cv=none; d=zohomail.eu; s=zohoarc; b=h7axT5jtfCKDHoYtVZtckK6vLTlacVrY3fqcs5pGGHzISRFyR+ohZcsCBlGYUbXm1svcoxqOxIA5pF9D/2wqH5olnNRne1HWo6KNVI1TzyENUOscmmWGtPo7ATRky6j2QbljR2OoOAZlBthP2PwVoV9PB4MlVORAZuuYdN6tbVk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.eu; s=zohoarc; t=1785568405; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:MIME-Version:Message-ID:Subject:Subject:To:To:Message-Id:Reply-To; bh=VFcBWjC5ahhLk/neaSsNkFwzuJ7YbdmtTkJ6fhx0ABw=; b=Vh2Uwd7HrABO/Yf2e0PE7E6Qxc7fXoKKHajsHyTcGyY6NW502Dm41MMpNqK7cAtLRRzwx5oIRWolbzoq0X17aCj8cfzX6OcGIdPY9x3nOwwz0jpAvlUDOiEnjozyNh84LJdxbWlyj6sQyiEEgfv3c6x4UGYOJM4ZDpAtspWCrME= ARC-Authentication-Results: i=1; mx.zohomail.eu; dkim=pass header.i=iusegentoo.com; spf=pass smtp.mailfrom=ali@iusegentoo.com; dmarc=pass header.from= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1785568405; s=zmail; d=iusegentoo.com; i=ali@iusegentoo.com; h=From:From:To:To:Cc:Cc:Subject:Subject:Date:Date:Message-ID:In-Reply-To:MIME-Version:Content-Transfer-Encoding:Message-Id:Reply-To; bh=VFcBWjC5ahhLk/neaSsNkFwzuJ7YbdmtTkJ6fhx0ABw=; b=hG2TByt302FLPD9hkvrc+reFFieid3MDtXVW3r62oKsz5Ev80mssq8oIf2iHxh9s I6uSLfbBwapMY6Vd23DaUJs55MrsQV5+bzW6sYCFdUg1qR41HQQW9S9VKtRfX3dH5CC cR4v7UPBNFllRYMIyVAB5NC4eBKf0ce4LRLZmcVc= Received: by mx.zoho.eu with SMTPS id 1785568403940788.5619489921191; Sat, 1 Aug 2026 09:13:23 +0200 (CEST) From: Ali Ahmet Memis To: Alexander Viro , Christian Brauner Cc: Jan Kara , Kees Cook , linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, stable@vger.kernel.org Subject: [PATCH 1/2] ufs: create the root dentry after loading cylinder metadata Date: Sat, 1 Aug 2026 10:12:57 +0300 Message-ID: <20260801071306.59484-2-ali@iusegentoo.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260801071306.59484-1-ali@iusegentoo.com> References: <20260801071306.59484-1-ali@iusegentoo.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 X-ZohoMailClient: External Content-Type: text/plain; charset="utf-8" ufs_fill_super() installed sb->s_root before it loaded the cylinder group structures for a writable mount: sb->s_root =3D d_make_root(inode); ... if (!sb_rdonly(sb)) if (!ufs_read_cylinder_structures(sb)) goto failed; When ufs_read_cylinder_structures() failed, the error path freed the in-core superblock information and set sb->s_fs_info to NULL while sb->s_root stayed installed. get_tree_bdev() then reached deactivate_locked_super(), and because s_root was present, generic_shutdown_super() called sync_filesystem() and the put_super operation. Both dereference UFS_SB(sb), which is now NULL, so a mount that fails only while reading the cylinder groups oopses during teardown. A crafted image whose first cylinder group cannot be read reaches this path. Load the cylinder group metadata first and create the root dentry last, so the superblock is published to the VFS only once it is fully set up. ufs_setup_cstotal() and ufs_read_cylinder_structures() take only the super_block and do not use the root inode, so the reordering is safe. Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2") Cc: stable@vger.kernel.org Signed-off-by: Ali Ahmet Memis Reviewed-by: Jan Kara --- fs/ufs/super.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/fs/ufs/super.c b/fs/ufs/super.c index c4831a8b9..7deecb395 100644 --- a/fs/ufs/super.c +++ b/fs/ufs/super.c @@ -1199,6 +1199,15 @@ static int ufs_fill_super(struct super_block *sb, st= ruct fs_context *fc) sb->s_maxbytes =3D ufs_max_bytes(sb); sb->s_max_links =3D UFS_LINK_MAX; =20 + ufs_setup_cstotal(sb); + /* + * Read cylinder group structures + */ + if (!sb_rdonly(sb)) + if (!ufs_read_cylinder_structures(sb)) + goto failed; + + /* create the root dentry last, once UFS_SB(sb) is fully set up */ inode =3D ufs_iget(sb, UFS_ROOTINO); if (IS_ERR(inode)) { ret =3D PTR_ERR(inode); @@ -1210,14 +1219,6 @@ static int ufs_fill_super(struct super_block *sb, st= ruct fs_context *fc) goto failed; } =20 - ufs_setup_cstotal(sb); - /* - * Read cylinder group structures - */ - if (!sb_rdonly(sb)) - if (!ufs_read_cylinder_structures(sb)) - goto failed; - UFSD("EXIT\n"); return 0; =20 --=20 2.54.0 From nobody Fri Oct 2 12:24:36 2026 Received: from sender-of-o57.zoho.eu (sender-of-o57.zoho.eu [136.143.169.57]) (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 1CE8838AC92; Sat, 1 Aug 2026 07:13:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=136.143.169.57 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785568428; cv=pass; b=D0doZgH/8WCwPjS3hxH5BobywBcYfVgW/LANfAJ0SMd18HNyYJd6XgkobT5HyvGWlcswmA54UkSyAitdPYUxG7C4TQq01oLwzJKxiJ8HrT8dp4RA5h5l0odWUvqQHydnqQdbyUmISHPAkZacnE4kJ2C80n4jB+OEUHpdfzzrEXg= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785568428; c=relaxed/simple; bh=CSq/ZfxhyX69pcg1hfW1WzDgWgKLpAz7yogVKbvQOpE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=DoJ3fxyoX5/Xhuxh1yhOOI/sJXQsmj9pzkvAV/xcOccW0/mylNOxPrQKQShrz3UeIMnzPnOSBjU48lrUbL9TwKQfLS+19UrL9GWut7syQa44mfcZNAXBNd9449yQb5fpgxGl5sjo3apaW89KRzpBywNrbkAFmmM7xR300+O0QvE= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=iusegentoo.com; spf=pass smtp.mailfrom=iusegentoo.com; dkim=pass (1024-bit key) header.d=iusegentoo.com header.i=ali@iusegentoo.com header.b=Bqk9iG3d; arc=pass smtp.client-ip=136.143.169.57 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=iusegentoo.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=iusegentoo.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=iusegentoo.com header.i=ali@iusegentoo.com header.b="Bqk9iG3d" ARC-Seal: i=1; a=rsa-sha256; t=1785568408; cv=none; d=zohomail.eu; s=zohoarc; b=Z2qM2J24xe3lQ9sI+LShw22vrACDCGdvX0Lq4bXwZ+NKbEzWToh6HHqaOv0tokURTCLiDTuzyISNhnqvFtfBpUZaQzJpp/aGmMZWDFSeO3B+lCr3qwOCIR8kamaw1sPS6Dg4WGBuBykZuaXXoIuukBuQfch1c4yu4+JBY1acq44= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.eu; s=zohoarc; t=1785568408; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:MIME-Version:Message-ID:Subject:Subject:To:To:Message-Id:Reply-To; bh=3gPiaHvRiE9a7VS3RoeEawkQAvo0NUnPaDkZy2tIKKo=; b=LKu6P7rXfHkIvsiye0ciTyO19UOTk90cdLX3oC8B6RtAvFRpcO61Lu/3o1najXzbnawalW41CfXjnLX+2OJDmMnUlOxq/JuW8wRFy4dhM4BAUNFm83nD7F5Y5+DV0ZQ/sJXJGQ3OSDMJFWSe4escaw7y7siHubma02Mo437sY0Y= ARC-Authentication-Results: i=1; mx.zohomail.eu; dkim=pass header.i=iusegentoo.com; spf=pass smtp.mailfrom=ali@iusegentoo.com; dmarc=pass header.from= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1785568408; s=zmail; d=iusegentoo.com; i=ali@iusegentoo.com; h=From:From:To:To:Cc:Cc:Subject:Subject:Date:Date:Message-ID:In-Reply-To:MIME-Version:Content-Transfer-Encoding:Message-Id:Reply-To; bh=3gPiaHvRiE9a7VS3RoeEawkQAvo0NUnPaDkZy2tIKKo=; b=Bqk9iG3dpdapEQNgey6DSZWZua7GBvCwPao9G4QPLmedQGx0/E0mKOefSmJj6HmS a6P0HoOGm4aawZxQRl1PFN2lQy/Ce5zmYGQyk6r4tdOPuPGh6a4/DnrRMuKM7V1saQq OCncH3OSJ5XbELu+CeAYueHl7TfzjMfqZBG7rssU= Received: by mx.zoho.eu with SMTPS id 178556840686779.84956335936783; Sat, 1 Aug 2026 09:13:26 +0200 (CEST) From: Ali Ahmet Memis To: Alexander Viro , Christian Brauner Cc: Jan Kara , Kees Cook , linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, stable@vger.kernel.org Subject: [PATCH 2/2] ufs: validate cylinder group metadata before caching it Date: Sat, 1 Aug 2026 10:12:58 +0300 Message-ID: <20260801071306.59484-3-ali@iusegentoo.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260801071306.59484-1-ali@iusegentoo.com> References: <20260801071306.59484-1-ali@iusegentoo.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 X-ZohoMailClient: External Content-Type: text/plain; charset="utf-8" ufs_read_cylinder() copies the cylinder group index and the rotor positions straight from the on-disk group and caches them without any check: ucpi->c_cgx =3D fs32_to_cpu(sb, ucg->cg_cgx); ucpi->c_rotor =3D fs32_to_cpu(sb, ucg->cg_rotor); ucpi->c_frotor =3D fs32_to_cpu(sb, ucg->cg_frotor); ucpi->c_irotor =3D fs32_to_cpu(sb, ucg->cg_irotor); They are then used as indices during allocation and free: - c_cgx indexes the cylinder summary array as UFS_SB(sb)->fs_cs(ucpi->c_cgx), so a value past s_ncg writes a 32 bit count outside the s_csp allocation. - c_frotor becomes a bitmap scan start, start =3D c_frotor >> 3, and then length =3D ((s_fpg + 7) >> 3) - start. A start beyond the block bitmap wraps the unsigned length to a huge value, so ubh_scanc() walks far past the cylinder group buffers. c_irotor drives the inode bitmap the same way. A crafted image can set any of these freely, turning an ordinary allocation into an out of bounds access. Reject a cylinder group whose recorded index does not match the group being read, or whose rotors fall outside the group, before the metadata is cached. Valid filesystems keep cg_cgx equal to the group number and the rotors within the group, so only malformed images are rejected. Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2") Cc: stable@vger.kernel.org Signed-off-by: Ali Ahmet Memis Reviewed-by: Jan Kara --- fs/ufs/cylinder.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/fs/ufs/cylinder.c b/fs/ufs/cylinder.c index a2813270c..b930ee1cf 100644 --- a/fs/ufs/cylinder.c +++ b/fs/ufs/cylinder.c @@ -68,6 +68,16 @@ static bool ufs_read_cylinder(struct super_block *sb, ucpi->c_clustersumoff =3D fs32_to_cpu(sb, ucg->cg_u.cg_44.cg_clustersumof= f); ucpi->c_clusteroff =3D fs32_to_cpu(sb, ucg->cg_u.cg_44.cg_clusteroff); ucpi->c_nclusterblks =3D fs32_to_cpu(sb, ucg->cg_u.cg_44.cg_nclusterblks); + + /* these on-disk values become array and bitmap indices */ + if (ucpi->c_cgx !=3D cgno || + ucpi->c_rotor >=3D uspi->s_fpg || + ucpi->c_frotor >=3D uspi->s_fpg || + ucpi->c_irotor >=3D uspi->s_ipg) { + ufs_error(sb, __func__, + "inconsistent metadata in cylinder group %u\n", cgno); + goto failed; + } UFSD("EXIT\n"); return true; =09 --=20 2.54.0