On 09.05.2013 23:17, Jesse J. Cook wrote:
From: "Jesse J. Cook" <jesse.j.cook(a)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