Memory blocks referenced by new_state and old_state are never freed. For efeatures there is no need to check pointer as free() can be called with NULL parameter.
Fixes: 6042804cf6ec ("Change -k/-K options to use ETHTOOL_{G,S}FEATURES") Cc: Michal Kubecek <mkube...@suse.cz> Signed-off-by: Ivan Vecera <ivec...@redhat.com> --- ethtool.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/ethtool.c b/ethtool.c index ab9b4577cbce..f2d568722272 100644 --- a/ethtool.c +++ b/ethtool.c @@ -2392,9 +2392,10 @@ static int do_sfeatures(struct cmd_context *ctx) int any_changed = 0, any_mismatch = 0; u32 off_flags_wanted = 0; u32 off_flags_mask = 0; - struct ethtool_sfeatures *efeatures; + struct ethtool_sfeatures *efeatures = NULL; + struct feature_state *old_state = NULL; + struct feature_state *new_state = NULL; struct cmdline_info *cmdline_features; - struct feature_state *old_state, *new_state; struct ethtool_value eval; unsigned int i, j; int err, rc; @@ -2418,8 +2419,6 @@ static int do_sfeatures(struct cmd_context *ctx) memset(efeatures->features, 0, FEATURE_BITS_TO_BLOCKS(defs->n_features) * sizeof(efeatures->features[0])); - } else { - efeatures = NULL; } /* Generate cmdline_info for legacy flags and kernel-named @@ -2578,9 +2577,11 @@ static int do_sfeatures(struct cmd_context *ctx) rc = 0; err: + free(new_state); + free(old_state); free(defs); - if (efeatures) - free(efeatures); + free(efeatures); + return rc; } -- 2.26.2