diff options
author | Reshetova, Elena <elena.reshetova@intel.com> | 2017-06-30 06:07:58 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2017-07-01 10:39:07 -0400 |
commit | 633547973ffc32fd2c815639d4675e1531f0896f (patch) | |
tree | 751ca7a379366af93f578d9f35f48339d4d2dd9b /net/rxrpc | |
parent | 53869cebce4bc53f71a080e7830600d4ae1ab712 (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.c | 12 |
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 | } |