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

[Xen-devel] [PATCH v3 6/8] golang/xenlight: Don't leak memory on context open failure


  • To: <xen-devel@xxxxxxxxxxxxxxxxxxxx>
  • From: George Dunlap <george.dunlap@xxxxxxxxxx>
  • Date: Fri, 17 Jan 2020 15:57:32 +0000
  • Authentication-results: esa4.hc3370-68.iphmx.com; dkim=none (message not signed) header.i=none; spf=None smtp.pra=george.dunlap@xxxxxxxxxx; spf=Pass smtp.mailfrom=George.Dunlap@xxxxxxxxxx; spf=None smtp.helo=postmaster@xxxxxxxxxxxxxxx
  • Cc: Nick Rosbrook <rosbrookn@xxxxxxxxxxxx>, George Dunlap <george.dunlap@xxxxxxxxxx>
  • Delivery-date: Fri, 17 Jan 2020 15:58:06 +0000
  • Ironport-sdr: n/vSxt2PlFiwHOZLBezxBIYcQsiPgu4Hxymjdums3JbzWCfdA7wmWik4jGN5YJLiIQkL/Qcw1M xHMfuyyskw39BuI17QFDGW8bJbQ3+aOlk8+7ia+tKoK/jlyJm0A97/N50NJYQx9cvmuum9XiaT lpFItAWLhjyld+N+pd/+C3yz/HNlthj5JoX7PAzOrxs0eSjN0xLxaIWPwDkEcC938ruNAkrsl/ OXSV6dCgIEsKEcZYE416/1K66C6wSc3vaXMP11ou+aujJpdoqjI8vv4+rMNXFHMkcpVEZNW7aU rXM=
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>

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>
---
CC: 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 0e71f6ca7d..662b266250 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_DEBUG, 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
-- 
2.24.1


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel

 


Rackspace

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