From 4cc3fa8a4675e46b8cf8b200175a28dd7fc027ca Mon Sep 17 00:00:00 2001 From: Uwe Bonnes Date: Tue, 21 Jun 2011 15:15:39 +0200 Subject: [PATCH] Fix all leak in the examples shown with no device connected --- examples/bitbang.c | 7 +++++-- examples/bitbang2.c | 2 ++ examples/bitbang_cbus.c | 8 +++++++- examples/bitbang_ft2232.c | 2 ++ examples/find_all.c | 12 +++++++++--- examples/simple.c | 2 ++ 6 files changed, 27 insertions(+), 6 deletions(-) diff --git a/examples/bitbang.c b/examples/bitbang.c index ff2fbed..f4168ac 100644 --- a/examples/bitbang.c +++ b/examples/bitbang.c @@ -13,6 +13,7 @@ int main(int argc, char **argv) struct ftdi_context ftdic; int f,i; unsigned char buf[1]; + int retval = 0; if (ftdi_init(&ftdic) < 0) { @@ -25,7 +26,8 @@ int main(int argc, char **argv) if (f < 0 && f != -5) { fprintf(stderr, "unable to open ftdi device: %d (%s)\n", f, ftdi_get_error_string(&ftdic)); - exit(-1); + retval = 1; + goto done; } printf("ftdi open succeeded: %d\n",f); @@ -78,7 +80,8 @@ int main(int argc, char **argv) ftdi_disable_bitbang(&ftdic); ftdi_usb_close(&ftdic); +done: ftdi_deinit(&ftdic); - return 0; + return retval; } diff --git a/examples/bitbang2.c b/examples/bitbang2.c index df34bba..fa588f9 100644 --- a/examples/bitbang2.c +++ b/examples/bitbang2.c @@ -41,6 +41,7 @@ void ftdi_fatal (struct ftdi_context *ftdi, char *str) { fprintf (stderr, "%s: %s\n", str, ftdi_get_error_string (ftdi)); + ftdi_deinit(ftdi); exit (1); } @@ -64,6 +65,7 @@ int main(int argc, char **argv) if (ftdi_init(&ftdic) < 0) { fprintf(stderr, "ftdi_init failed\n"); + ftdi_deinit(&ftdic); return EXIT_FAILURE; } diff --git a/examples/bitbang_cbus.c b/examples/bitbang_cbus.c index 17d27eb..f47c359 100644 --- a/examples/bitbang_cbus.c +++ b/examples/bitbang_cbus.c @@ -41,6 +41,7 @@ int main(void) unsigned char buf[1]; unsigned char bitmask; char input[10]; + int retval = 0; if (ftdi_init(&ftdic) < 0) { @@ -52,6 +53,7 @@ int main(void) if (f < 0 && f != -5) { fprintf(stderr, "unable to open ftdi device: %d (%s)\n", f, ftdi_get_error_string(&ftdic)); + ftdi_deinit(&ftdic); exit(-1); } printf("ftdi open succeeded: %d\n",f); @@ -67,7 +69,9 @@ int main(void) if (f < 0) { fprintf(stderr, "set_bitmode failed for 0x%x, error %d (%s)\n", bitmask, f, ftdi_get_error_string(&ftdic)); - exit(-1); + ftdi_usb_close(&ftdic); + ftdi_deinit(&ftdic); + retval = -1; } // read CBUS @@ -75,6 +79,8 @@ int main(void) if (f < 0) { fprintf(stderr, "read_pins failed, error %d (%s)\n", f, ftdi_get_error_string(&ftdic)); + ftdi_usb_close(&ftdic); + ftdi_deinit(&ftdic); exit(-1); } printf("Read returned 0x%01x\n", buf[0] & 0x0f); diff --git a/examples/bitbang_ft2232.c b/examples/bitbang_ft2232.c index c99e687..6eb223e 100644 --- a/examples/bitbang_ft2232.c +++ b/examples/bitbang_ft2232.c @@ -34,6 +34,7 @@ int main(int argc, char **argv) if (f < 0 && f != -5) { fprintf(stderr, "unable to open ftdi device: %d (%s)\n", f, ftdi_get_error_string(&ftdic)); + ftdi_deinit(&ftdic); exit(-1); } printf("ftdi open succeeded(channel 1): %d\n",f); @@ -52,6 +53,7 @@ int main(int argc, char **argv) if (f < 0 && f != -5) { fprintf(stderr, "unable to open ftdi device: %d (%s)\n", f, ftdi_get_error_string(&ftdic2)); + ftdi_deinit(&ftdic2); exit(-1); } printf("ftdi open succeeded(channel 2): %d\n",f); diff --git a/examples/find_all.c b/examples/find_all.c index 936a824..7d1aab4 100644 --- a/examples/find_all.c +++ b/examples/find_all.c @@ -15,6 +15,7 @@ int main(void) struct ftdi_context ftdic; struct ftdi_device_list *devlist, *curdev; char manufacturer[128], description[128]; + int retval = EXIT_SUCCESS; if (ftdi_init(&ftdic) < 0) { @@ -25,7 +26,9 @@ int main(void) if ((ret = ftdi_usb_find_all(&ftdic, &devlist, 0x0403, 0x6001)) < 0) { fprintf(stderr, "ftdi_usb_find_all failed: %d (%s)\n", ret, ftdi_get_error_string(&ftdic)); - return EXIT_FAILURE; + retval = EXIT_FAILURE; + return retval; + goto do_deinit; } printf("Number of FTDI devices found: %d\n", ret); @@ -37,13 +40,16 @@ int main(void) if ((ret = ftdi_usb_get_strings(&ftdic, curdev->dev, manufacturer, 128, description, 128, NULL, 0)) < 0) { fprintf(stderr, "ftdi_usb_get_strings failed: %d (%s)\n", ret, ftdi_get_error_string(&ftdic)); - return EXIT_FAILURE; + retval = EXIT_FAILURE; + return retval; + goto done; } printf("Manufacturer: %s, Description: %s\n\n", manufacturer, description); curdev = curdev->next; } - +done: ftdi_list_free(&devlist); +do_deinit: ftdi_deinit(&ftdic); return EXIT_SUCCESS; diff --git a/examples/simple.c b/examples/simple.c index 0fcf4e8..145e931 100644 --- a/examples/simple.c +++ b/examples/simple.c @@ -22,6 +22,7 @@ int main(void) if ((ret = ftdi_usb_open(&ftdic, 0x0403, 0x6001)) < 0) { fprintf(stderr, "unable to open ftdi device: %d (%s)\n", ret, ftdi_get_error_string(&ftdic)); + ftdi_deinit(&ftdic); return EXIT_FAILURE; } @@ -36,6 +37,7 @@ int main(void) if ((ret = ftdi_usb_close(&ftdic)) < 0) { fprintf(stderr, "unable to close ftdi device: %d (%s)\n", ret, ftdi_get_error_string(&ftdic)); + ftdi_deinit(&ftdic); return EXIT_FAILURE; } -- 1.7.1