From 0ce3a07f8e05ed5a9191aa4e0da85f6aa4e304a9 Mon Sep 17 00:00:00 2001 From: danielpaulus Date: Mon, 1 Nov 2021 21:40:49 +0100 Subject: [PATCH] Dereference device with a defer call to prevent memory leaks (#98) We should always dereference devices. c.libusb.open is keeping its own internal reference so there is no risk of breaking anything. --- libusb.go | 2 +- usb.go | 29 ++++++++++++++--------------- 2 files changed, 15 insertions(+), 16 deletions(-) diff --git a/libusb.go b/libusb.go index 8921ad0..ee924e7 100644 --- a/libusb.go +++ b/libusb.go @@ -209,7 +209,7 @@ func (libusbImpl) getDevices(ctx *libusbContext) ([]*libusbDevice, error) { for _, d := range devs { ret = append(ret, (*libusbDevice)(d)) } - // devices will be dereferenced later, during close. + // devices must be dereferenced by the caller to prevent memoryleaks C.libusb_free_device_list(list, 0) return ret, nil } diff --git a/usb.go b/usb.go index 159698a..77db23c 100644 --- a/usb.go +++ b/usb.go @@ -187,27 +187,26 @@ func (c *Context) OpenDevices(opener func(desc *DeviceDesc) bool) ([]*Device, er var ret []*Device for _, dev := range list { desc, err := c.libusb.getDeviceDesc(dev) + defer c.libusb.dereference(dev) if err != nil { - c.libusb.dereference(dev) reterr = err continue } - if opener(desc) { - handle, err := c.libusb.open(dev) - if err != nil { - c.libusb.dereference(dev) - reterr = err - continue - } - o := &Device{handle: handle, ctx: c, Desc: desc} - ret = append(ret, o) - c.mu.Lock() - c.devices[o] = true - c.mu.Unlock() - } else { - c.libusb.dereference(dev) + if !opener(desc) { + continue } + handle, err := c.libusb.open(dev) + if err != nil { + reterr = err + continue + } + o := &Device{handle: handle, ctx: c, Desc: desc} + ret = append(ret, o) + c.mu.Lock() + c.devices[o] = true + c.mu.Unlock() + } return ret, reterr }