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 {
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
}

11
usb.go
View File

@@ -187,16 +187,17 @@ 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) {
if !opener(desc) {
continue
}
handle, err := c.libusb.open(dev)
if err != nil {
c.libusb.dereference(dev)
reterr = err
continue
}
@@ -205,9 +206,7 @@ func (c *Context) OpenDevices(opener func(desc *DeviceDesc) bool) ([]*Device, er
c.mu.Lock()
c.devices[o] = true
c.mu.Unlock()
} else {
c.libusb.dereference(dev)
}
}
return ret, reterr
}