mirror of
https://github.com/torvalds/linux.git
synced 2026-07-28 18:21:24 +02:00
iommufd: Set veventq_depth upper bound
iommufd_veventq_alloc() accepts any !0 veventq_depth from userspace, with
an upper bound at U32_MAX.
This leaves a vulnerability where userspace can allocate excessively large
queues to exhaust kernel memory reserves.
Cap the veventq_depth (maximum number of entries) to 1 << 19, matching the
maximum number of entries in the SMMUv3 EVTQ (the largest use case today).
Fixes: e36ba5ab80 ("iommufd: Add IOMMUFD_OBJ_VEVENTQ and IOMMUFD_CMD_VEVENTQ_ALLOC")
Link: https://patch.msgid.link/r/8426cbaa5e8294472ec7f076ef427cc473be5985.1779408671.git.nicolinc@nvidia.com
Cc: stable@vger.kernel.org
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Signed-off-by: Nicolin Chen <nicolinc@nvidia.com>
Reviewed-by: Kevin Tian <kevin.tian@intel.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
This commit is contained in:
parent
47443565d1
commit
6ebf2eb46f
|
|
@ -473,6 +473,9 @@ int iommufd_fault_iopf_handler(struct iopf_group *group)
|
|||
static const struct file_operations iommufd_veventq_fops =
|
||||
INIT_EVENTQ_FOPS(iommufd_veventq_fops_read, NULL);
|
||||
|
||||
/* An arbitrary upper bound for veventq_depth that fits all existing HWs */
|
||||
#define VEVENTQ_MAX_DEPTH (1U << 19)
|
||||
|
||||
int iommufd_veventq_alloc(struct iommufd_ucmd *ucmd)
|
||||
{
|
||||
struct iommu_veventq_alloc *cmd = ucmd->cmd;
|
||||
|
|
@ -484,7 +487,7 @@ int iommufd_veventq_alloc(struct iommufd_ucmd *ucmd)
|
|||
if (cmd->flags || cmd->__reserved ||
|
||||
cmd->type == IOMMU_VEVENTQ_TYPE_DEFAULT)
|
||||
return -EOPNOTSUPP;
|
||||
if (!cmd->veventq_depth)
|
||||
if (!cmd->veventq_depth || cmd->veventq_depth > VEVENTQ_MAX_DEPTH)
|
||||
return -EINVAL;
|
||||
|
||||
viommu = iommufd_get_viommu(ucmd, cmd->viommu_id);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user