From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 DB73E376464 for ; Fri, 8 May 2026 21:17:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778275053; cv=none; b=oIlUrl0Ysrn1r7pY5dbs9AdTwzFfoXMLX5Wilv39oSOKDRyujS0uyydbJjrP9DhVYIxDRuCH4ypcvDNm92eXmMugsMoFOylgIB5PhO6p/semTQH9+tQEx3DzhH6BZMeOZe18LgOKAlT9XiLeYyJhEbIoJh8G7wUHBBVjmDC//1o= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778275053; c=relaxed/simple; bh=qCd/eJPhG0ju1VlBIOeTzd99PgETlV9q5cmSxBkWwbM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Ea4TFU8ZXuoLi+FjVzLYKUaIVnvDVeRF2kntkleGrryZumdDLa5o3ZQohv4yDNDKAbj4YVqw92o0QpSTUJTzfzOGsW4Otnam2V62dqUgfLZFwBQ94sBuS7/H/5D6hcaTXhD0ywq+KTPz3mWBNLq6jDRzKSBLUBWcUHn3w3X8IdQ= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=MdjRPF0W; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="MdjRPF0W" Received: by smtp.kernel.org (Postfix) with ESMTPSA id EF246C2BCB4; Fri, 8 May 2026 21:17:32 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1778275053; bh=qCd/eJPhG0ju1VlBIOeTzd99PgETlV9q5cmSxBkWwbM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=MdjRPF0W9ZEVxGN77nuhh4dUyU4u41U6GWaA6UfHGcoCMrmEBa96tY84EKfTkYGhz iTrZ2yOSj3PsEvHbkM06ADbQeQ/0OTFKKIfTZaPXrYY9Hed67kUOiL+E5JfmdYbZ69 4Wwz/8RPWM/grtSh7rnqfZiuxCXdqiY5iNlHLlBbRYtIl42PvloK3QwE0xLseD7boA 0SRiRzFm5WPmdwsRDml8nekfRZGw1neviumXhLJ4M/dFNHocQfEX7YbRr4Kbvz+/M0 6S5CZ/3HjHiI89eDzeO2IvherGv9fEA6CeTzOGEez2lqoeup6tFLU8pbvjH0AlO8cR srmHBJyEOB87g== From: Sasha Levin To: stable@vger.kernel.org Cc: Seohyeon Maeng , Jan Kara , Sasha Levin Subject: [PATCH 6.1.y] udf: fix partition descriptor append bookkeeping Date: Fri, 8 May 2026 17:17:31 -0400 Message-ID: <20260508211731.1959991-1-sashal@kernel.org> X-Mailer: git-send-email 2.53.0 In-Reply-To: <2026050425-sage-prelaunch-0822@gregkh> References: <2026050425-sage-prelaunch-0822@gregkh> Precedence: bulk X-Mailing-List: stable@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit From: Seohyeon Maeng [ Upstream commit 08841b06fa64d8edbd1a21ca6e613420c90cc4b8 ] Mounting a crafted UDF image with repeated partition descriptors can trigger a heap out-of-bounds write in part_descs_loc[]. handle_partition_descriptor() deduplicates entries by partition number, but appended slots never record partnum. As a result duplicate Partition Descriptors are appended repeatedly and num_part_descs keeps growing. Once the table is full, the growth path still sizes the allocation from partnum even though inserts are indexed by num_part_descs. If partnum is already aligned to PART_DESC_ALLOC_STEP, ALIGN(partnum, step) can keep the old capacity and the next append writes past the end of the table. Store partnum in the appended slot and size growth from the next append count so deduplication and capacity tracking follow the same model. Fixes: ee4af50ca94f ("udf: Fix mounting of Win7 created UDF filesystems") Cc: stable@vger.kernel.org Signed-off-by: Seohyeon Maeng Link: https://patch.msgid.link/20260310081652.21220-1-bioloidgp@gmail.com Signed-off-by: Jan Kara [ replaced kzalloc_objs() helper with equivalent kcalloc() ] Signed-off-by: Sasha Levin --- fs/udf/super.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/fs/udf/super.c b/fs/udf/super.c index a186d2418b500..dbbdd44b337f0 100644 --- a/fs/udf/super.c +++ b/fs/udf/super.c @@ -1657,8 +1657,9 @@ static struct udf_vds_record *handle_partition_descriptor( return &(data->part_descs_loc[i].rec); if (data->num_part_descs >= data->size_part_descs) { struct part_desc_seq_scan_data *new_loc; - unsigned int new_size = ALIGN(partnum, PART_DESC_ALLOC_STEP); + unsigned int new_size; + new_size = data->num_part_descs + PART_DESC_ALLOC_STEP; new_loc = kcalloc(new_size, sizeof(*new_loc), GFP_KERNEL); if (!new_loc) return ERR_PTR(-ENOMEM); @@ -1668,6 +1669,7 @@ static struct udf_vds_record *handle_partition_descriptor( data->part_descs_loc = new_loc; data->size_part_descs = new_size; } + data->part_descs_loc[data->num_part_descs].partnum = partnum; return &(data->part_descs_loc[data->num_part_descs++].rec); } -- 2.53.0