[libvirt] [PATCH v2] util: set OOM in virCopyLastError if error is not set

John Ferlan jferlan at redhat.com
Mon Jul 16 22:38:16 UTC 2018



On 07/02/2018 07:33 AM, Nikolay Shirokovskiy wrote:
> virCopyLastError is intended to be used after last error is set.
> However due to virLastErrorObject failures (very unlikely through
> as thread local error is allocated on first use) we can have zero
> fields in a copy as a result. In particular code field can be set
> to VIR_ERR_OK.
> 
> In some places (qemu monitor, qemu agent and qemu migaration code
> for example) we use copy result as a flag and this leads to bugs.
> 
> Let's set OOM-like error in copy in case of virLastErrorObject failures.
> 
> Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy at virtuozzo.com>
> ---
> 
> Changes from v1:
> - check @to
> - set OMM error instead of using virErrorGenericFailure
> 
>  src/util/virerror.c | 16 +++++++++++-----
>  1 file changed, 11 insertions(+), 5 deletions(-)
> 
> diff --git a/src/util/virerror.c b/src/util/virerror.c
> index f198f27..737ea92 100644
> --- a/src/util/virerror.c
> +++ b/src/util/virerror.c
> @@ -366,19 +366,25 @@ virSetError(virErrorPtr newerr)
>   *
>   * One will need to free the result with virResetError()
>   *
> - * Returns 0 if no error was found and the error code otherwise and -1 in case
> - *         of parameter error.
> + * Returns error code or -1 in case of parameter error.
>   */
>  int
>  virCopyLastError(virErrorPtr to)
>  {
>      virErrorPtr err = virLastErrorObject();
> +
> +    if (!to)
> +        return -1;
> +
>      /* We can't guarantee caller has initialized it to zero */
>      memset(to, 0, sizeof(*to));
> -    if (err)
> +    if (err) {
>          virCopyError(err, to);
> -    else
> -        virResetError(to);
> +    } else {
> +        to->code = VIR_ERR_NO_MEMORY;
> +        to->domain = VIR_FROM_NONE;
> +        to->level = VIR_ERR_ERROR;

Should we do a VIR_FREE(to->message); so that nothing that was there
before somehow remains... I don't think either agent or monitor
"lastError" is reset until Dispose time.

Beyond that, I think this works for this edge/odd/bad case...

Reviewed-by: John Ferlan <jferlan at redhat.com>

John

> +    }
>      return to->code;
>  }
>  
> 




More information about the libvir-list mailing list