diff options
author | Elena Reshetova <elena.reshetova@intel.com> | 2017-03-06 09:21:14 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2017-03-17 00:32:59 -0400 |
commit | 8d66db50b2ac9dbf5cca9ede64f1c859d7b86eb6 (patch) | |
tree | c96d57baa39dbc208feca0b5e65f87515ba60bc0 /drivers/usb/gadget/legacy/inode.c | |
parent | b7ddc981d7b9e2fbfb33cb7cc47603d6e5d93bc9 (diff) |
drivers, usb: convert ep_data.count 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: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/usb/gadget/legacy/inode.c')
-rw-r--r-- | drivers/usb/gadget/legacy/inode.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/drivers/usb/gadget/legacy/inode.c b/drivers/usb/gadget/legacy/inode.c index db34b4dee0d9..b9ca0a26cbd9 100644 --- a/drivers/usb/gadget/legacy/inode.c +++ b/drivers/usb/gadget/legacy/inode.c | |||
@@ -191,7 +191,7 @@ enum ep_state { | |||
191 | struct ep_data { | 191 | struct ep_data { |
192 | struct mutex lock; | 192 | struct mutex lock; |
193 | enum ep_state state; | 193 | enum ep_state state; |
194 | atomic_t count; | 194 | refcount_t count; |
195 | struct dev_data *dev; | 195 | struct dev_data *dev; |
196 | /* must hold dev->lock before accessing ep or req */ | 196 | /* must hold dev->lock before accessing ep or req */ |
197 | struct usb_ep *ep; | 197 | struct usb_ep *ep; |
@@ -206,12 +206,12 @@ struct ep_data { | |||
206 | 206 | ||
207 | static inline void get_ep (struct ep_data *data) | 207 | static inline void get_ep (struct ep_data *data) |
208 | { | 208 | { |
209 | atomic_inc (&data->count); | 209 | refcount_inc (&data->count); |
210 | } | 210 | } |
211 | 211 | ||
212 | static void put_ep (struct ep_data *data) | 212 | static void put_ep (struct ep_data *data) |
213 | { | 213 | { |
214 | if (likely (!atomic_dec_and_test (&data->count))) | 214 | if (likely (!refcount_dec_and_test (&data->count))) |
215 | return; | 215 | return; |
216 | put_dev (data->dev); | 216 | put_dev (data->dev); |
217 | /* needs no more cleanup */ | 217 | /* needs no more cleanup */ |
@@ -1562,7 +1562,7 @@ static int activate_ep_files (struct dev_data *dev) | |||
1562 | init_waitqueue_head (&data->wait); | 1562 | init_waitqueue_head (&data->wait); |
1563 | 1563 | ||
1564 | strncpy (data->name, ep->name, sizeof (data->name) - 1); | 1564 | strncpy (data->name, ep->name, sizeof (data->name) - 1); |
1565 | atomic_set (&data->count, 1); | 1565 | refcount_set (&data->count, 1); |
1566 | data->dev = dev; | 1566 | data->dev = dev; |
1567 | get_dev (dev); | 1567 | get_dev (dev); |
1568 | 1568 | ||