From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-vs1-f42.google.com (mail-vs1-f42.google.com [209.85.217.42]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 253BD3AE6F2 for ; Tue, 7 Apr 2026 14:06:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.217.42 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775570788; cv=none; b=DRpxTwrW1wuV89AZ5NSMg2U+MJCL0QoVyhPYjTZ1P0Uztf3POhAv+Wakm0+AiHZBEVVTnRMMmhAWk+/JLzipQrMcnuucXBjtXxw1cZgVu2t85SqRkYI3mc49Dn01nfAK8QhLntDMV6w5QsfsP0AqR4zZ1dEjC3m4EvF0oSq5L8Y= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775570788; c=relaxed/simple; bh=hR+4fVDOdwI76OidQLd9QmfZVGOhqdBSDsepnstrmBE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=FOTouoGRu2c+vDmW3qqv3YxLgEEqhemaMbW6FzIJAIpR+qSCkcBKGJIGc+7gKX+MsnETm97Apr1gVVON0YlGa/gFH6Zy6JmOEOHEZvFR3bwIdo18h8NB/LjuWNcgq/4WM8DXorQtsIjgtDvF/2IWPOJ1+KoXoY3khGWESy9jgsA= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=Es7NgZHB; arc=none smtp.client-ip=209.85.217.42 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Es7NgZHB" Received: by mail-vs1-f42.google.com with SMTP id ada2fe7eead31-604f1bfed92so4726223137.0 for ; Tue, 07 Apr 2026 07:06:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1775570786; x=1776175586; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=W6lsHo5qoWGZyi8rJZLp4j1toOJ5+nc1vdlTEmr6fyY=; b=Es7NgZHBMTRDkQN1xNjvcU59J4meqF8MMwL43WAhURGcsEtowOCgT4LMxst1Ra81oo r8GTOKPZ9u4OtN5jIWqIHahPuF4XWzVay81A8LyOWrN1xL+RTBH5VKD2k7U+NU/DVpU6 EsdJW6tpoQlUc81ryQ5on+W91sGHDPEZLsQSeAH7y12d1zw5tiNLolfYHwiXvya9V4Mx c99h1ux+xPvL2F2Kp2BKrE7zr59lvAM0AG1udbo180ZmuCDRCuUh+wQWUh3WzU+Cbos8 HsYPV3E7YWuKtwV3WzlYxiIGn4f+WI4V1hEONpQzCztrY6fhkIa6bv/sW5PtyHGJw7Uq gBgw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775570786; x=1776175586; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=W6lsHo5qoWGZyi8rJZLp4j1toOJ5+nc1vdlTEmr6fyY=; b=An3gCvXHbIlpa++lMi8n8GpHhMGZ6KECcJy36GbwYa3xCG7L/c+E9f0ImywniVsQkT utjZiObubYa/E+8/YMf3Ga1+TCx9IGMyvCzFfp7n+2KsUTcq4mzQwMXCueNKQTFBFfeJ vpsYPZDqLXnZahvSSM6LFeH5J1Q7R+pKigHO5itl6mVz/4aBSSlI7uMTYQnlnLYC5p0m 1eHWDAOsN0F6mp79r2tPmEztUgQ2jVoIhZ5uW5SJZLMH/UXfrc9mPUSOiDhLEiLKyOO4 5Y+HxT3hwPBLzvMk89CCJXn3Egztv5IUyC3y1TwW79lExmj4VG1Yg1nVbOA2qTGSL/lK g4WA== X-Forwarded-Encrypted: i=1; AJvYcCVePefuI2xhJDJ5CYjsKq+eLUsS5WMY52r2oOmQQEjMJBkkHXDPXzmo0WbGGju9vNPUEprvemGC9stjgFw=@vger.kernel.org X-Gm-Message-State: AOJu0YwyefwvnDOMYudt57EeSF7qdU1H5tyypF73I7qpLx2cHVTGFxMY Fxl7WpK028JhtaX6Utw6koE7h76fORbrjJemTtpZs0Fba1/8fywq8DRk X-Gm-Gg: AeBDiesJOPfufQAQUHfAfvR16Rh1yVsb3hvil41DMmFCKmo9ns5pVwq1fiekh4Pdzd1 MuYVi/wr9Ft06iK1vPyMdlWQZSDXq9cr+kZm55fU96xPB5eNorHpbuwgjuTeqAeOgd4p12yp+JE 1Bqs4xrrZPxUSht8RjK6lDVDvEkLk9XihDS79oPks/hEdvj4pgK7qxxkvHh0mbee7u2QB8xTAwz H48MOhVwDwZicPnBPvJr1unoSDkFIQ4ah3GHMEgj1qBqn7KBRikT4Qs4ouxFE7aCeTJUneAoXJL bel/PIH0RQtmalFg8qKDfJ9CUueUulbxLlARQxbhbaVGNOz+/FAOPst9DWAWeyqHrtvJqHmTGtq nw03aHOKvZzLIVMFCFH5B6+X5DYnyZWOlq34Znbg73FTqJviy523UIw2Q0cGJ7DERbrPanMB4je riIn9Fs1gBJZBiau/yq1rVXhY= X-Received: by 2002:a05:6102:5a92:b0:5ff:c510:b7e4 with SMTP id ada2fe7eead31-605a50f88e9mr6685023137.28.1775570786058; Tue, 07 Apr 2026 07:06:26 -0700 (PDT) Received: from localhost.localdomain ([2a09:bac5:6d73:aa::11:1b5]) by smtp.gmail.com with ESMTPSA id ada2fe7eead31-6058304a726sm19814641137.9.2026.04.07.07.06.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 07 Apr 2026 07:06:25 -0700 (PDT) From: Sebastian Alba Vives To: yilun.xu@linux.intel.com Cc: linux-fpga@vger.kernel.org, conor.dooley@microchip.com, mdf@kernel.org, linux-kernel@vger.kernel.org, Sebastian Alba Vives Subject: [PATCH v2 1/3] fpga: dfl: add bounds check in dfh_get_param_size() Date: Tue, 7 Apr 2026 08:05:59 -0600 Message-ID: <20260407140601.15006-1-sebasjosue84@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260402125446.3776153-1-sebasjosue84@gmail.com> References: <20260402125446.3776153-1-sebasjosue84@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit dfh_get_param_size() can return a parameter size larger than the feature region because the loop bounds check is evaluated before incrementing size. If the EOP (End of Parameters) bit is set in the same iteration, the inflated size is returned without re-validation against max. This can cause create_feature_instance() to call memcpy_fromio() with a size exceeding the ioremap'd region when a malicious FPGA device provides crafted DFHv1 parameter headers. Add a bounds check after the size increment to ensure the accumulated size never exceeds the feature boundary. Fixes: a80a4b2b2e4f ("fpga: dfl: add support for DFHv1") Signed-off-by: Sebastian Alba Vives --- Changes in v2: - Use (size > max) instead of (size + DFHv1_PARAM_HDR > max). The previous check unnecessarily guarded against the next parameter header, which is not relevant at this point in the loop. Suggested by Xu Yilun. --- drivers/fpga/dfl.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/fpga/dfl.c b/drivers/fpga/dfl.c index 4087a36..81d7a68 100644 --- a/drivers/fpga/dfl.c +++ b/drivers/fpga/dfl.c @@ -1132,7 +1132,8 @@ static int dfh_get_param_size(void __iomem *dfh_base, resource_size_t max) return -EINVAL; size += next * sizeof(u64); - + if (size > max) + return -EINVAL; if (FIELD_GET(DFHv1_PARAM_HDR_NEXT_EOP, v)) return size; } -- 2.43.0