forked from mirrors/linux
		
	net: validate SO_TXTIME clockid coming from userspace
Currently there are no strict checks while setting SO_TXTIME
from userspace. With the recent development in skb->tstamp_type
clockid with unsupported clocks results in warn_on_once, which causes
unnecessary aborts in some systems which enables panic on warns.
Add validation in setsockopt to support only CLOCK_REALTIME,
CLOCK_MONOTONIC and CLOCK_TAI to be set from userspace.
Link: https://lore.kernel.org/netdev/bc037db4-58bb-4861-ac31-a361a93841d3@linux.dev/
Link: https://lore.kernel.org/lkml/6bdba7b6-fd22-4ea5-a356-12268674def1@quicinc.com/
Fixes: 1693c5db6a ("net: Add additional bit to support clockid_t timestamp type")
Reported-by: syzbot+d7b227731ec589e7f4f0@syzkaller.appspotmail.com
Closes: https://syzkaller.appspot.com/bug?extid=d7b227731ec589e7f4f0
Reported-by: syzbot+30a35a2e9c5067cc43fa@syzkaller.appspotmail.com
Closes: https://syzkaller.appspot.com/bug?extid=30a35a2e9c5067cc43fa
Signed-off-by: Abhishek Chauhan <quic_abchauha@quicinc.com>
Acked-by: Martin KaFai Lau <martin.lau@kernel.org>
Reviewed-by: Willem de Bruijn <willemb@google.com>
Link: https://lore.kernel.org/r/20240529183130.1717083-1-quic_abchauha@quicinc.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
			
			
This commit is contained in:
		
							parent
							
								
									d1f9e6513e
								
							
						
					
					
						commit
						73451e9aaa
					
				
					 1 changed files with 16 additions and 0 deletions
				
			
		|  | @ -1083,6 +1083,17 @@ bool sockopt_capable(int cap) | ||||||
| } | } | ||||||
| EXPORT_SYMBOL(sockopt_capable); | EXPORT_SYMBOL(sockopt_capable); | ||||||
| 
 | 
 | ||||||
|  | static int sockopt_validate_clockid(__kernel_clockid_t value) | ||||||
|  | { | ||||||
|  | 	switch (value) { | ||||||
|  | 	case CLOCK_REALTIME: | ||||||
|  | 	case CLOCK_MONOTONIC: | ||||||
|  | 	case CLOCK_TAI: | ||||||
|  | 		return 0; | ||||||
|  | 	} | ||||||
|  | 	return -EINVAL; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| /*
 | /*
 | ||||||
|  *	This is meant for all protocols to use and covers goings on |  *	This is meant for all protocols to use and covers goings on | ||||||
|  *	at the socket level. Everything here is generic. |  *	at the socket level. Everything here is generic. | ||||||
|  | @ -1497,6 +1508,11 @@ int sk_setsockopt(struct sock *sk, int level, int optname, | ||||||
| 			ret = -EPERM; | 			ret = -EPERM; | ||||||
| 			break; | 			break; | ||||||
| 		} | 		} | ||||||
|  | 
 | ||||||
|  | 		ret = sockopt_validate_clockid(sk_txtime.clockid); | ||||||
|  | 		if (ret) | ||||||
|  | 			break; | ||||||
|  | 
 | ||||||
| 		sock_valbool_flag(sk, SOCK_TXTIME, true); | 		sock_valbool_flag(sk, SOCK_TXTIME, true); | ||||||
| 		sk->sk_clockid = sk_txtime.clockid; | 		sk->sk_clockid = sk_txtime.clockid; | ||||||
| 		sk->sk_txtime_deadline_mode = | 		sk->sk_txtime_deadline_mode = | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Abhishek Chauhan
						Abhishek Chauhan