You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
net: Make setsockopt() optlen be unsigned.
This provides safety against negative optlen at the type level instead of depending upon (sometimes non-trivial) checks against this sprinkled all over the the place, in each and every implementation. Based upon work done by Arjan van de Ven and feedback from Linus Torvalds. Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
@@ -1306,14 +1306,6 @@ static void amb_close (struct atm_vcc * atm_vcc) {
|
||||
return;
|
||||
}
|
||||
|
||||
/********** Set socket options for a VC **********/
|
||||
|
||||
// int amb_getsockopt (struct atm_vcc * atm_vcc, int level, int optname, void * optval, int optlen);
|
||||
|
||||
/********** Set socket options for a VC **********/
|
||||
|
||||
// int amb_setsockopt (struct atm_vcc * atm_vcc, int level, int optname, void * optval, int optlen);
|
||||
|
||||
/********** Send **********/
|
||||
|
||||
static int amb_send (struct atm_vcc * atm_vcc, struct sk_buff * skb) {
|
||||
|
||||
+1
-1
@@ -2031,7 +2031,7 @@ static int eni_getsockopt(struct atm_vcc *vcc,int level,int optname,
|
||||
|
||||
|
||||
static int eni_setsockopt(struct atm_vcc *vcc,int level,int optname,
|
||||
void __user *optval,int optlen)
|
||||
void __user *optval,unsigned int optlen)
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@@ -1244,7 +1244,7 @@ static int fs_getsockopt(struct atm_vcc *vcc,int level,int optname,
|
||||
|
||||
|
||||
static int fs_setsockopt(struct atm_vcc *vcc,int level,int optname,
|
||||
void __user *optval,int optlen)
|
||||
void __user *optval,unsigned int optlen)
|
||||
{
|
||||
func_enter ();
|
||||
func_exit ();
|
||||
|
||||
@@ -1795,7 +1795,7 @@ fore200e_getsockopt(struct atm_vcc* vcc, int level, int optname, void __user *op
|
||||
|
||||
|
||||
static int
|
||||
fore200e_setsockopt(struct atm_vcc* vcc, int level, int optname, void __user *optval, int optlen)
|
||||
fore200e_setsockopt(struct atm_vcc* vcc, int level, int optname, void __user *optval, unsigned int optlen)
|
||||
{
|
||||
/* struct fore200e* fore200e = FORE200E_DEV(vcc->dev); */
|
||||
|
||||
|
||||
@@ -2590,7 +2590,7 @@ static int hrz_getsockopt (struct atm_vcc * atm_vcc, int level, int optname,
|
||||
}
|
||||
|
||||
static int hrz_setsockopt (struct atm_vcc * atm_vcc, int level, int optname,
|
||||
void *optval, int optlen) {
|
||||
void *optval, unsigned int optlen) {
|
||||
hrz_dev * dev = HRZ_DEV(atm_vcc->dev);
|
||||
PRINTD (DBG_FLOW|DBG_VCC, "hrz_setsockopt");
|
||||
switch (level) {
|
||||
|
||||
@@ -2862,7 +2862,7 @@ static int ia_getsockopt(struct atm_vcc *vcc, int level, int optname,
|
||||
}
|
||||
|
||||
static int ia_setsockopt(struct atm_vcc *vcc, int level, int optname,
|
||||
void __user *optval, int optlen)
|
||||
void __user *optval, unsigned int optlen)
|
||||
{
|
||||
IF_EVENT(printk(">ia_setsockopt\n");)
|
||||
return -EINVAL;
|
||||
|
||||
+1
-1
@@ -1517,7 +1517,7 @@ static int zatm_getsockopt(struct atm_vcc *vcc,int level,int optname,
|
||||
|
||||
|
||||
static int zatm_setsockopt(struct atm_vcc *vcc,int level,int optname,
|
||||
void __user *optval,int optlen)
|
||||
void __user *optval,unsigned int optlen)
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@@ -415,7 +415,7 @@ data_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
|
||||
}
|
||||
|
||||
static int data_sock_setsockopt(struct socket *sock, int level, int optname,
|
||||
char __user *optval, int len)
|
||||
char __user *optval, unsigned int len)
|
||||
{
|
||||
struct sock *sk = sock->sk;
|
||||
int err = 0, opt = 0;
|
||||
|
||||
@@ -2179,7 +2179,7 @@ static int pppol2tp_session_setsockopt(struct sock *sk,
|
||||
* session or the special tunnel type.
|
||||
*/
|
||||
static int pppol2tp_setsockopt(struct socket *sock, int level, int optname,
|
||||
char __user *optval, int optlen)
|
||||
char __user *optval, unsigned int optlen)
|
||||
{
|
||||
struct sock *sk = sock->sk;
|
||||
struct pppol2tp_session *session = sk->sk_user_data;
|
||||
|
||||
@@ -397,7 +397,7 @@ struct atmdev_ops { /* only send is required */
|
||||
int (*getsockopt)(struct atm_vcc *vcc,int level,int optname,
|
||||
void __user *optval,int optlen);
|
||||
int (*setsockopt)(struct atm_vcc *vcc,int level,int optname,
|
||||
void __user *optval,int optlen);
|
||||
void __user *optval,unsigned int optlen);
|
||||
int (*send)(struct atm_vcc *vcc,struct sk_buff *skb);
|
||||
int (*send_oam)(struct atm_vcc *vcc,void *cell,int flags);
|
||||
void (*phy_put)(struct atm_dev *dev,unsigned char value,
|
||||
|
||||
@@ -145,14 +145,14 @@ static inline int ip_mroute_opt(int opt)
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_IP_MROUTE
|
||||
extern int ip_mroute_setsockopt(struct sock *, int, char __user *, int);
|
||||
extern int ip_mroute_setsockopt(struct sock *, int, char __user *, unsigned int);
|
||||
extern int ip_mroute_getsockopt(struct sock *, int, char __user *, int __user *);
|
||||
extern int ipmr_ioctl(struct sock *sk, int cmd, void __user *arg);
|
||||
extern int ip_mr_init(void);
|
||||
#else
|
||||
static inline
|
||||
int ip_mroute_setsockopt(struct sock *sock,
|
||||
int optname, char __user *optval, int optlen)
|
||||
int optname, char __user *optval, unsigned int optlen)
|
||||
{
|
||||
return -ENOPROTOOPT;
|
||||
}
|
||||
|
||||
@@ -134,7 +134,7 @@ static inline int ip6_mroute_opt(int opt)
|
||||
struct sock;
|
||||
|
||||
#ifdef CONFIG_IPV6_MROUTE
|
||||
extern int ip6_mroute_setsockopt(struct sock *, int, char __user *, int);
|
||||
extern int ip6_mroute_setsockopt(struct sock *, int, char __user *, unsigned int);
|
||||
extern int ip6_mroute_getsockopt(struct sock *, int, char __user *, int __user *);
|
||||
extern int ip6_mr_input(struct sk_buff *skb);
|
||||
extern int ip6mr_ioctl(struct sock *sk, int cmd, void __user *arg);
|
||||
@@ -143,7 +143,7 @@ extern void ip6_mr_cleanup(void);
|
||||
#else
|
||||
static inline
|
||||
int ip6_mroute_setsockopt(struct sock *sock,
|
||||
int optname, char __user *optval, int optlen)
|
||||
int optname, char __user *optval, unsigned int optlen)
|
||||
{
|
||||
return -ENOPROTOOPT;
|
||||
}
|
||||
|
||||
+4
-4
@@ -178,11 +178,11 @@ struct proto_ops {
|
||||
int (*listen) (struct socket *sock, int len);
|
||||
int (*shutdown) (struct socket *sock, int flags);
|
||||
int (*setsockopt)(struct socket *sock, int level,
|
||||
int optname, char __user *optval, int optlen);
|
||||
int optname, char __user *optval, unsigned int optlen);
|
||||
int (*getsockopt)(struct socket *sock, int level,
|
||||
int optname, char __user *optval, int __user *optlen);
|
||||
int (*compat_setsockopt)(struct socket *sock, int level,
|
||||
int optname, char __user *optval, int optlen);
|
||||
int optname, char __user *optval, unsigned int optlen);
|
||||
int (*compat_getsockopt)(struct socket *sock, int level,
|
||||
int optname, char __user *optval, int __user *optlen);
|
||||
int (*sendmsg) (struct kiocb *iocb, struct socket *sock,
|
||||
@@ -256,7 +256,7 @@ extern int kernel_getpeername(struct socket *sock, struct sockaddr *addr,
|
||||
extern int kernel_getsockopt(struct socket *sock, int level, int optname,
|
||||
char *optval, int *optlen);
|
||||
extern int kernel_setsockopt(struct socket *sock, int level, int optname,
|
||||
char *optval, int optlen);
|
||||
char *optval, unsigned int optlen);
|
||||
extern int kernel_sendpage(struct socket *sock, struct page *page, int offset,
|
||||
size_t size, int flags);
|
||||
extern int kernel_sock_ioctl(struct socket *sock, int cmd, unsigned long arg);
|
||||
@@ -313,7 +313,7 @@ SOCKCALL_WRAP(name, compat_ioctl, (struct socket *sock, unsigned int cmd, \
|
||||
SOCKCALL_WRAP(name, listen, (struct socket *sock, int len), (sock, len)) \
|
||||
SOCKCALL_WRAP(name, shutdown, (struct socket *sock, int flags), (sock, flags)) \
|
||||
SOCKCALL_WRAP(name, setsockopt, (struct socket *sock, int level, int optname, \
|
||||
char __user *optval, int optlen), (sock, level, optname, optval, optlen)) \
|
||||
char __user *optval, unsigned int optlen), (sock, level, optname, optval, optlen)) \
|
||||
SOCKCALL_WRAP(name, getsockopt, (struct socket *sock, int level, int optname, \
|
||||
char __user *optval, int __user *optlen), (sock, level, optname, optval, optlen)) \
|
||||
SOCKCALL_WRAP(name, sendmsg, (struct kiocb *iocb, struct socket *sock, struct msghdr *m, size_t len), \
|
||||
|
||||
@@ -221,12 +221,12 @@ __ret;})
|
||||
|
||||
/* Call setsockopt() */
|
||||
int nf_setsockopt(struct sock *sk, u_int8_t pf, int optval, char __user *opt,
|
||||
int len);
|
||||
unsigned int len);
|
||||
int nf_getsockopt(struct sock *sk, u_int8_t pf, int optval, char __user *opt,
|
||||
int *len);
|
||||
|
||||
int compat_nf_setsockopt(struct sock *sk, u_int8_t pf, int optval,
|
||||
char __user *opt, int len);
|
||||
char __user *opt, unsigned int len);
|
||||
int compat_nf_getsockopt(struct sock *sk, u_int8_t pf, int optval,
|
||||
char __user *opt, int *len);
|
||||
|
||||
|
||||
@@ -40,8 +40,8 @@ extern int put_cmsg_compat(struct msghdr*, int, int, int, void *);
|
||||
|
||||
extern int cmsghdr_from_user_compat_to_kern(struct msghdr *, struct sock *, unsigned char *, int);
|
||||
|
||||
extern int compat_mc_setsockopt(struct sock *, int, int, char __user *, int,
|
||||
int (*)(struct sock *, int, int, char __user *, int));
|
||||
extern int compat_mc_setsockopt(struct sock *, int, int, char __user *, unsigned int,
|
||||
int (*)(struct sock *, int, int, char __user *, unsigned int));
|
||||
extern int compat_mc_getsockopt(struct sock *, int, int, char __user *,
|
||||
int __user *, int (*)(struct sock *, int, int, char __user *,
|
||||
int __user *));
|
||||
|
||||
@@ -48,13 +48,13 @@ struct inet_connection_sock_af_ops {
|
||||
u16 net_header_len;
|
||||
u16 sockaddr_len;
|
||||
int (*setsockopt)(struct sock *sk, int level, int optname,
|
||||
char __user *optval, int optlen);
|
||||
char __user *optval, unsigned int optlen);
|
||||
int (*getsockopt)(struct sock *sk, int level, int optname,
|
||||
char __user *optval, int __user *optlen);
|
||||
#ifdef CONFIG_COMPAT
|
||||
int (*compat_setsockopt)(struct sock *sk,
|
||||
int level, int optname,
|
||||
char __user *optval, int optlen);
|
||||
char __user *optval, unsigned int optlen);
|
||||
int (*compat_getsockopt)(struct sock *sk,
|
||||
int level, int optname,
|
||||
char __user *optval, int __user *optlen);
|
||||
@@ -332,5 +332,5 @@ extern void inet_csk_addr2sockaddr(struct sock *sk, struct sockaddr *uaddr);
|
||||
extern int inet_csk_compat_getsockopt(struct sock *sk, int level, int optname,
|
||||
char __user *optval, int __user *optlen);
|
||||
extern int inet_csk_compat_setsockopt(struct sock *sk, int level, int optname,
|
||||
char __user *optval, int optlen);
|
||||
char __user *optval, unsigned int optlen);
|
||||
#endif /* _INET_CONNECTION_SOCK_H */
|
||||
|
||||
+2
-2
@@ -381,10 +381,10 @@ extern int ip_options_rcv_srr(struct sk_buff *skb);
|
||||
extern void ip_cmsg_recv(struct msghdr *msg, struct sk_buff *skb);
|
||||
extern int ip_cmsg_send(struct net *net,
|
||||
struct msghdr *msg, struct ipcm_cookie *ipc);
|
||||
extern int ip_setsockopt(struct sock *sk, int level, int optname, char __user *optval, int optlen);
|
||||
extern int ip_setsockopt(struct sock *sk, int level, int optname, char __user *optval, unsigned int optlen);
|
||||
extern int ip_getsockopt(struct sock *sk, int level, int optname, char __user *optval, int __user *optlen);
|
||||
extern int compat_ip_setsockopt(struct sock *sk, int level,
|
||||
int optname, char __user *optval, int optlen);
|
||||
int optname, char __user *optval, unsigned int optlen);
|
||||
extern int compat_ip_getsockopt(struct sock *sk, int level,
|
||||
int optname, char __user *optval, int __user *optlen);
|
||||
extern int ip_ra_control(struct sock *sk, unsigned char on, void (*destructor)(struct sock *));
|
||||
|
||||
+2
-2
@@ -550,7 +550,7 @@ extern int ipv6_find_tlv(struct sk_buff *skb, int offset, int type);
|
||||
extern int ipv6_setsockopt(struct sock *sk, int level,
|
||||
int optname,
|
||||
char __user *optval,
|
||||
int optlen);
|
||||
unsigned int optlen);
|
||||
extern int ipv6_getsockopt(struct sock *sk, int level,
|
||||
int optname,
|
||||
char __user *optval,
|
||||
@@ -559,7 +559,7 @@ extern int compat_ipv6_setsockopt(struct sock *sk,
|
||||
int level,
|
||||
int optname,
|
||||
char __user *optval,
|
||||
int optlen);
|
||||
unsigned int optlen);
|
||||
extern int compat_ipv6_getsockopt(struct sock *sk,
|
||||
int level,
|
||||
int optname,
|
||||
|
||||
@@ -544,7 +544,7 @@ struct sctp_af {
|
||||
int level,
|
||||
int optname,
|
||||
char __user *optval,
|
||||
int optlen);
|
||||
unsigned int optlen);
|
||||
int (*getsockopt) (struct sock *sk,
|
||||
int level,
|
||||
int optname,
|
||||
@@ -554,7 +554,7 @@ struct sctp_af {
|
||||
int level,
|
||||
int optname,
|
||||
char __user *optval,
|
||||
int optlen);
|
||||
unsigned int optlen);
|
||||
int (*compat_getsockopt) (struct sock *sk,
|
||||
int level,
|
||||
int optname,
|
||||
|
||||
+6
-6
@@ -624,7 +624,7 @@ struct proto {
|
||||
void (*shutdown)(struct sock *sk, int how);
|
||||
int (*setsockopt)(struct sock *sk, int level,
|
||||
int optname, char __user *optval,
|
||||
int optlen);
|
||||
unsigned int optlen);
|
||||
int (*getsockopt)(struct sock *sk, int level,
|
||||
int optname, char __user *optval,
|
||||
int __user *option);
|
||||
@@ -632,7 +632,7 @@ struct proto {
|
||||
int (*compat_setsockopt)(struct sock *sk,
|
||||
int level,
|
||||
int optname, char __user *optval,
|
||||
int optlen);
|
||||
unsigned int optlen);
|
||||
int (*compat_getsockopt)(struct sock *sk,
|
||||
int level,
|
||||
int optname, char __user *optval,
|
||||
@@ -951,7 +951,7 @@ extern void sock_rfree(struct sk_buff *skb);
|
||||
|
||||
extern int sock_setsockopt(struct socket *sock, int level,
|
||||
int op, char __user *optval,
|
||||
int optlen);
|
||||
unsigned int optlen);
|
||||
|
||||
extern int sock_getsockopt(struct socket *sock, int level,
|
||||
int op, char __user *optval,
|
||||
@@ -993,7 +993,7 @@ extern int sock_no_shutdown(struct socket *, int);
|
||||
extern int sock_no_getsockopt(struct socket *, int , int,
|
||||
char __user *, int __user *);
|
||||
extern int sock_no_setsockopt(struct socket *, int, int,
|
||||
char __user *, int);
|
||||
char __user *, unsigned int);
|
||||
extern int sock_no_sendmsg(struct kiocb *, struct socket *,
|
||||
struct msghdr *, size_t);
|
||||
extern int sock_no_recvmsg(struct kiocb *, struct socket *,
|
||||
@@ -1015,11 +1015,11 @@ extern int sock_common_getsockopt(struct socket *sock, int level, int optname,
|
||||
extern int sock_common_recvmsg(struct kiocb *iocb, struct socket *sock,
|
||||
struct msghdr *msg, size_t size, int flags);
|
||||
extern int sock_common_setsockopt(struct socket *sock, int level, int optname,
|
||||
char __user *optval, int optlen);
|
||||
char __user *optval, unsigned int optlen);
|
||||
extern int compat_sock_common_getsockopt(struct socket *sock, int level,
|
||||
int optname, char __user *optval, int __user *optlen);
|
||||
extern int compat_sock_common_setsockopt(struct socket *sock, int level,
|
||||
int optname, char __user *optval, int optlen);
|
||||
int optname, char __user *optval, unsigned int optlen);
|
||||
|
||||
extern void sk_common_release(struct sock *sk);
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user