From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-vk1-f170.google.com (mail-vk1-f170.google.com [209.85.221.170]) (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 AD211242D89 for ; Tue, 7 Apr 2026 17:22:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.170 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775582573; cv=none; b=kuCnUvn6FKZaJ3Lk1gqMv98Zg4/BJXw/aKS9+pRh+OwuDRiCFroy4V2ChQ4LM+C2oPSkj1zz7blckxaW1kOeQcYiV2vsmtwizJ+H7ytAE5IVUfue/s+Qa0vaY9MGHWbfFhuv+b2ZYPULW7kWlCgqo/djBO6ApfcU97XKnSP2ogI= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775582573; c=relaxed/simple; bh=KDi1v7Zhzb9QhyQMTyCHXbSMRyCApqaprJEc69q0tV8=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=j0E3JcFtwhcBy3aeI1+yrLBrYp99e0To7YKroe9ymFkYWSaj6ZrS3RV5LYmPrO7LD7zXUierJLjwG0gwPxVXj2hYQkK1jKOhCpJkwBc0HYyPvyKoaJKecURa3kAJA1juEnMu9/pBUofqD+auy+T2yObAzgpko3odUhVmckAzwQc= 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=myoeg0Re; arc=none smtp.client-ip=209.85.221.170 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="myoeg0Re" Received: by mail-vk1-f170.google.com with SMTP id 71dfb90a1353d-56d8d479149so1921742e0c.2 for ; Tue, 07 Apr 2026 10:22:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1775582570; x=1776187370; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=pAd2OPO7eQX4lVfc/O2yYYdNpinA6DdggEH+CtV5kkM=; b=myoeg0ReWyyjhfb5sVXnHimvpbELSS5ZH7N1eC9Fe0ej1I78xK5/SPVjH7fpknfLKc x/gJ68CxXNJpN94N1qAr2NmpK0sE9k7+9u1EE0y3L5yWTyq/ucVOVXvOe+H4U6pSGK0h Ig+SNg9XN5qEJpKzUS/2QCpiTjTzBUVU2bHPk/BVMadIBXYsIHIgp5EL24jQi5Jf+a0r k3hwyxoS5Xb24lRhmYE43Td6B4lpjMR5KfMucbL77yGIfN+jhjmxkXt+8taPeCDFLy4v OI5dwZ30dBT3vFizXN7MyFWzKbhCyqj3zpiBtxLc2ztgveZEUEfhNIrkzqEXHcR1e+34 3PfA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775582570; x=1776187370; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=pAd2OPO7eQX4lVfc/O2yYYdNpinA6DdggEH+CtV5kkM=; b=iZWU3Ga3NhRozwFOrSm0LE8bSnAKAOyJPqlo6hn2D1ipbzI3VDslR8g91BZr8D7ZN2 exZX+XR/UASBjT/b+LlZ9vpbMLhVfOp6vdbGtMe1+IkDi3HGM4h9ukOvpzl0GPQprPU+ LctJFWUc2YwT6x6EKf/J3+GH1SV37gI3ar25ultW8cPaVR9YduuzPIFPRzaOek8ncbYH 7JPeyOjtro/cwfLVLEObX786mfc2GhfXDTA4WCwkEQ77Piinh2CtzUii6WsTvbjvxKzA k3+V4MvsLe3TaA6zYGLa1g0h5xss7yVo/VZ7AQVnwKcToQhXJSvJk6RTR/Uv7E0EWibX 05LA== X-Forwarded-Encrypted: i=1; AJvYcCVOovmzeVOWC1P2/Xn/ofz1iGcBx/wZh+tYNwceduO1D2p4r0KTM++xtOOpC4o+LWFtEbgRa02D6ujEKXE=@vger.kernel.org X-Gm-Message-State: AOJu0YxOmSv36zOPU60G9h3YSs9TDAO9JFL3eBguovNVlSdyJl3Wa7OQ qQdkyvBDqj4mjWAJ1To8pEi8nNnGI9aM36hRMcgMC0bVxWwt3d/iqcpyNxtXIWu86Ysfng== X-Gm-Gg: AeBDiesC4GrKMIqwVVEtHdmMlEvuKeNkt+8ZFbxRpvnTXyp/RFQuc0km9o61tQQ9Do5 OiSO0bnXpxXZNWOEYe/D7lp5BMPPrnzX5GiHJP6NP3fRlG8B6tUBr7hACU5VpNCLnR0QABpcB8s JXCJ5LoEqdVyP/+CtvKYe+fYz0nTZHtBd+YB6e1ynEaVaJZIkemtrTTly03L+QcgEWLUM28TPPa jDztQlpfGzaJAv/AQ3rtwVHm+wduJZn/ddyoWJGlBbWFSxxZ+uw8epmQCcNvmyHzQIMn0wr8Pr+ n5Pu20R5XDnnYYnzx1qdn+Nclt0HFVuJ3Yd2H/arGNNKx9dgf44AZWrlVvMud8CVDTk5IFgGufO ogU1+W3TzQAkXf1HC4HB8uMU0sdnmySD9s69vwE0dfMVJDCf5EWl0ioKGSj+80viL5VIfdrCIEH VBZx/rYl0LYQccxIxFbBQp3N5m X-Received: by 2002:a05:6122:7c8:b0:56a:9841:9f81 with SMTP id 71dfb90a1353d-56dab8e9fd0mr6192497e0c.6.1775582569504; Tue, 07 Apr 2026 10:22:49 -0700 (PDT) Received: from localhost.localdomain ([2a09:bac5:6d74:aa::11:155]) by smtp.gmail.com with ESMTPSA id 71dfb90a1353d-56d9bae1117sm18878435e0c.7.2026.04.07.10.22.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 07 Apr 2026 10:22:48 -0700 (PDT) From: Sebastian Alba Vives To: yilun.xu@linux.intel.com, gregkh@linuxfoundation.org Cc: linux-fpga@vger.kernel.org, conor.dooley@microchip.com, mdf@kernel.org, linux-kernel@vger.kernel.org, stable@vger.kernel.org, Sebastian Alba Vives Subject: [PATCH v4 1/3] fpga: dfl: add bounds check in dfh_get_param_size() Date: Tue, 7 Apr 2026 11:22:15 -0600 Message-ID: <20260407172230.40775-1-sebasjosue84@gmail.com> X-Mailer: git-send-email 2.43.0 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 v4: - Resubmit as full series per maintainer request. 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