On 01/13/2010 04:23 AM, Daniel P. Berrange wrote: > On Tue, Jan 12, 2010 at 03:57:33PM -0500, Cole Robinson wrote: >> On 01/12/2010 03:48 PM, Daniel P. Berrange wrote: >>> On Tue, Jan 12, 2010 at 03:26:28PM -0500, Cole Robinson wrote: >>>> Since virDispatchError is now responsible for invoking the error callback, >>>> give it the same semantics as ReportError, which will skip VIR_ERR_OK >>>> (which is encountered when no error was raised). >>>> >>>> This fixes invoking the error callback after every non-erroring API call. >>>> >>>> Signed-off-by: Cole Robinson <crobinso@xxxxxxxxxx> >>>> --- >>>> src/util/virterror.c | 6 +++++- >>>> 1 files changed, 5 insertions(+), 1 deletions(-) >>>> >>>> diff --git a/src/util/virterror.c b/src/util/virterror.c >>>> index e2128b9..78974ee 100644 >>>> --- a/src/util/virterror.c >>>> +++ b/src/util/virterror.c >>>> @@ -603,8 +603,12 @@ virDispatchError(virConnectPtr conn) >>>> if (!err) >>>> return; >>>> >>>> - /* Set a generic error message if none is already set */ >>>> + /* We never used to raise ERR_OK, so maintain existing behavior */ >>>> if (err->code == VIR_ERR_OK) >>>> + return; >>>> + >>>> + /* Set a generic error message if none is already set */ >>>> + if (!err->message) >>>> virErrorGenericFailure(err); >>>> >>>> /* Copy the global error to per-connection error if needed */ >>> >>> We should only ever be invoking virDispatchError() in error paths, so >>> if err->code == VIR_ERR_OK, this means we do need set a generic message >>> because the earlier code indicated an error but forgot to report one. >>> So I don't think this is correct. >>> >> >> Ah, I think I wanted to check VIR_ERR_NONE here actually. >> virDispatchError is called regardless of whether an error is actually >> raised, so it may receive a zero'd out/empty virLastErrorObject, which >> is what I'm trying to avoid reporting. > > I still don't think you are correct in that. If you run > > # grep --after 1 virDispatchError libvirt.c > virDispatchError(NULL); > return (-1); > -- > virDispatchError(net->conn); > return -1; > -- > virDispatchError(NULL); > return (-1); > -- > virDispatchError(pool->conn); > return -1; > > Then all cases where virDispatchError() is called should be followed by the > return of an error code, 99% of them are -1 or NULL. There are one or two > where we use '0' for error as a special case. I don't see any places where > virDispatchError() is called in a successful return path. So we should > always be invoking the error callback, and ensuring an error is actually > set before doing so. > Whoops, sorry for the confusion. I'll investigate more. Thanks, Cole -- Libvir-list mailing list Libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list