[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [xen staging] golang/xenlight: Don't leak memory on context open failure



commit 682d0459c35d9a3616a6a5dfc03ac39d0dfe9e56
Author:     George Dunlap <george.dunlap@xxxxxxxxxx>
AuthorDate: Fri Jan 17 14:01:05 2020 +0000
Commit:     George Dunlap <george.dunlap@xxxxxxxxxx>
CommitDate: Tue Jan 21 17:48:24 2020 +0000

    golang/xenlight: Don't leak memory on context open failure
    
    If libxl_ctx_alloc() returns an error, we need to destroy the logger
    that we made.
    
    Restructure the Close() method such that it checks for each resource
    to be freed and then frees it.  This allows Close() to be come
    idempotent, as well as to be a useful clean-up to a partially-created
    context.
    
    Signed-off-by: George Dunlap <george.dunlap@xxxxxxxxxx>
    Reviewed-by: Nick Rosbrook <rosbrookn@xxxxxxxxxxxx>
---
 tools/golang/xenlight/xenlight.go | 30 +++++++++++++++++++++---------
 1 file changed, 21 insertions(+), 9 deletions(-)

diff --git a/tools/golang/xenlight/xenlight.go 
b/tools/golang/xenlight/xenlight.go
index aa1e63a61a..3f1b0baa0c 100644
--- a/tools/golang/xenlight/xenlight.go
+++ b/tools/golang/xenlight/xenlight.go
@@ -79,28 +79,40 @@ type Context struct {
 }
 
 // NewContext returns a new Context.
-func NewContext() (*Context, error) {
-       var ctx Context
+func NewContext() (ctx *Context, err error) {
+       ctx = &Context{}
+
+       defer func() {
+               if err != nil {
+                       ctx.Close()
+                       ctx = nil
+               }
+       }()
 
        ctx.logger = C.xtl_createlogger_stdiostream(C.stderr, C.XTL_ERROR, 0)
 
        ret := C.libxl_ctx_alloc(&ctx.ctx, C.LIBXL_VERSION, 0,
                (*C.xentoollog_logger)(unsafe.Pointer(ctx.logger)))
        if ret != 0 {
-               return nil, Error(ret)
+               return ctx, Error(ret)
        }
 
-       return &ctx, nil
+       return ctx, nil
 }
 
 // Close closes the Context.
 func (ctx *Context) Close() error {
-       ret := C.libxl_ctx_free(ctx.ctx)
-       ctx.ctx = nil
-       C.xtl_logger_destroy((*C.xentoollog_logger)(unsafe.Pointer(ctx.logger)))
+       if ctx.ctx != nil {
+               ret := C.libxl_ctx_free(ctx.ctx)
+               if ret != 0 {
+                       return Error(ret)
+               }
+               ctx.ctx = nil
+       }
 
-       if ret != 0 {
-               return Error(ret)
+       if ctx.logger != nil {
+               
C.xtl_logger_destroy((*C.xentoollog_logger)(unsafe.Pointer(ctx.logger)))
+               ctx.logger = nil
        }
 
        return nil
--
generated by git-patchbot for /home/xen/git/xen.git#staging

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/xen-changelog

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.