From 96b147b63d495d5d760bb6370176aefb70680023 Mon Sep 17 00:00:00 2001 From: Sebastian Sumpf Date: Wed, 6 Jul 2022 18:57:03 +0200 Subject: [PATCH] dde_linux/usb/legacy: only free completed URBs In case a USB client cancelled URBs, do not free them, wait until the packets/URBs are acked by the USB session. issue #4557 --- repos/dde_linux/src/include/legacy/lx_emul/impl/usb.h | 5 ++++- repos/dde_linux/src/include/legacy/lx_kit/usb.h | 6 ++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/repos/dde_linux/src/include/legacy/lx_emul/impl/usb.h b/repos/dde_linux/src/include/legacy/lx_emul/impl/usb.h index e4ff16a6c0..2789a9e29c 100644 --- a/repos/dde_linux/src/include/legacy/lx_emul/impl/usb.h +++ b/repos/dde_linux/src/include/legacy/lx_emul/impl/usb.h @@ -112,7 +112,6 @@ int usb_submit_urb(struct urb *urb, gfp_t mem_flags) return 0; } - void usb_free_urb(struct urb *urb) { if (!urb) @@ -121,6 +120,10 @@ void usb_free_urb(struct urb *urb) /* free 'Urb' object */ if (urb->hcpriv) { Urb *u = (Urb*)urb->hcpriv; + + /* URB is not fred through packet stream */ + if (u->completed() == false) return; + u->~Urb(); kfree(urb->hcpriv); } diff --git a/repos/dde_linux/src/include/legacy/lx_kit/usb.h b/repos/dde_linux/src/include/legacy/lx_kit/usb.h index d9976b6cdd..6d503b0efe 100644 --- a/repos/dde_linux/src/include/legacy/lx_kit/usb.h +++ b/repos/dde_linux/src/include/legacy/lx_kit/usb.h @@ -139,10 +139,12 @@ class Urb : public Usb::Completion } } - if (_urb.complete) _urb.complete(&_urb); - _completed = true; + + if (_urb.complete) _urb.complete(&_urb); } + + bool completed() const { return _completed; } };