refcount_t type and corresponding API should be
used instead of atomic_t when the variable is used as
a reference counter. This allows to avoid accidental
refcounter overflows that might lead to use-after-free
situations.
Signed-off-by: Elena Reshetova <elena.reshetova@intel.com>
Signed-off-by: Hans Liljestrand <ishkamiel@gmail.com>
Signed-off-by: Kees Cook <keescook@chromium.org>
Signed-off-by: David Windsor <dwindsor@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
 #define _NET_DN_FIB_H
 
 #include <linux/netlink.h>
+#include <linux/refcount.h>
 
 extern const struct nla_policy rtm_dn_policy[];
 
        struct dn_fib_info      *fib_next;
        struct dn_fib_info      *fib_prev;
        int                     fib_treeref;
-       atomic_t                fib_clntref;
+       refcount_t              fib_clntref;
        int                     fib_dead;
        unsigned int            fib_flags;
        int                     fib_protocol;
 
 static inline void dn_fib_info_put(struct dn_fib_info *fi)
 {
-       if (atomic_dec_and_test(&fi->fib_clntref))
+       if (refcount_dec_and_test(&fi->fib_clntref))
                dn_fib_free_info(fi);
 }
 
 
        }
 
        fi->fib_treeref++;
-       atomic_inc(&fi->fib_clntref);
+       refcount_set(&fi->fib_clntref, 1);
        spin_lock(&dn_fib_info_lock);
        fi->fib_next = dn_fib_info_list;
        fi->fib_prev = NULL;
                switch (type) {
                case RTN_NAT:
                        DN_FIB_RES_RESET(*res);
-                       atomic_inc(&fi->fib_clntref);
+                       refcount_inc(&fi->fib_clntref);
                        return 0;
                case RTN_UNICAST:
                case RTN_LOCAL:
                        }
                        if (nhsel < fi->fib_nhs) {
                                res->nh_sel = nhsel;
-                               atomic_inc(&fi->fib_clntref);
+                               refcount_inc(&fi->fib_clntref);
                                return 0;
                        }
                        endfor_nexthops(fi);