drm_sched_job_add_syncobj_dependency() returns -ENOENT both when the
handle is zero and when the handle is non-zero but does not find a
corresponding existing syncobj (userspace bug). The driver previously
ignored -ENOENT in both cases, silently accepting broken handles.

Distinguish the two: skip the call entirely when the handle is zero, as
there is no dependency, and let -ENOENT propagate for non-zero handles
that don't resolve, turning the error into a proper return to userspace.

Reviewed-by: Tvrtko Ursulin <[email protected]>
Signed-off-by: Maíra Canal <[email protected]>
---
 drivers/gpu/drm/v3d/v3d_submit.c | 23 ++++++++++++-----------
 1 file changed, 12 insertions(+), 11 deletions(-)

diff --git a/drivers/gpu/drm/v3d/v3d_submit.c b/drivers/gpu/drm/v3d/v3d_submit.c
index f9231a87b963..30cb94ee1a2a 100644
--- a/drivers/gpu/drm/v3d/v3d_submit.c
+++ b/drivers/gpu/drm/v3d/v3d_submit.c
@@ -171,12 +171,11 @@ v3d_job_add_syncobjs(struct v3d_job *job, struct drm_file 
*file_priv,
        int ret = 0;
 
        if (!has_multisync) {
-               ret = drm_sched_job_add_syncobj_dependency(&job->base, 
file_priv,
-                                                          in_sync, 0);
-               // TODO: Investigate why this was filtered out for the IOCTL.
-               if (ret && ret != -ENOENT)
-                       return ret;
-               return 0;
+               /* Ignore syncobj if its handle is zero */
+               if (in_sync)
+                       ret = drm_sched_job_add_syncobj_dependency(&job->base, 
file_priv,
+                                                                  in_sync, 0);
+               return ret;
        }
 
        if (se->in_sync_count && se->wait_stage == queue) {
@@ -190,11 +189,13 @@ v3d_job_add_syncobjs(struct v3d_job *job, struct drm_file 
*file_priv,
                                return -EFAULT;
                        }
 
-                       ret = drm_sched_job_add_syncobj_dependency(&job->base,
-                                                                  file_priv, 
in.handle, 0);
-                       // TODO: Investigate why this was filtered out for the 
IOCTL.
-                       if (ret && ret != -ENOENT)
-                               return ret;
+                       /* Ignore syncobj if its handle is zero */
+                       if (in.handle) {
+                               ret = 
drm_sched_job_add_syncobj_dependency(&job->base,
+                                                                          
file_priv, in.handle, 0);
+                               if (ret)
+                                       return ret;
+                       }
                }
        }
 

-- 
2.54.0

Reply via email to