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

29
usb.go
View File

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