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:
@@ -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 */
|
||||
|
@@ -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 *));
|
||||
|
@@ -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,
|
||||
|
@@ -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);
|
||||
|
||||
|
@@ -394,13 +394,13 @@ extern int tcp_getsockopt(struct sock *sk, int level,
|
||||
int __user *optlen);
|
||||
extern int tcp_setsockopt(struct sock *sk, int level,
|
||||
int optname, char __user *optval,
|
||||
int optlen);
|
||||
unsigned int optlen);
|
||||
extern int compat_tcp_getsockopt(struct sock *sk,
|
||||
int level, int optname,
|
||||
char __user *optval, int __user *optlen);
|
||||
extern int compat_tcp_setsockopt(struct sock *sk,
|
||||
int level, int optname,
|
||||
char __user *optval, int optlen);
|
||||
char __user *optval, unsigned int optlen);
|
||||
extern void tcp_set_keepalive(struct sock *sk, int val);
|
||||
extern int tcp_recvmsg(struct kiocb *iocb, struct sock *sk,
|
||||
struct msghdr *msg,
|
||||
|
@@ -144,7 +144,7 @@ extern unsigned int udp_poll(struct file *file, struct socket *sock,
|
||||
extern int udp_lib_getsockopt(struct sock *sk, int level, int optname,
|
||||
char __user *optval, int __user *optlen);
|
||||
extern int udp_lib_setsockopt(struct sock *sk, int level, int optname,
|
||||
char __user *optval, int optlen,
|
||||
char __user *optval, unsigned int optlen,
|
||||
int (*push_pending_frames)(struct sock *));
|
||||
|
||||
extern struct sock *udp4_lib_lookup(struct net *net, __be32 saddr, __be16 sport,
|
||||
|
Reference in New Issue
Block a user