Coverity issue: 1363123
Fixes: 6042804cf6ecc ("Change -k/-K options to use ETHTOOL_{G,S}FEATURES")

Signed-off-by: John W. Linville <linvi...@tuxdriver.com>
---
 ethtool.c | 41 ++++++++++++++++++++++++++++-------------
 1 file changed, 28 insertions(+), 13 deletions(-)

diff --git a/ethtool.c b/ethtool.c
index 09486615a5bb..2fd3393ca5f6 100644
--- a/ethtool.c
+++ b/ethtool.c
@@ -2253,7 +2253,7 @@ static int do_sfeatures(struct cmd_context *ctx)
        struct cmdline_info *cmdline_features;
        struct feature_state *old_state, *new_state;
        struct ethtool_value eval;
-       int err;
+       int err, rc;
        int i, j;
 
        defs = get_feature_defs(ctx);
@@ -2267,7 +2267,8 @@ static int do_sfeatures(struct cmd_context *ctx)
                                   sizeof(efeatures->features[0]));
                if (!efeatures) {
                        perror("Cannot parse arguments");
-                       return 1;
+                       rc = 1;
+                       goto err;
                }
                efeatures->cmd = ETHTOOL_SFEATURES;
                efeatures->size = FEATURE_BITS_TO_BLOCKS(defs->n_features);
@@ -2285,7 +2286,8 @@ static int do_sfeatures(struct cmd_context *ctx)
                                  sizeof(cmdline_features[0]));
        if (!cmdline_features) {
                perror("Cannot parse arguments");
-               return 1;
+               rc = 1;
+               goto err;
        }
        for (i = 0; i < ARRAY_SIZE(off_flag_def); i++)
                flag_to_cmdline_info(off_flag_def[i].short_name,
@@ -2304,12 +2306,15 @@ static int do_sfeatures(struct cmd_context *ctx)
 
        if (!any_changed) {
                fprintf(stdout, "no features changed\n");
-               return 0;
+               rc = 0;
+               goto err;
        }
 
        old_state = get_features(ctx, defs);
-       if (!old_state)
-               return 1;
+       if (!old_state) {
+               rc = 1;
+               goto err;
+       }
 
        if (efeatures) {
                /* For each offload that the user specified, update any
@@ -2353,7 +2358,8 @@ static int do_sfeatures(struct cmd_context *ctx)
                err = send_ioctl(ctx, efeatures);
                if (err < 0) {
                        perror("Cannot set device feature settings");
-                       return 1;
+                       rc = 1;
+                       goto err;
                }
        } else {
                for (i = 0; i < ARRAY_SIZE(off_flag_def); i++) {
@@ -2368,7 +2374,8 @@ static int do_sfeatures(struct cmd_context *ctx)
                                        fprintf(stderr,
                                                "Cannot set device %s settings: 
%m\n",
                                                off_flag_def[i].long_name);
-                                       return 1;
+                                       rc = 1;
+                                       goto err;
                                }
                        }
                }
@@ -2382,15 +2389,18 @@ static int do_sfeatures(struct cmd_context *ctx)
                        err = send_ioctl(ctx, &eval);
                        if (err) {
                                perror("Cannot set device flag settings");
-                               return 92;
+                               rc = 92;
+                               goto err;
                        }
                }
        }
 
        /* Compare new state with requested state */
        new_state = get_features(ctx, defs);
-       if (!new_state)
-               return 1;
+       if (!new_state) {
+               rc = 1;
+               goto err;
+       }
        any_changed = new_state->off_flags != old_state->off_flags;
        any_mismatch = (new_state->off_flags !=
                        ((old_state->off_flags & ~off_flags_mask) |
@@ -2409,13 +2419,18 @@ static int do_sfeatures(struct cmd_context *ctx)
                if (!any_changed) {
                        fprintf(stderr,
                                "Could not change any device features\n");
-                       return 1;
+                       rc = 1;
+                       goto err;
                }
                printf("Actual changes:\n");
                dump_features(defs, new_state, old_state);
        }
 
-       return 0;
+       rc = 0;
+
+err:
+       free(defs);
+       return rc;
 }
 
 static struct ethtool_link_usettings *
-- 
2.7.4

Reply via email to