Skip to content

Commit 3a390a2

Browse files
committed
Merge tag 'drm-misc-fixes-2026-01-29' of https://gitlab.freedesktop.org/drm/misc/kernel into drm-fixes
drm-misc-fixes for v6.19-rc8: - Fix a WARN_ON() when passing an invalid handle to drm_gem_change_handle_ioctl() - drop ddc device reference when unloading in imx/tve. Signed-off-by: Dave Airlie <airlied@redhat.com> From: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> Link: https://patch.msgid.link/a34d967e-b111-4b29-8c97-af3e77b5d33e@linux.intel.com
2 parents 016bf66 + e535c23 commit 3a390a2

2 files changed

Lines changed: 25 additions & 6 deletions

File tree

drivers/gpu/drm/drm_gem.c

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -960,35 +960,41 @@ int drm_gem_change_handle_ioctl(struct drm_device *dev, void *data,
960960
{
961961
struct drm_gem_change_handle *args = data;
962962
struct drm_gem_object *obj;
963-
int ret;
963+
int handle, ret;
964964

965965
if (!drm_core_check_feature(dev, DRIVER_GEM))
966966
return -EOPNOTSUPP;
967967

968+
/* idr_alloc() limitation. */
969+
if (args->new_handle > INT_MAX)
970+
return -EINVAL;
971+
handle = args->new_handle;
972+
968973
obj = drm_gem_object_lookup(file_priv, args->handle);
969974
if (!obj)
970975
return -ENOENT;
971976

972-
if (args->handle == args->new_handle) {
977+
if (args->handle == handle) {
973978
ret = 0;
974979
goto out;
975980
}
976981

977982
mutex_lock(&file_priv->prime.lock);
978983

979984
spin_lock(&file_priv->table_lock);
980-
ret = idr_alloc(&file_priv->object_idr, obj,
981-
args->new_handle, args->new_handle + 1, GFP_NOWAIT);
985+
ret = idr_alloc(&file_priv->object_idr, obj, handle, handle + 1,
986+
GFP_NOWAIT);
982987
spin_unlock(&file_priv->table_lock);
983988

984989
if (ret < 0)
985990
goto out_unlock;
986991

987992
if (obj->dma_buf) {
988-
ret = drm_prime_add_buf_handle(&file_priv->prime, obj->dma_buf, args->new_handle);
993+
ret = drm_prime_add_buf_handle(&file_priv->prime, obj->dma_buf,
994+
handle);
989995
if (ret < 0) {
990996
spin_lock(&file_priv->table_lock);
991-
idr_remove(&file_priv->object_idr, args->new_handle);
997+
idr_remove(&file_priv->object_idr, handle);
992998
spin_unlock(&file_priv->table_lock);
993999
goto out_unlock;
9941000
}

drivers/gpu/drm/imx/ipuv3/imx-tve.c

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -528,6 +528,13 @@ static const struct component_ops imx_tve_ops = {
528528
.bind = imx_tve_bind,
529529
};
530530

531+
static void imx_tve_put_device(void *_dev)
532+
{
533+
struct device *dev = _dev;
534+
535+
put_device(dev);
536+
}
537+
531538
static int imx_tve_probe(struct platform_device *pdev)
532539
{
533540
struct device *dev = &pdev->dev;
@@ -549,6 +556,12 @@ static int imx_tve_probe(struct platform_device *pdev)
549556
if (ddc_node) {
550557
tve->ddc = of_find_i2c_adapter_by_node(ddc_node);
551558
of_node_put(ddc_node);
559+
if (tve->ddc) {
560+
ret = devm_add_action_or_reset(dev, imx_tve_put_device,
561+
&tve->ddc->dev);
562+
if (ret)
563+
return ret;
564+
}
552565
}
553566

554567
tve->mode = of_get_tve_mode(np);

0 commit comments

Comments
 (0)