On the success path, do not call GC_FREE explicitly. Instead, call AO_INPROGRESS.
GC_FREE will free the gc underlying the long-term ao, which is then subsequently referenced in backend_watch_callback's call to libxl__nested_ao_create. It is a miracle that this ever works at all. Also, add an `if (rc) goto out;' after the xswatch registration. After this, libxl_device_events_handler has the conventional and correct ao initiation pattern. Signed-off-by: Ian Jackson <ian.jack...@eu.citrix.com> CC: Roger Pau Monne <roger....@citrix.com> --- v2: New in this version of the series. --- tools/libxl/libxl.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index b9a1941..ae0c7e1 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -4540,11 +4540,12 @@ int libxl_device_events_handler(libxl_ctx *ctx, be_path = GCSPRINTF("/local/domain/%u/backend", domid); rc = libxl__ev_xswatch_register(gc, &ddomain.watch, backend_watch_callback, be_path); + if (rc) goto out; -out: - GC_FREE; - if (rc) return AO_ABORT(rc); return AO_INPROGRESS; + +out: + return AO_ABORT(rc); } /******************************************************************************/ -- 1.7.10.4 _______________________________________________ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel