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; } };