Commit 29ff10743f8bccd61a48abdb38c891a9a23c4bea

Denis Ahrens 2012-12-21T04:52:13

libztex: check returnvalue of libusb_claim_interface() and release the interface in case of early exit

diff --git a/libztex.c b/libztex.c
index 54b426b..91bdc95 100644
--- a/libztex.c
+++ b/libztex.c
@@ -370,12 +370,17 @@ static int libztex_configureFpgaHS(struct libztex_device *ztex, const char* firm
 		return cnt;
 	}
 
-	libusb_claim_interface(ztex->hndl, settings[1]);
+	err = libusb_claim_interface(ztex->hndl, settings[1]);
+	if (err != LIBUSB_SUCCESS) {
+		applog(LOG_ERR, "%s: failed to claim interface for hs transfer", ztex->repr);
+		return -4;
+	}
 
 	for (tries = 3; tries > 0; tries--) {
 		fp = open_bitstream("ztex", firmware);
 		if (!fp) {
 			applog(LOG_ERR, "%s: failed to read bitstream '%s'", ztex->repr, firmware);
+			libusb_release_interface(ztex->hndl, settings[1]);
 			return -2;
 		}
 
@@ -409,6 +414,7 @@ static int libztex_configureFpgaHS(struct libztex_device *ztex, const char* firm
 		libztex_getFpgaState(ztex, &state);
 		if (!state.fpgaConfigured) {
 			applog(LOG_ERR, "%s: HS FPGA configuration failed: DONE pin does not go high", ztex->repr);
+			libusb_release_interface(ztex->hndl, settings[1]);
 			return -3;
 		}
 	}