Skip to content

Commit 2473ac3

Browse files
avasummergregkh
authored andcommitted
drm/nouveau: fix reversed error cleanup order in ucopy functions
commit ab99ead upstream. nouveau_uvmm_vm_bind_ucopy() and nouveau_exec_ucopy() place their error cleanup labels in allocation order rather than reverse allocation order. On a u_memcpya() failure for in_sync.s, the goto to err_free_ops (or err_free_pushs) frees the first allocation and then falls through to err_free_ins, which calls u_free() on args->in_sync.s. Since args->in_sync.s still holds the ERR_PTR returned by the failed u_memcpya(), and ERR_PTR values are not caught by ZERO_OR_NULL_PTR(), kvfree() proceeds to dereference it, which can result in a kernel oops. A failure for out_sync.s instead jumps to err_free_ins and skips freeing the first allocation, leading to a memory leak. Fix by swapping the cleanup label order so resources are freed in the correct reverse allocation sequence. Fixes: b88baab ("drm/nouveau: implement new VM_BIND uAPI") Reported-by: Yuhao Jiang <danisjiang@gmail.com> Cc: stable@vger.kernel.org Signed-off-by: Junrui Luo <moonafterrain@outlook.com> Link: https://patch.msgid.link/SYBPR01MB7881484D91A6F80271415F71AF1A2@SYBPR01MB7881.ausprd01.prod.outlook.com Signed-off-by: Danilo Krummrich <dakr@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent 3f19095 commit 2473ac3

2 files changed

Lines changed: 4 additions & 4 deletions

File tree

drivers/gpu/drm/nouveau/nouveau_exec.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -353,10 +353,10 @@ nouveau_exec_ucopy(struct nouveau_exec_job_args *args,
353353

354354
return 0;
355355

356-
err_free_pushs:
357-
u_free(args->push.s);
358356
err_free_ins:
359357
u_free(args->in_sync.s);
358+
err_free_pushs:
359+
u_free(args->push.s);
360360
return ret;
361361
}
362362

drivers/gpu/drm/nouveau/nouveau_uvmm.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1730,10 +1730,10 @@ nouveau_uvmm_vm_bind_ucopy(struct nouveau_uvmm_bind_job_args *args,
17301730

17311731
return 0;
17321732

1733-
err_free_ops:
1734-
u_free(args->op.s);
17351733
err_free_ins:
17361734
u_free(args->in_sync.s);
1735+
err_free_ops:
1736+
u_free(args->op.s);
17371737
return ret;
17381738
}
17391739

0 commit comments

Comments
 (0)