On 4/3/23 16:22, Emil Velikov wrote: > On Mon, 3 Apr 2023 at 14:00, Emil Velikov <emil.l.velikov@xxxxxxxxx> wrote: > >>>> I think we should zero num_(in|out)_syncobjs when the respective parse >>>> fails. Otherwise we get one "cleanup" within the parse function itself >>>> and a second during the cleanup_submit. Haven't looked at it too closely >>>> but I suspect that will trigger an UAF or two. >>> >>> There are checks for NULL pointers in the code that will prevent the >>> UAF. I'll add zeroing of the nums for more consistency. >>> >> >> Riiiight the drm_syncobj is attached to the encapsulating struct >> virtio_gpu_submit _only_ on success. >> By clearing the num variables, the NULL checks will no longer be >> needed ... in case you'd want to drop that. >> >> Either way - even as-is the code is safe. >> > > Err or not. The NULL check itself will cause NULL pointer deref. > > In more detail: in/out syncobjs are memset() to NULL in > virtio_gpu_init_submit(). The virtio_gpu_parse_(|post_)deps() will > fail and leave them unchanged. Then virtio_gpu_free_syncobjs() and > virtio_gpu_reset_syncobjs() will trigger a NULL ptr deref, because > they are accessing the elements of a the (NULL) array. > > Apart from the num_(in|out)_syncobjcs=0, I would drop the NULL checks > - they give a false sense of security IMHO. The reset/free are both under the NULL check on cleanup. I think it should work okay on error. Will improve it anyways to make more intuitive. Thanks! static void virtio_gpu_cleanup_submit(struct virtio_gpu_submit *submit) { if (submit->in_syncobjs) { virtio_gpu_reset_syncobjs(submit->in_syncobjs, submit->num_in_syncobjs); virtio_gpu_free_syncobjs(submit->in_syncobjs, submit->num_in_syncobjs); } -- Best regards, Dmitry