diff --git a/hw/vfio-user/proxy.c b/hw/vfio-user/proxy.c index f2601eada5..314dfd23d8 100644 --- a/hw/vfio-user/proxy.c +++ b/hw/vfio-user/proxy.c @@ -412,11 +412,22 @@ err: for (i = 0; i < numfds; i++) { close(fdp[i]); } - if (isreply && msg != NULL) { - /* force an error to keep sending thread from hanging */ - vfio_user_set_error(msg->hdr, EINVAL); - msg->complete = true; - qemu_cond_signal(&msg->cv); + if (msg != NULL) { + if (msg->type == VFIO_MSG_REQ) { + /* + * Clean up the request message on failure. Change type back to + * NOWAIT to free. + */ + msg->type = VFIO_MSG_NOWAIT; + vfio_user_recycle(proxy, msg); + } else { + /* + * Report an error back to the sender. Sender will recycle msg. + */ + vfio_user_set_error(msg->hdr, EINVAL); + msg->complete = true; + qemu_cond_signal(&msg->cv); + } } return -1; }