mirror of
				git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
				synced 2025-09-18 22:14:16 +00:00 
			
		
		
		
	net, l2tp: convert l2tp_session.ref_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: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
							parent
							
								
									fbea9e0760
								
							
						
					
					
						commit
						f00c854c96
					
				
					 2 changed files with 6 additions and 6 deletions
				
			
		|  | @ -1854,7 +1854,7 @@ struct l2tp_session *l2tp_session_create(int priv_size, struct l2tp_tunnel *tunn | |||
| 		/* Bump the reference count. The session context is deleted
 | ||||
| 		 * only when this drops to zero. | ||||
| 		 */ | ||||
| 		l2tp_session_inc_refcount(session); | ||||
| 		refcount_set(&session->ref_count, 1); | ||||
| 		l2tp_tunnel_inc_refcount(tunnel); | ||||
| 
 | ||||
| 		/* Ensure tunnel socket isn't deleted */ | ||||
|  |  | |||
|  | @ -99,7 +99,7 @@ struct l2tp_session { | |||
| 	int			nr_oos_count;	/* For OOS recovery */ | ||||
| 	int			nr_oos_count_max; | ||||
| 	struct hlist_node	hlist;		/* Hash list node */ | ||||
| 	atomic_t		ref_count; | ||||
| 	refcount_t		ref_count; | ||||
| 
 | ||||
| 	char			name[32];	/* for logging */ | ||||
| 	char			ifname[IFNAMSIZ]; | ||||
|  | @ -274,12 +274,12 @@ int l2tp_ioctl(struct sock *sk, int cmd, unsigned long arg); | |||
|  */ | ||||
| static inline void l2tp_session_inc_refcount_1(struct l2tp_session *session) | ||||
| { | ||||
| 	atomic_inc(&session->ref_count); | ||||
| 	refcount_inc(&session->ref_count); | ||||
| } | ||||
| 
 | ||||
| static inline void l2tp_session_dec_refcount_1(struct l2tp_session *session) | ||||
| { | ||||
| 	if (atomic_dec_and_test(&session->ref_count)) | ||||
| 	if (refcount_dec_and_test(&session->ref_count)) | ||||
| 		l2tp_session_free(session); | ||||
| } | ||||
| 
 | ||||
|  | @ -288,14 +288,14 @@ static inline void l2tp_session_dec_refcount_1(struct l2tp_session *session) | |||
| do {									\ | ||||
| 	pr_debug("l2tp_session_inc_refcount: %s:%d %s: cnt=%d\n",	\ | ||||
| 		 __func__, __LINE__, (_s)->name,			\ | ||||
| 		 atomic_read(&_s->ref_count));				\ | ||||
| 		 refcount_read(&_s->ref_count));			\ | ||||
| 	l2tp_session_inc_refcount_1(_s);				\ | ||||
| } while (0) | ||||
| #define l2tp_session_dec_refcount(_s)					\ | ||||
| do {									\ | ||||
| 	pr_debug("l2tp_session_dec_refcount: %s:%d %s: cnt=%d\n",	\ | ||||
| 		 __func__, __LINE__, (_s)->name,			\ | ||||
| 		 atomic_read(&_s->ref_count));				\ | ||||
| 		 refcount_read(&_s->ref_count));			\ | ||||
| 	l2tp_session_dec_refcount_1(_s);				\ | ||||
| } while (0) | ||||
| #else | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 Reshetova, Elena
						Reshetova, Elena