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.
This commit is contained in:
danielpaulus
2021-11-01 21:40:49 +01:00
committed by GitHub
parent 0eba1b1264
commit 0ce3a07f8e
2 changed files with 15 additions and 16 deletions

View File

@@ -209,7 +209,7 @@ func (libusbImpl) getDevices(ctx *libusbContext) ([]*libusbDevice, error) {
for _, d := range devs { for _, d := range devs {
ret = append(ret, (*libusbDevice)(d)) 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) C.libusb_free_device_list(list, 0)
return ret, nil return ret, nil
} }

29
usb.go
View File

@@ -187,27 +187,26 @@ func (c *Context) OpenDevices(opener func(desc *DeviceDesc) bool) ([]*Device, er
var ret []*Device var ret []*Device
for _, dev := range list { for _, dev := range list {
desc, err := c.libusb.getDeviceDesc(dev) desc, err := c.libusb.getDeviceDesc(dev)
defer c.libusb.dereference(dev)
if err != nil { if err != nil {
c.libusb.dereference(dev)
reterr = err reterr = err
continue continue
} }
if opener(desc) { if !opener(desc) {
handle, err := c.libusb.open(dev) continue
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)
} }
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 return ret, reterr
} }