From: Wolfram Sang <wsa@the-dreams.de> To: linux-i2c@vger.kernel.org, Jean Delvare <jdelvare@suse.de> Cc: Wolfram Sang <wsa@the-dreams.de>, linux-sh@vger.kernel.org Subject: [PATCH 2/2] i2c-tools: i2ctransfer: clean up allocated resources Date: Fri, 19 Jun 2015 10:40:32 +0000 [thread overview] Message-ID: <1434710432-4182-3-git-send-email-wsa@the-dreams.de> (raw) In-Reply-To: <1434710432-4182-1-git-send-email-wsa@the-dreams.de> From: Wolfram Sang <wsa+renesas@sang-engineering.com> I still think this makes the code less readable and unnecessarily big [1], but I assume Jean insists on it :) So, here is an add-on patch to squash. Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com> [1] http://www.gnu.org/software/libc/manual/html_node/Freeing-after-Malloc.html#Freeing-after-Malloc "There is no point in freeing blocks at the end of a program, because all of the program’s space is given back to the system when the process terminates." --- tools/i2ctransfer.c | 44 +++++++++++++++++++++++++++----------------- 1 file changed, 27 insertions(+), 17 deletions(-) diff --git a/tools/i2ctransfer.c b/tools/i2ctransfer.c index 27f4d7a..418e303 100644 --- a/tools/i2ctransfer.c +++ b/tools/i2ctransfer.c @@ -127,7 +127,7 @@ int main(int argc, char *argv[]) { char filename[20]; char *end; - int i2cbus, address = -1, file, arg_idx = 1, nmsgs = 0, nmsgs_sent; + int i2cbus, address = -1, file, arg_idx = 1, nmsgs = 0, nmsgs_sent, i; int force = 0, yes = 0, version = 0, verbose = 0; unsigned buf_idx = 0; unsigned long len, raw_data; @@ -138,6 +138,9 @@ int main(int argc, char *argv[]) struct i2c_rdwr_ioctl_data rdwr; enum parse_state state = PARSE_GET_DESC; + for (i = 0; i < I2C_RDRW_IOCTL_MAX_MSGS; i++) + msgs[i].buf = NULL; + /* handle (optional) arg_idx first */ while (arg_idx < argc && argv[arg_idx][0] = '-') { switch (argv[arg_idx][1]) { @@ -178,7 +181,7 @@ int main(int argc, char *argv[]) if (nmsgs > I2C_RDRW_IOCTL_MAX_MSGS) { fprintf(stderr, "Error: Too many messages (max: %d)\n", I2C_RDRW_IOCTL_MAX_MSGS); - exit(1); + goto err_out; } switch (state) { @@ -190,20 +193,20 @@ int main(int argc, char *argv[]) case 'w': break; default: fprintf(stderr, "Error: Invalid direction\n"); - goto err_out; + goto err_out_with_arg; } len = strtoul(arg_ptr, &end, 0); if (len > 65535) { fprintf(stderr, "Error: Length invalid\n"); - goto err_out; + goto err_out_with_arg; } arg_ptr = end; if (*arg_ptr) { if (*arg_ptr++ != '@') { fprintf(stderr, "Error: No '@' after length\n"); - goto err_out; + goto err_out_with_arg; } /* We skip 10-bit support for now. If we want it, it @@ -213,16 +216,16 @@ int main(int argc, char *argv[]) address = parse_i2c_address(arg_ptr); if (address < 0) - goto err_out; + goto err_out_with_arg; if (!force && set_slave_addr(file, address, 0)) - goto err_out; + goto err_out_with_arg; } else { /* Reuse last address if possible */ if (address < 0) { fprintf(stderr, "Error: No address given\n"); - goto err_out; + goto err_out_with_arg; } } @@ -234,7 +237,7 @@ int main(int argc, char *argv[]) buf = malloc(len); if (!buf) { fprintf(stderr, "Error: No memory for buffer\n"); - goto err_out; + goto err_out_with_arg; } memset(buf, 0, len); msgs[nmsgs].buf = buf; @@ -253,7 +256,7 @@ int main(int argc, char *argv[]) raw_data = strtoul(arg_ptr, &end, 0); if (raw_data > 255) { fprintf(stderr, "Error: Data byte invalid\n"); - goto err_out; + goto err_out_with_arg; } data = raw_data; len = msgs[nmsgs].len; @@ -270,7 +273,7 @@ int main(int argc, char *argv[]) case '=': break; default: fprintf(stderr, "Error: Invalid data byte suffix\n"); - goto err_out; + goto err_out_with_arg; } } @@ -283,7 +286,7 @@ int main(int argc, char *argv[]) default: fprintf(stderr, "Error: Unnkown state in state machine!\n"); - goto err_out; + goto err_out_with_arg; } arg_idx++; @@ -291,18 +294,18 @@ int main(int argc, char *argv[]) if (state != PARSE_GET_DESC || nmsgs = 0) { fprintf(stderr, "Error: Incomplete message\n"); - exit(1); + goto err_out; } if (!yes && !confirm(filename, msgs, nmsgs)) - exit(0); + goto out; rdwr.msgs = msgs; rdwr.nmsgs = nmsgs; nmsgs_sent = ioctl(file, I2C_RDWR, &rdwr); if (nmsgs_sent < 0) { fprintf(stderr, "Error: Sending messages failed: %s\n", strerror(errno)); - exit(errno); + goto err_out; } else if (nmsgs_sent < nmsgs) { fprintf(stderr, "Warning: only %d/%d messages were sent\n", nmsgs_sent, nmsgs); } @@ -311,10 +314,17 @@ int main(int argc, char *argv[]) print_msgs(msgs, nmsgs_sent, PRINT_READ_BUF | (verbose ? PRINT_HEADER | PRINT_WRITE_BUF : 0)); - /* let Linux free malloced memory on termination */ +out: + for (i = 0; i <= nmsgs; i++) + free(msgs[i].buf); + exit(0); -err_out: +err_out_with_arg: fprintf(stderr, "Error: faulty argument is '%s'\n", argv[arg_idx]); +err_out: + for (i = 0; i <= nmsgs; i++) + free(msgs[i].buf); + exit(1); } -- 2.1.4
WARNING: multiple messages have this Message-ID (diff)
From: Wolfram Sang <wsa@the-dreams.de> To: linux-i2c@vger.kernel.org, Jean Delvare <jdelvare@suse.de> Cc: Wolfram Sang <wsa@the-dreams.de>, linux-sh@vger.kernel.org Subject: [PATCH 2/2] i2c-tools: i2ctransfer: clean up allocated resources Date: Fri, 19 Jun 2015 12:40:32 +0200 [thread overview] Message-ID: <1434710432-4182-3-git-send-email-wsa@the-dreams.de> (raw) In-Reply-To: <1434710432-4182-1-git-send-email-wsa@the-dreams.de> From: Wolfram Sang <wsa+renesas@sang-engineering.com> I still think this makes the code less readable and unnecessarily big [1], but I assume Jean insists on it :) So, here is an add-on patch to squash. Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com> [1] http://www.gnu.org/software/libc/manual/html_node/Freeing-after-Malloc.html#Freeing-after-Malloc "There is no point in freeing blocks at the end of a program, because all of the program’s space is given back to the system when the process terminates." --- tools/i2ctransfer.c | 44 +++++++++++++++++++++++++++----------------- 1 file changed, 27 insertions(+), 17 deletions(-) diff --git a/tools/i2ctransfer.c b/tools/i2ctransfer.c index 27f4d7a..418e303 100644 --- a/tools/i2ctransfer.c +++ b/tools/i2ctransfer.c @@ -127,7 +127,7 @@ int main(int argc, char *argv[]) { char filename[20]; char *end; - int i2cbus, address = -1, file, arg_idx = 1, nmsgs = 0, nmsgs_sent; + int i2cbus, address = -1, file, arg_idx = 1, nmsgs = 0, nmsgs_sent, i; int force = 0, yes = 0, version = 0, verbose = 0; unsigned buf_idx = 0; unsigned long len, raw_data; @@ -138,6 +138,9 @@ int main(int argc, char *argv[]) struct i2c_rdwr_ioctl_data rdwr; enum parse_state state = PARSE_GET_DESC; + for (i = 0; i < I2C_RDRW_IOCTL_MAX_MSGS; i++) + msgs[i].buf = NULL; + /* handle (optional) arg_idx first */ while (arg_idx < argc && argv[arg_idx][0] == '-') { switch (argv[arg_idx][1]) { @@ -178,7 +181,7 @@ int main(int argc, char *argv[]) if (nmsgs > I2C_RDRW_IOCTL_MAX_MSGS) { fprintf(stderr, "Error: Too many messages (max: %d)\n", I2C_RDRW_IOCTL_MAX_MSGS); - exit(1); + goto err_out; } switch (state) { @@ -190,20 +193,20 @@ int main(int argc, char *argv[]) case 'w': break; default: fprintf(stderr, "Error: Invalid direction\n"); - goto err_out; + goto err_out_with_arg; } len = strtoul(arg_ptr, &end, 0); if (len > 65535) { fprintf(stderr, "Error: Length invalid\n"); - goto err_out; + goto err_out_with_arg; } arg_ptr = end; if (*arg_ptr) { if (*arg_ptr++ != '@') { fprintf(stderr, "Error: No '@' after length\n"); - goto err_out; + goto err_out_with_arg; } /* We skip 10-bit support for now. If we want it, it @@ -213,16 +216,16 @@ int main(int argc, char *argv[]) address = parse_i2c_address(arg_ptr); if (address < 0) - goto err_out; + goto err_out_with_arg; if (!force && set_slave_addr(file, address, 0)) - goto err_out; + goto err_out_with_arg; } else { /* Reuse last address if possible */ if (address < 0) { fprintf(stderr, "Error: No address given\n"); - goto err_out; + goto err_out_with_arg; } } @@ -234,7 +237,7 @@ int main(int argc, char *argv[]) buf = malloc(len); if (!buf) { fprintf(stderr, "Error: No memory for buffer\n"); - goto err_out; + goto err_out_with_arg; } memset(buf, 0, len); msgs[nmsgs].buf = buf; @@ -253,7 +256,7 @@ int main(int argc, char *argv[]) raw_data = strtoul(arg_ptr, &end, 0); if (raw_data > 255) { fprintf(stderr, "Error: Data byte invalid\n"); - goto err_out; + goto err_out_with_arg; } data = raw_data; len = msgs[nmsgs].len; @@ -270,7 +273,7 @@ int main(int argc, char *argv[]) case '=': break; default: fprintf(stderr, "Error: Invalid data byte suffix\n"); - goto err_out; + goto err_out_with_arg; } } @@ -283,7 +286,7 @@ int main(int argc, char *argv[]) default: fprintf(stderr, "Error: Unnkown state in state machine!\n"); - goto err_out; + goto err_out_with_arg; } arg_idx++; @@ -291,18 +294,18 @@ int main(int argc, char *argv[]) if (state != PARSE_GET_DESC || nmsgs == 0) { fprintf(stderr, "Error: Incomplete message\n"); - exit(1); + goto err_out; } if (!yes && !confirm(filename, msgs, nmsgs)) - exit(0); + goto out; rdwr.msgs = msgs; rdwr.nmsgs = nmsgs; nmsgs_sent = ioctl(file, I2C_RDWR, &rdwr); if (nmsgs_sent < 0) { fprintf(stderr, "Error: Sending messages failed: %s\n", strerror(errno)); - exit(errno); + goto err_out; } else if (nmsgs_sent < nmsgs) { fprintf(stderr, "Warning: only %d/%d messages were sent\n", nmsgs_sent, nmsgs); } @@ -311,10 +314,17 @@ int main(int argc, char *argv[]) print_msgs(msgs, nmsgs_sent, PRINT_READ_BUF | (verbose ? PRINT_HEADER | PRINT_WRITE_BUF : 0)); - /* let Linux free malloced memory on termination */ +out: + for (i = 0; i <= nmsgs; i++) + free(msgs[i].buf); + exit(0); -err_out: +err_out_with_arg: fprintf(stderr, "Error: faulty argument is '%s'\n", argv[arg_idx]); +err_out: + for (i = 0; i <= nmsgs; i++) + free(msgs[i].buf); + exit(1); } -- 2.1.4
next prev parent reply other threads:[~2015-06-19 10:40 UTC|newest] Thread overview: 33+ messages / expand[flat|nested] mbox.gz Atom feed top 2015-06-19 10:40 [PATCH 0/2] new tool 'i2ctransfer' Wolfram Sang 2015-06-19 10:40 ` Wolfram Sang 2015-06-19 10:40 ` [PATCH 1/2] i2c-tools: add " Wolfram Sang 2015-06-19 10:40 ` Wolfram Sang [not found] ` <1434710432-4182-2-git-send-email-wsa-z923LK4zBo2bacvFa/9K2g@public.gmane.org> 2015-09-11 8:42 ` Jean Delvare 2015-09-11 8:42 ` Jean Delvare 2016-02-14 19:08 ` Wolfram Sang 2016-02-14 19:08 ` Wolfram Sang 2016-04-27 17:33 ` Uwe Kleine-König 2016-04-27 17:37 ` Wolfram Sang 2016-06-19 19:56 ` Uwe Kleine-König 2016-06-19 20:00 ` Wolfram Sang 2016-06-19 21:51 ` Uwe Kleine-König 2016-06-20 6:08 ` Wolfram Sang 2016-06-20 6:49 ` Uwe Kleine-König 2016-06-21 9:12 ` Jean Delvare 2016-06-22 16:52 ` Jean Delvare 2016-06-22 20:40 ` Guenter Roeck 2016-06-22 22:18 ` Wolfram Sang 2016-06-23 7:32 ` New location for i2c-tools.git Uwe Kleine-König 2016-06-23 7:57 ` Angelo Compagnucci 2016-06-23 9:53 ` Jean Delvare 2016-06-23 10:36 ` Angelo Compagnucci 2016-06-23 17:40 ` Jean Delvare 2016-06-23 18:50 ` Wolfram Sang 2016-07-04 8:31 ` Jean Delvare 2016-07-04 14:38 ` Wolfram Sang 2015-06-19 10:40 ` Wolfram Sang [this message] 2015-06-19 10:40 ` [PATCH 2/2] i2c-tools: i2ctransfer: clean up allocated resources Wolfram Sang 2015-09-11 9:12 ` Jean Delvare 2015-09-11 9:12 ` Jean Delvare 2016-02-14 19:20 ` Wolfram Sang 2016-02-14 19:20 ` Wolfram Sang
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=1434710432-4182-3-git-send-email-wsa@the-dreams.de \ --to=wsa@the-dreams.de \ --cc=jdelvare@suse.de \ --cc=linux-i2c@vger.kernel.org \ --cc=linux-sh@vger.kernel.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.