mirror of
https://github.com/libvirt/libvirt.git
synced 2026-08-19 01:24:42 -05:00
util: set OOM in virCopyLastError if error is not set
virCopyLastError is intended to be used after last error is set. However due to virLastErrorObject failures (very unlikely though 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@virtuozzo.com>
This commit is contained in:
+1
-1
Submodule .gnulib updated: cdbf3d385a...d6397dde2e
+11
-4
@@ -366,19 +366,26 @@ 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
|
||||
} else {
|
||||
virResetError(to);
|
||||
to->code = VIR_ERR_NO_MEMORY;
|
||||
to->domain = VIR_FROM_NONE;
|
||||
to->level = VIR_ERR_ERROR;
|
||||
}
|
||||
return to->code;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user