From patchwork Fri Jun 19 10:40:32 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Wolfram Sang X-Patchwork-Id: 6644141 X-Patchwork-Delegate: geert@linux-m68k.org Return-Path: X-Original-To: patchwork-linux-sh@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id BE9299F1C1 for ; Fri, 19 Jun 2015 10:40:56 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id B9AC32044B for ; Fri, 19 Jun 2015 10:40:55 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id A7C79206D4 for ; Fri, 19 Jun 2015 10:40:54 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754726AbbFSKky (ORCPT ); Fri, 19 Jun 2015 06:40:54 -0400 Received: from sauhun.de ([89.238.76.85]:53243 "EHLO pokefinder.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754510AbbFSKkx (ORCPT ); Fri, 19 Jun 2015 06:40:53 -0400 Received: from p4fe25e18.dip0.t-ipconnect.de ([79.226.94.24]:51346 helo=localhost) by pokefinder.org with esmtpsa (TLS1.2:RSA_AES_128_CBC_SHA1:128) (Exim 4.80) (envelope-from ) id 1Z5tj9-0006au-T9; Fri, 19 Jun 2015 12:40:52 +0200 From: Wolfram Sang To: linux-i2c@vger.kernel.org, Jean Delvare Cc: Wolfram Sang , 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 Message-Id: <1434710432-4182-3-git-send-email-wsa@the-dreams.de> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1434710432-4182-1-git-send-email-wsa@the-dreams.de> References: <1434710432-4182-1-git-send-email-wsa@the-dreams.de> MIME-Version: 1.0 Sender: linux-sh-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-sh@vger.kernel.org X-Spam-Status: No, score=-7.2 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Wolfram Sang 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 [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); }