summaryrefslogtreecommitdiffstats
path: root/net/rxrpc
diff options
context:
space:
mode:
authorReshetova, Elena <elena.reshetova@intel.com>2017-06-30 06:07:58 -0400
committerDavid S. Miller <davem@davemloft.net>2017-07-01 10:39:07 -0400
commit633547973ffc32fd2c815639d4675e1531f0896f (patch)
tree751ca7a379366af93f578d9f35f48339d4d2dd9b /net/rxrpc
parent53869cebce4bc53f71a080e7830600d4ae1ab712 (diff)
net: convert sk_buff.users from atomic_t to refcount_t
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>
Diffstat (limited to 'net/rxrpc')
-rw-r--r--net/rxrpc/skbuff.c12
1 files changed, 6 insertions, 6 deletions
diff --git a/net/rxrpc/skbuff.c b/net/rxrpc/skbuff.c
index 67b02c45271b..b8985d01876a 100644
--- a/net/rxrpc/skbuff.c
+++ b/net/rxrpc/skbuff.c
@@ -27,7 +27,7 @@ void rxrpc_new_skb(struct sk_buff *skb, enum rxrpc_skb_trace op)
27{ 27{
28 const void *here = __builtin_return_address(0); 28 const void *here = __builtin_return_address(0);
29 int n = atomic_inc_return(select_skb_count(op)); 29 int n = atomic_inc_return(select_skb_count(op));
30 trace_rxrpc_skb(skb, op, atomic_read(&skb->users), n, here); 30 trace_rxrpc_skb(skb, op, refcount_read(&skb->users), n, here);
31} 31}
32 32
33/* 33/*
@@ -38,7 +38,7 @@ void rxrpc_see_skb(struct sk_buff *skb, enum rxrpc_skb_trace op)
38 const void *here = __builtin_return_address(0); 38 const void *here = __builtin_return_address(0);
39 if (skb) { 39 if (skb) {
40 int n = atomic_read(select_skb_count(op)); 40 int n = atomic_read(select_skb_count(op));
41 trace_rxrpc_skb(skb, op, atomic_read(&skb->users), n, here); 41 trace_rxrpc_skb(skb, op, refcount_read(&skb->users), n, here);
42 } 42 }
43} 43}
44 44
@@ -49,7 +49,7 @@ void rxrpc_get_skb(struct sk_buff *skb, enum rxrpc_skb_trace op)
49{ 49{
50 const void *here = __builtin_return_address(0); 50 const void *here = __builtin_return_address(0);
51 int n = atomic_inc_return(select_skb_count(op)); 51 int n = atomic_inc_return(select_skb_count(op));
52 trace_rxrpc_skb(skb, op, atomic_read(&skb->users), n, here); 52 trace_rxrpc_skb(skb, op, refcount_read(&skb->users), n, here);
53 skb_get(skb); 53 skb_get(skb);
54} 54}
55 55
@@ -63,7 +63,7 @@ void rxrpc_free_skb(struct sk_buff *skb, enum rxrpc_skb_trace op)
63 int n; 63 int n;
64 CHECK_SLAB_OKAY(&skb->users); 64 CHECK_SLAB_OKAY(&skb->users);
65 n = atomic_dec_return(select_skb_count(op)); 65 n = atomic_dec_return(select_skb_count(op));
66 trace_rxrpc_skb(skb, op, atomic_read(&skb->users), n, here); 66 trace_rxrpc_skb(skb, op, refcount_read(&skb->users), n, here);
67 kfree_skb(skb); 67 kfree_skb(skb);
68 } 68 }
69} 69}
@@ -78,7 +78,7 @@ void rxrpc_lose_skb(struct sk_buff *skb, enum rxrpc_skb_trace op)
78 int n; 78 int n;
79 CHECK_SLAB_OKAY(&skb->users); 79 CHECK_SLAB_OKAY(&skb->users);
80 n = atomic_dec_return(select_skb_count(op)); 80 n = atomic_dec_return(select_skb_count(op));
81 trace_rxrpc_skb(skb, op, atomic_read(&skb->users), n, here); 81 trace_rxrpc_skb(skb, op, refcount_read(&skb->users), n, here);
82 kfree_skb(skb); 82 kfree_skb(skb);
83 } 83 }
84} 84}
@@ -93,7 +93,7 @@ void rxrpc_purge_queue(struct sk_buff_head *list)
93 while ((skb = skb_dequeue((list))) != NULL) { 93 while ((skb = skb_dequeue((list))) != NULL) {
94 int n = atomic_dec_return(select_skb_count(rxrpc_skb_rx_purged)); 94 int n = atomic_dec_return(select_skb_count(rxrpc_skb_rx_purged));
95 trace_rxrpc_skb(skb, rxrpc_skb_rx_purged, 95 trace_rxrpc_skb(skb, rxrpc_skb_rx_purged,
96 atomic_read(&skb->users), n, here); 96 refcount_read(&skb->users), n, here);
97 kfree_skb(skb); 97 kfree_skb(skb);
98 } 98 }
99} 99}