
On 09.05.2013 23:17, Jesse J. Cook wrote:
From: "Jesse J. Cook" <jesse.j.cook@member.fsf.org>
In the domain-events example C code virEventRegisterDefaultImpl was being called before virConnectOpen without first calling virInitialize. While this code worked, it is incorrect. Adding a call to g_string_new prior to the call to virEventRegisterDefaultImpl would cause the code to break. This fix will help avoid unintentional misue of the API.
Not even g_string_new but even our doc require virInitialize to be called prior any libvirt API other than virConnectOpen*(). This rule includes VirEventRegisterDefaultImpl().
Relates to: Ret Hat Bugzilla - Bug 961155 --- examples/domain-events/events-c/event-test.c | 6 ++++++ 1 file changed, 6 insertions(+)
diff --git a/examples/domain-events/events-c/event-test.c b/examples/domain-events/events-c/event-test.c index ede9796..09ec6aa 100644 --- a/examples/domain-events/events-c/event-test.c +++ b/examples/domain-events/events-c/event-test.c @@ -468,6 +468,12 @@ int main(int argc, char **argv) return -1; }
+ if(0 != virInitialize()) {
Actually, we prefer the other way: if (virInitialize() < 0) {
+ virErrorPtr err = virGetLastError(); + fprintf(stderr, "Failed to initialize: %s\n", + err && err->message ? err->message: "Unknown error");
s/:/ :/ Moreover, we should return here, shouldn't we? And are we save to call virGetLastError()? I don't think so. I mean, the first thing that virInitialize() does, is thread library initialize (on linux it's nada function, but not on windows), then it initialize thread local variable - the virError object. And what if this fails for some reason - then virgetLastError may access invalid memory. So I thing we should just fprintf(stderr, "Failed to initialize libvirt");
+ } + virEventRegisterDefaultImpl();
virConnectPtr dconn = NULL;
However, this is a nasty violation of our own rules, so ACK with this squashed in: diff --git a/examples/domain-events/events-c/event-test.c b/examples/domain-events/events-c/event-test.c index 09ec6aa..0f7be55 100644 --- a/examples/domain-events/events-c/event-test.c +++ b/examples/domain-events/events-c/event-test.c @@ -468,10 +468,9 @@ int main(int argc, char **argv) return -1; } - if(0 != virInitialize()) { - virErrorPtr err = virGetLastError(); - fprintf(stderr, "Failed to initialize: %s\n", - err && err->message ? err->message: "Unknown error"); + if (virInitialize() < 0) { + fprintf(stderr, "Failed to initialize libvirt"); + return -1; } virEventRegisterDefaultImpl(); Michal