From 0aac3706d707b26f478656282d2d7dce47e3adbf Mon Sep 17 00:00:00 2001 From: Daniel Drake Date: Thu, 25 Oct 2007 15:35:10 +0100 Subject: [PATCH] upekts: release interface on error condition and normal exit --- libfprint/drivers/upekts.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/libfprint/drivers/upekts.c b/libfprint/drivers/upekts.c index b0bb09d..be958e3 100644 --- a/libfprint/drivers/upekts.c +++ b/libfprint/drivers/upekts.c @@ -32,6 +32,7 @@ #include #include +#include #include @@ -422,7 +423,7 @@ static const unsigned char init28_0b[] = { static int dev_init(struct fp_dev *dev, unsigned long driver_data) { - struct upekts_dev *upekdev; + struct upekts_dev *upekdev = NULL; unsigned char dummy = 0x10; enum read_msg_status msgstat; uint8_t seq; @@ -434,8 +435,10 @@ static int dev_init(struct fp_dev *dev, unsigned long driver_data) r = usb_control_msg(dev->udev, USB_TYPE_VENDOR | USB_RECIP_DEVICE, 0x0c, 0x100, 0x400, &dummy, sizeof(dummy), TIMEOUT); - if (r < 0) - return r; + if (r < 0) { + fp_dbg("control write failed\n"); + goto err; + } upekdev = g_malloc(sizeof(*upekdev)); upekdev->seq = 0xf0; /* incremented to 0x00 before first cmd */ @@ -504,7 +507,9 @@ static int dev_init(struct fp_dev *dev, unsigned long driver_data) return 0; err: + usb_release_interface(dev->udev, 0); g_free(upekdev); + return -EPROTO; } @@ -518,6 +523,7 @@ static void dev_exit(struct fp_dev *dev) // FIXME should read msg A=01 + usb_release_interface(dev->udev, 0); g_free(dev->priv); }