Skip to content

Commit f014702

Browse files
jlahtine-intelgregkh
authored andcommitted
drm/i915/gem: Do not leak siblings[] on proto context error
commit eed3de2 upstream. After a successful BALANCE/PARALLEL_SUBMIT extension on context creation, error during processing of next user extension leaks the siblings[] array. Fix that. Discovered using AI-assisted static analysis confirmed by Intel Product Security. Reported-by: Martin Hodo <martin.hodo@intel.com> Fixes: d4433c7 ("drm/i915/gem: Use the proto-context to handle create parameters (v5)") Cc: Faith Ekstrand <faith.ekstrand@collabora.com> Cc: Simona Vetter <simona.vetter@ffwll.ch> Cc: Tvrtko Ursulin <tvrtko.ursulin@igalia.com> Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> Cc: <stable@vger.kernel.org> # v5.15+ Signed-off-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com> Reviewed-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> Signed-off-by: Tvrtko Ursulin <tursulin@ursulin.net> Link: https://lore.kernel.org/r/20260701073030.44850-1-joonas.lahtinen@linux.intel.com (cherry picked from commit aa65e0a) Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent 32c1a2a commit f014702

1 file changed

Lines changed: 14 additions & 8 deletions

File tree

drivers/gpu/drm/i915/gem/i915_gem_context.c

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -768,8 +768,8 @@ static int set_proto_ctx_engines(struct drm_i915_file_private *fpriv,
768768
struct intel_engine_cs *engine;
769769

770770
if (copy_from_user(&ci, &user->engines[n], sizeof(ci))) {
771-
kfree(set.engines);
772-
return -EFAULT;
771+
err = -EFAULT;
772+
goto err;
773773
}
774774

775775
memset(&set.engines[n], 0, sizeof(set.engines[n]));
@@ -785,8 +785,8 @@ static int set_proto_ctx_engines(struct drm_i915_file_private *fpriv,
785785
drm_dbg(&i915->drm,
786786
"Invalid engine[%d]: { class:%d, instance:%d }\n",
787787
n, ci.engine_class, ci.engine_instance);
788-
kfree(set.engines);
789-
return -ENOENT;
788+
err = -ENOENT;
789+
goto err;
790790
}
791791

792792
set.engines[n].type = I915_GEM_ENGINE_TYPE_PHYSICAL;
@@ -799,15 +799,21 @@ static int set_proto_ctx_engines(struct drm_i915_file_private *fpriv,
799799
set_proto_ctx_engines_extensions,
800800
ARRAY_SIZE(set_proto_ctx_engines_extensions),
801801
&set);
802-
if (err) {
803-
kfree(set.engines);
804-
return err;
805-
}
802+
if (err)
803+
goto err_extensions;
806804

807805
pc->num_user_engines = set.num_engines;
808806
pc->user_engines = set.engines;
809807

810808
return 0;
809+
810+
err_extensions:
811+
for (n = 0; n < set.num_engines; n++)
812+
kfree(set.engines[n].siblings);
813+
err:
814+
kfree(set.engines);
815+
816+
return err;
811817
}
812818

813819
static int set_proto_ctx_sseu(struct drm_i915_file_private *fpriv,

0 commit comments

Comments
 (0)