15.03.2021 09:06, Roman Kagan wrote:
> When the NBD connection is being torn down, the connection thread gets
> canceled and "detached", meaning it is about to get freed.
>
> If this happens while the connection coroutine yielded waiting for the
> connection thread to complete, when it resumes it may access the
> invalidated connection thread data.
>
> To prevent this, revalidate the ->connect_thread pointer in
> nbd_co_establish_connection_cancel before using after the the yield.
>
> Signed-off-by: Roman Kagan <rvkagan@yandex-team.ru>
> ---
> block/nbd.c | 9 +++++++++
> 1 file changed, 9 insertions(+)
>
> diff --git a/block/nbd.c b/block/nbd.c
> index c26dc5a54f..447d176b76 100644
> --- a/block/nbd.c
> +++ b/block/nbd.c
> @@ -486,6 +486,15 @@ nbd_co_establish_connection(BlockDriverState *bs, Error **errp)
> s->wait_connect = true;
> qemu_coroutine_yield();
>
> + /*
> + * If nbd_co_establish_connection_cancel had a chance to run it may have
> + * invalidated ->connect_thread.
> + */
> + thr = s->connect_thread;
> + if (!thr) {
> + return -ECONNABORTED;
nbd_co_establish_connection() tends to return -1 or 0, not -errno, so -1 is better here. Still it doesn't really matter.
> + }
> +
> qemu_mutex_lock(&thr->mutex);
>
> switch (thr->state) {
>
--
Best regards,
Vladimir