net: microchip: sparx5: Fix error handling in vcap_show_admin()
authorDan Carpenter <error27@gmail.com>
Tue, 29 Nov 2022 09:43:47 +0000 (12:43 +0300)
committerPaolo Abeni <pabeni@redhat.com>
Thu, 1 Dec 2022 11:12:23 +0000 (12:12 +0100)
If vcap_dup_rule() fails that leads to an error pointer dereference
side the call to vcap_free_rule().  Also it only returns an error if the
very last call to vcap_read_rule() fails and it returns success for
other errors.

I've changed it to just stop printing after the first error and return
an error code.

Fixes: 3a7921560d2f ("net: microchip: sparx5: Add VCAP rule debugFS support for the VCAP API")
Signed-off-by: Dan Carpenter <error27@gmail.com>
Reviewed-by: Steen Hegelund <Steen.Hegelund@microchip.com>
Link: https://lore.kernel.org/r/Y4XUUx9kzurBN+BV@kili
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/net/ethernet/microchip/vcap/vcap_api_debugfs.c

index 5df00e94033383826b8b73d3316ef30784624f6c..3b8d165dc83229ab6f763163297c9efd574a0ab4 100644 (file)
@@ -639,17 +639,24 @@ static int vcap_show_admin(struct vcap_control *vctrl,
        mutex_lock(&admin->lock);
        list_for_each_entry(elem, &admin->rules, list) {
                ri = vcap_dup_rule(elem);
-               if (IS_ERR(ri))
-                       goto free_rule;
+               if (IS_ERR(ri)) {
+                       ret = PTR_ERR(ri);
+                       goto err_unlock;
+               }
                /* Read data from VCAP */
                ret = vcap_read_rule(ri);
                if (ret)
-                       goto free_rule;
+                       goto err_free_rule;
                out->prf(out->dst, "\n");
                vcap_show_admin_rule(vctrl, admin, out, ri);
-free_rule:
                vcap_free_rule((struct vcap_rule *)ri);
        }
+       mutex_unlock(&admin->lock);
+       return 0;
+
+err_free_rule:
+       vcap_free_rule((struct vcap_rule *)ri);
+err_unlock:
        mutex_unlock(&admin->lock);
        return ret;
 }