[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v4 01/14] golang/xenlight: Create stub package
On Thu, Mar 16, 2017 at 7:08 PM, Ronald Rojas <ronladred@xxxxxxxxx> wrote: > Create a basic Makefile to build and install libxenlight Golang > bindings. Also add a stub package which only opens libxl context. > > Include a global xenlight.Ctx variable which can be used as the > default context by the entire program if desired. > > For now, return simple errors. Proper error handling will be > added in next patch. > > Signed-off-by: Ronald Rojas <ronladred@xxxxxxxxx> > Signed-off-by: George Dunlap <george.dunlap@xxxxxxxxxx> Almost there. One comment on one of the last changes... > +/* > + * Types: Builtins > + */ > +type Context struct { > + ctx *C.libxl_ctx > +} The way the libxl interface here is designed, in theory a single program could have multiple instances of libxl_ctx open at the same time; this interface follows that lead, in the sense that you could certainly write something like this: var contexts [10]xenlight.Ctx for i := range contexts { err = context[i].Open ... } [do stuff] for i := range context { err = context[i].Close() ... } Unfortunately... > + > +/* > + * Context > + */ > +var Ctx Context > + > +var logger *C.xentoollog_logger_stdiostream > + > +func (Ctx *Context) IsOpen() bool { > + return Ctx.ctx != nil > +} > + > +func (Ctx *Context) Open() (err error) { > + if Ctx.ctx != nil { > + return > + } > + > + logger = C.xtl_createlogger_stdiostream(C.stderr, C.XTL_ERROR, 0) ...this means that in the above code you'd leak 9 of the 10 loggers, and... > + ret := C.libxl_ctx_alloc(&Ctx.ctx, C.LIBXL_VERSION, > + 0, unsafe.Pointer(logger)) > + > + if ret != 0 { > + err = fmt.Errorf("Error: %d", -ret) > + } > + return > +} > + > +func (Ctx *Context) Close() (err error) { > + ret := C.libxl_ctx_free(Ctx.ctx) > + Ctx.ctx = nil > + > + if ret != 0 { > + err = fmt.Errorf("Error: %d", -ret) > + } > + C.xtl_logger_destroy(unsafe.Pointer(logger)) ...at this point you'd repeatedly call destroy() on that 9th pointer value 10 times, which usually leads to not very entertaining results. I think we want xenlight.Ctx to contain all the information needed to open and close it; as long as we're creating a logger automatically, we should store the pointer to the logger in the Ctx struct. We should also set the pointer to nil after calling xtl_logger_destroy() to prevent use-after-free bugs. (Yay lack of garbage collection again.) -George _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |