[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH] qemu-coroutine-sleep: Silence Coverity warning
From: |
Vladimir Sementsov-Ogievskiy |
Subject: |
Re: [PATCH] qemu-coroutine-sleep: Silence Coverity warning |
Date: |
Tue, 12 Nov 2019 10:08:25 +0000 |
11.11.2019 23:35, Eric Blake wrote:
> Coverity warns that we store the address of a stack variable through a
> pointer passed in by the caller, which would let the caller trivially
> trigger use-after-free if that stored value is still present when we
> finish execution. However, the way coroutines work is that after our
> call to qemu_coroutine_yield(), control is temporarily continued in
> the caller prior to our function concluding, and in order to resume
> our coroutine, the caller must poll until the variable has been set to
> NULL. Thus, we can add an assert that we do not leak stack storage to
> the caller on function exit.
>
> Fixes: Coverity CID 1406474
Hmm, I doubt that it will fix it.. Do Coverity pay attention to assertions?
> CC: Peter Maydell <address@hidden>
> Signed-off-by: Eric Blake <address@hidden>
> ---
>
> I don't know if this actually shuts Coverity up; Peter, since you
> reported the Coverity issue, are you in a better position to test if
> this makes a difference? At any rate, the tests still pass after
> this is in place.
>
> I'm not sure if the compiler wants us to insert a 'volatile' in any
> of our uses of QemuCoSleepState.user_state_pointer.
>
> util/qemu-coroutine-sleep.c | 7 +++++++
> 1 file changed, 7 insertions(+)
>
> diff --git a/util/qemu-coroutine-sleep.c b/util/qemu-coroutine-sleep.c
> index ae91b92b6e78..769a76e57df0 100644
> --- a/util/qemu-coroutine-sleep.c
> +++ b/util/qemu-coroutine-sleep.c
> @@ -68,5 +68,12 @@ void coroutine_fn qemu_co_sleep_ns_wakeable(QEMUClockType
> type, int64_t ns,
> }
> timer_mod(state.ts, qemu_clock_get_ns(type) + ns);
> qemu_coroutine_yield();
> + if (sleep_state) {
> + /*
> + * Note that *sleep_state is cleared during qemu_co_sleep_wake
> + * before resuming this coroutine.
> + */
> + assert(*sleep_state == NULL);
> + }
Hmm.. sleep_state is not owned by this code, and this is possible that user of
the API may want
to reuse the variable (for another call to qemu_co_sleep_ns_wakeable)
immediately after calling
qemu_co_sleep_wake (which don't call qemu_coroutine_enter but aio_co_wake)..
Seems, current usage in nbd code is not the case, so we may add this assertion,
but I'd add a comment
to qemu_co_sleep_ns_wakeable, that sleep_state must not be reused until
qemu_co_sleep_ns_wakeable
finish.. It seems obvious, but actually it isn't, keeping in mind that
qemu_co_sleep_wake() call
may be interpreted as a point where sleep_state is freed..
> timer_free(state.ts);
> }
>
--
Best regards,
Vladimir