]> granicus.if.org Git - libnl/commitdiff
link: Fix rtnl_link_af_data_compare return value
authorroopa <roopa@cumulusnetworks.com>
Fri, 15 Feb 2013 18:26:30 +0000 (10:26 -0800)
committerThomas Graf <tgraf@suug.ch>
Sun, 24 Feb 2013 16:11:36 +0000 (17:11 +0100)
This patch fixes a bug where because of the af_ops check
being first in the function, we were returning ~0 if af_ops
was null even if both objects really did not have af_data
and we should be returning 0.

Its better to have the af_data present check before anything else.

So, Rearranged some of the code in rtnl_link_af_data_compare.
Changes include:
- Do the attribute present check before anything else
- If ao_compare op not present, return ~0

Signed-off-by: Roopa Prabhu <roopa@cumulusnetworks.com>
Reviewed-by: Nolan Leake <nolan@cumulusnetworks.com>
Reviewed-by: Shrijeet Mukherjee <shm@cumulusnetworks.com>
Reviewed-by: Wilson Kok <wkok@cumulusnetworks.com>
Signed-off-by: Thomas Graf <tgraf@suug.ch>
lib/route/link/api.c

index 63ff99ca43b4d9fb50a72573726c25ee3f71d1df..352bb839682626de455b8ce6feb75239330ce79a 100644 (file)
@@ -365,22 +365,26 @@ errout:
 int rtnl_link_af_data_compare(struct rtnl_link *a, struct rtnl_link *b,
                              int family)
 {
-       struct rtnl_link_af_ops *af_ops = rtnl_link_af_ops_lookup(family);
+       struct rtnl_link_af_ops *af_ops;
        int ret = 0;
 
-       if (!af_ops)
+       if (!a->l_af_data[family] && !b->l_af_data[family])
+               return 0;
+
+       if (!a->l_af_data[family] || !b->l_af_data[family])
                return ~0;
 
-       if (!a->l_af_data[family] && !b->l_af_data[family])
-               goto out;
+       af_ops = rtnl_link_af_ops_lookup(family);
+       if (!af_ops)
+               return ~0;
 
-       if (!a->l_af_data[family] || !b->l_af_data[family]) {
+       if (af_ops->ao_compare == NULL) {
                ret = ~0;
                goto out;
        }
 
-       if (af_ops->ao_compare)
-               ret = af_ops->ao_compare(a, b, family, ~0, 0);
+       ret = af_ops->ao_compare(a, b, family, ~0, 0);
+
 out:
        rtnl_link_af_ops_put(af_ops);