From patchwork Fri Jan 17 15:57:32 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: George Dunlap X-Patchwork-Id: 11339507 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 302B592A for ; Fri, 17 Jan 2020 15:58:59 +0000 (UTC) Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 0BCD52064C for ; Fri, 17 Jan 2020 15:58:59 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=citrix.com header.i=@citrix.com header.b="QmkY0szO" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 0BCD52064C Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=citrix.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=xen-devel-bounces@lists.xenproject.org Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1isU0c-0002aN-Eh; Fri, 17 Jan 2020 15:58:06 +0000 Received: from us1-rack-iad1.inumbo.com ([172.99.69.81]) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1isU0b-0002Zp-AP for xen-devel@lists.xenproject.org; Fri, 17 Jan 2020 15:58:05 +0000 X-Inumbo-ID: 1cd576f8-3942-11ea-b833-bc764e2007e4 Received: from esa4.hc3370-68.iphmx.com (unknown [216.71.155.144]) by us1-rack-iad1.inumbo.com (Halon) with ESMTPS id 1cd576f8-3942-11ea-b833-bc764e2007e4; Fri, 17 Jan 2020 15:57:50 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=citrix.com; s=securemail; t=1579276670; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=MBs6V8s3hLnXcrUbnYa2dDVmTmQfIxPcUoGbkPwkuxQ=; b=QmkY0szOF8p9bBki9j/rPVt0hY0bS0xpWgBYl1UeC7CaEM8JkSpvssAb iVYMhkDDMZkOeNWYWrrlgk+pbixi1fjAJtryls/2Y0LsQGmvR1UhOM52E oH3CzgUhElFvdE1y1f5tew+dewHsUb+sC6t4ZUh33wNet9gBh+ld+2M/6 Q=; Authentication-Results: esa4.hc3370-68.iphmx.com; dkim=none (message not signed) header.i=none; spf=None smtp.pra=george.dunlap@citrix.com; spf=Pass smtp.mailfrom=George.Dunlap@citrix.com; spf=None smtp.helo=postmaster@mail.citrix.com Received-SPF: None (esa4.hc3370-68.iphmx.com: no sender authenticity information available from domain of george.dunlap@citrix.com) identity=pra; client-ip=162.221.158.21; receiver=esa4.hc3370-68.iphmx.com; envelope-from="George.Dunlap@citrix.com"; x-sender="george.dunlap@citrix.com"; x-conformance=sidf_compatible Received-SPF: Pass (esa4.hc3370-68.iphmx.com: domain of George.Dunlap@citrix.com designates 162.221.158.21 as permitted sender) identity=mailfrom; client-ip=162.221.158.21; receiver=esa4.hc3370-68.iphmx.com; envelope-from="George.Dunlap@citrix.com"; x-sender="George.Dunlap@citrix.com"; x-conformance=sidf_compatible; x-record-type="v=spf1"; x-record-text="v=spf1 ip4:209.167.231.154 ip4:178.63.86.133 ip4:195.66.111.40/30 ip4:85.115.9.32/28 ip4:199.102.83.4 ip4:192.28.146.160 ip4:192.28.146.107 ip4:216.52.6.88 ip4:216.52.6.188 ip4:162.221.158.21 ip4:162.221.156.83 ip4:168.245.78.127 ~all" Received-SPF: None (esa4.hc3370-68.iphmx.com: no sender authenticity information available from domain of postmaster@mail.citrix.com) identity=helo; client-ip=162.221.158.21; receiver=esa4.hc3370-68.iphmx.com; envelope-from="George.Dunlap@citrix.com"; x-sender="postmaster@mail.citrix.com"; x-conformance=sidf_compatible IronPort-SDR: n/vSxt2PlFiwHOZLBezxBIYcQsiPgu4Hxymjdums3JbzWCfdA7wmWik4jGN5YJLiIQkL/Qcw1M xHMfuyyskw39BuI17QFDGW8bJbQ3+aOlk8+7ia+tKoK/jlyJm0A97/N50NJYQx9cvmuum9XiaT lpFItAWLhjyld+N+pd/+C3yz/HNlthj5JoX7PAzOrxs0eSjN0xLxaIWPwDkEcC938ruNAkrsl/ OXSV6dCgIEsKEcZYE416/1K66C6wSc3vaXMP11ou+aujJpdoqjI8vv4+rMNXFHMkcpVEZNW7aU rXM= X-SBRS: 2.7 X-MesageID: 11674364 X-Ironport-Server: esa4.hc3370-68.iphmx.com X-Remote-IP: 162.221.158.21 X-Policy: $RELAYED X-IronPort-AV: E=Sophos;i="5.70,330,1574139600"; d="scan'208";a="11674364" From: George Dunlap To: Date: Fri, 17 Jan 2020 15:57:32 +0000 Message-ID: <20200117155734.1067550-6-george.dunlap@citrix.com> X-Mailer: git-send-email 2.24.1 In-Reply-To: <20200117155734.1067550-1-george.dunlap@citrix.com> References: <20200117155734.1067550-1-george.dunlap@citrix.com> MIME-Version: 1.0 Subject: [Xen-devel] [PATCH v3 6/8] golang/xenlight: Don't leak memory on context open failure X-BeenThere: xen-devel@lists.xenproject.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Cc: Nick Rosbrook , George Dunlap Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" 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 Reviewed-by: Nick Rosbrook --- CC: Nick Rosbrook --- 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