Loading net/ipv4/ip_sockglue.c +36 −37 Original line number Original line Diff line number Diff line Loading @@ -189,6 +189,7 @@ void ip_cmsg_recv(struct msghdr *msg, struct sk_buff *skb) ip_cmsg_recv_dstaddr(msg, skb); ip_cmsg_recv_dstaddr(msg, skb); } } EXPORT_SYMBOL(ip_cmsg_recv); int ip_cmsg_send(struct net *net, struct msghdr *msg, struct ipcm_cookie *ipc) int ip_cmsg_send(struct net *net, struct msghdr *msg, struct ipcm_cookie *ipc) { { Loading @@ -203,7 +204,8 @@ int ip_cmsg_send(struct net *net, struct msghdr *msg, struct ipcm_cookie *ipc) switch (cmsg->cmsg_type) { switch (cmsg->cmsg_type) { case IP_RETOPTS: case IP_RETOPTS: err = cmsg->cmsg_len - CMSG_ALIGN(sizeof(struct cmsghdr)); err = cmsg->cmsg_len - CMSG_ALIGN(sizeof(struct cmsghdr)); err = ip_options_get(net, &ipc->opt, CMSG_DATA(cmsg), err < 40 ? err : 40); err = ip_options_get(net, &ipc->opt, CMSG_DATA(cmsg), err < 40 ? err : 40); if (err) if (err) return err; return err; break; break; Loading Loading @@ -238,7 +240,8 @@ int ip_cmsg_send(struct net *net, struct msghdr *msg, struct ipcm_cookie *ipc) struct ip_ra_chain *ip_ra_chain; struct ip_ra_chain *ip_ra_chain; DEFINE_RWLOCK(ip_ra_lock); DEFINE_RWLOCK(ip_ra_lock); int ip_ra_control(struct sock *sk, unsigned char on, void (*destructor)(struct sock *)) int ip_ra_control(struct sock *sk, unsigned char on, void (*destructor)(struct sock *)) { { struct ip_ra_chain *ra, *new_ra, **rap; struct ip_ra_chain *ra, *new_ra, **rap; Loading Loading @@ -416,7 +419,8 @@ int ip_recv_error(struct sock *sk, struct msghdr *msg, int len) /* Reset and regenerate socket error */ /* Reset and regenerate socket error */ spin_lock_bh(&sk->sk_error_queue.lock); spin_lock_bh(&sk->sk_error_queue.lock); sk->sk_err = 0; sk->sk_err = 0; if ((skb2 = skb_peek(&sk->sk_error_queue)) != NULL) { skb2 = skb_peek(&sk->sk_error_queue); if (skb2 != NULL) { sk->sk_err = SKB_EXT_ERR(skb2)->ee.ee_errno; sk->sk_err = SKB_EXT_ERR(skb2)->ee.ee_errno; spin_unlock_bh(&sk->sk_error_queue.lock); spin_unlock_bh(&sk->sk_error_queue.lock); sk->sk_error_report(sk); sk->sk_error_report(sk); Loading @@ -431,8 +435,8 @@ int ip_recv_error(struct sock *sk, struct msghdr *msg, int len) /* /* * Socket option code for IP. This is the end of the line after any TCP,UDP etc options on * Socket option code for IP. This is the end of the line after any * an IP socket. * TCP,UDP etc options on an IP socket. */ */ static int do_ip_setsockopt(struct sock *sk, int level, static int do_ip_setsockopt(struct sock *sk, int level, Loading Loading @@ -558,7 +562,7 @@ static int do_ip_setsockopt(struct sock *sk, int level, case IP_TTL: case IP_TTL: if (optlen < 1) if (optlen < 1) goto e_inval; goto e_inval; if (val != -1 && (val < 1 || val>255)) if (val != -1 && (val < 0 || val > 255)) goto e_inval; goto e_inval; inet->uc_ttl = val; inet->uc_ttl = val; break; break; Loading Loading @@ -613,7 +617,8 @@ static int do_ip_setsockopt(struct sock *sk, int level, } else { } else { memset(&mreq, 0, sizeof(mreq)); memset(&mreq, 0, sizeof(mreq)); if (optlen >= sizeof(struct in_addr) && if (optlen >= sizeof(struct in_addr) && copy_from_user(&mreq.imr_address, optval, sizeof(struct in_addr))) copy_from_user(&mreq.imr_address, optval, sizeof(struct in_addr))) break; break; } } Loading Loading @@ -677,7 +682,6 @@ static int do_ip_setsockopt(struct sock *sk, int level, } } case IP_MSFILTER: case IP_MSFILTER: { { extern int sysctl_igmp_max_msf; struct ip_msfilter *msf; struct ip_msfilter *msf; if (optlen < IP_MSFILTER_SIZE(0)) if (optlen < IP_MSFILTER_SIZE(0)) Loading Loading @@ -831,7 +835,6 @@ static int do_ip_setsockopt(struct sock *sk, int level, } } case MCAST_MSFILTER: case MCAST_MSFILTER: { { extern int sysctl_igmp_max_msf; struct sockaddr_in *psin; struct sockaddr_in *psin; struct ip_msfilter *msf = NULL; struct ip_msfilter *msf = NULL; struct group_filter *gsf = NULL; struct group_filter *gsf = NULL; Loading @@ -849,9 +852,9 @@ static int do_ip_setsockopt(struct sock *sk, int level, break; break; } } err = -EFAULT; err = -EFAULT; if (copy_from_user(gsf, optval, optlen)) { if (copy_from_user(gsf, optval, optlen)) goto mc_msf_out; goto mc_msf_out; } /* numsrc >= (4G-140)/128 overflow in 32 bits */ /* numsrc >= (4G-140)/128 overflow in 32 bits */ if (gsf->gf_numsrc >= 0x1ffffff || if (gsf->gf_numsrc >= 0x1ffffff || gsf->gf_numsrc > sysctl_igmp_max_msf) { gsf->gf_numsrc > sysctl_igmp_max_msf) { Loading Loading @@ -957,6 +960,7 @@ int ip_setsockopt(struct sock *sk, int level, #endif #endif return err; return err; } } EXPORT_SYMBOL(ip_setsockopt); #ifdef CONFIG_COMPAT #ifdef CONFIG_COMPAT int compat_ip_setsockopt(struct sock *sk, int level, int optname, int compat_ip_setsockopt(struct sock *sk, int level, int optname, Loading Loading @@ -986,13 +990,12 @@ int compat_ip_setsockopt(struct sock *sk, int level, int optname, #endif #endif return err; return err; } } EXPORT_SYMBOL(compat_ip_setsockopt); EXPORT_SYMBOL(compat_ip_setsockopt); #endif #endif /* /* * Get the options. Note for future reference. The GET of IP options gets the * Get the options. Note for future reference. The GET of IP options gets * _received_ ones. The set sets the _sent_ ones. * the _received_ ones. The set sets the _sent_ ones. */ */ static int do_ip_getsockopt(struct sock *sk, int level, int optname, static int do_ip_getsockopt(struct sock *sk, int level, int optname, Loading Loading @@ -1143,7 +1146,8 @@ static int do_ip_getsockopt(struct sock *sk, int level, int optname, return -EFAULT; return -EFAULT; } } err = ip_mc_gsfget(sk, &gsf, err = ip_mc_gsfget(sk, &gsf, (struct group_filter __user *)optval, optlen); (struct group_filter __user *)optval, optlen); release_sock(sk); release_sock(sk); return err; return err; } } Loading Loading @@ -1230,6 +1234,7 @@ int ip_getsockopt(struct sock *sk, int level, #endif #endif return err; return err; } } EXPORT_SYMBOL(ip_getsockopt); #ifdef CONFIG_COMPAT #ifdef CONFIG_COMPAT int compat_ip_getsockopt(struct sock *sk, int level, int optname, int compat_ip_getsockopt(struct sock *sk, int level, int optname, Loading Loading @@ -1262,11 +1267,5 @@ int compat_ip_getsockopt(struct sock *sk, int level, int optname, #endif #endif return err; return err; } } EXPORT_SYMBOL(compat_ip_getsockopt); EXPORT_SYMBOL(compat_ip_getsockopt); #endif #endif EXPORT_SYMBOL(ip_cmsg_recv); EXPORT_SYMBOL(ip_getsockopt); EXPORT_SYMBOL(ip_setsockopt); Loading
net/ipv4/ip_sockglue.c +36 −37 Original line number Original line Diff line number Diff line Loading @@ -189,6 +189,7 @@ void ip_cmsg_recv(struct msghdr *msg, struct sk_buff *skb) ip_cmsg_recv_dstaddr(msg, skb); ip_cmsg_recv_dstaddr(msg, skb); } } EXPORT_SYMBOL(ip_cmsg_recv); int ip_cmsg_send(struct net *net, struct msghdr *msg, struct ipcm_cookie *ipc) int ip_cmsg_send(struct net *net, struct msghdr *msg, struct ipcm_cookie *ipc) { { Loading @@ -203,7 +204,8 @@ int ip_cmsg_send(struct net *net, struct msghdr *msg, struct ipcm_cookie *ipc) switch (cmsg->cmsg_type) { switch (cmsg->cmsg_type) { case IP_RETOPTS: case IP_RETOPTS: err = cmsg->cmsg_len - CMSG_ALIGN(sizeof(struct cmsghdr)); err = cmsg->cmsg_len - CMSG_ALIGN(sizeof(struct cmsghdr)); err = ip_options_get(net, &ipc->opt, CMSG_DATA(cmsg), err < 40 ? err : 40); err = ip_options_get(net, &ipc->opt, CMSG_DATA(cmsg), err < 40 ? err : 40); if (err) if (err) return err; return err; break; break; Loading Loading @@ -238,7 +240,8 @@ int ip_cmsg_send(struct net *net, struct msghdr *msg, struct ipcm_cookie *ipc) struct ip_ra_chain *ip_ra_chain; struct ip_ra_chain *ip_ra_chain; DEFINE_RWLOCK(ip_ra_lock); DEFINE_RWLOCK(ip_ra_lock); int ip_ra_control(struct sock *sk, unsigned char on, void (*destructor)(struct sock *)) int ip_ra_control(struct sock *sk, unsigned char on, void (*destructor)(struct sock *)) { { struct ip_ra_chain *ra, *new_ra, **rap; struct ip_ra_chain *ra, *new_ra, **rap; Loading Loading @@ -416,7 +419,8 @@ int ip_recv_error(struct sock *sk, struct msghdr *msg, int len) /* Reset and regenerate socket error */ /* Reset and regenerate socket error */ spin_lock_bh(&sk->sk_error_queue.lock); spin_lock_bh(&sk->sk_error_queue.lock); sk->sk_err = 0; sk->sk_err = 0; if ((skb2 = skb_peek(&sk->sk_error_queue)) != NULL) { skb2 = skb_peek(&sk->sk_error_queue); if (skb2 != NULL) { sk->sk_err = SKB_EXT_ERR(skb2)->ee.ee_errno; sk->sk_err = SKB_EXT_ERR(skb2)->ee.ee_errno; spin_unlock_bh(&sk->sk_error_queue.lock); spin_unlock_bh(&sk->sk_error_queue.lock); sk->sk_error_report(sk); sk->sk_error_report(sk); Loading @@ -431,8 +435,8 @@ int ip_recv_error(struct sock *sk, struct msghdr *msg, int len) /* /* * Socket option code for IP. This is the end of the line after any TCP,UDP etc options on * Socket option code for IP. This is the end of the line after any * an IP socket. * TCP,UDP etc options on an IP socket. */ */ static int do_ip_setsockopt(struct sock *sk, int level, static int do_ip_setsockopt(struct sock *sk, int level, Loading Loading @@ -558,7 +562,7 @@ static int do_ip_setsockopt(struct sock *sk, int level, case IP_TTL: case IP_TTL: if (optlen < 1) if (optlen < 1) goto e_inval; goto e_inval; if (val != -1 && (val < 1 || val>255)) if (val != -1 && (val < 0 || val > 255)) goto e_inval; goto e_inval; inet->uc_ttl = val; inet->uc_ttl = val; break; break; Loading Loading @@ -613,7 +617,8 @@ static int do_ip_setsockopt(struct sock *sk, int level, } else { } else { memset(&mreq, 0, sizeof(mreq)); memset(&mreq, 0, sizeof(mreq)); if (optlen >= sizeof(struct in_addr) && if (optlen >= sizeof(struct in_addr) && copy_from_user(&mreq.imr_address, optval, sizeof(struct in_addr))) copy_from_user(&mreq.imr_address, optval, sizeof(struct in_addr))) break; break; } } Loading Loading @@ -677,7 +682,6 @@ static int do_ip_setsockopt(struct sock *sk, int level, } } case IP_MSFILTER: case IP_MSFILTER: { { extern int sysctl_igmp_max_msf; struct ip_msfilter *msf; struct ip_msfilter *msf; if (optlen < IP_MSFILTER_SIZE(0)) if (optlen < IP_MSFILTER_SIZE(0)) Loading Loading @@ -831,7 +835,6 @@ static int do_ip_setsockopt(struct sock *sk, int level, } } case MCAST_MSFILTER: case MCAST_MSFILTER: { { extern int sysctl_igmp_max_msf; struct sockaddr_in *psin; struct sockaddr_in *psin; struct ip_msfilter *msf = NULL; struct ip_msfilter *msf = NULL; struct group_filter *gsf = NULL; struct group_filter *gsf = NULL; Loading @@ -849,9 +852,9 @@ static int do_ip_setsockopt(struct sock *sk, int level, break; break; } } err = -EFAULT; err = -EFAULT; if (copy_from_user(gsf, optval, optlen)) { if (copy_from_user(gsf, optval, optlen)) goto mc_msf_out; goto mc_msf_out; } /* numsrc >= (4G-140)/128 overflow in 32 bits */ /* numsrc >= (4G-140)/128 overflow in 32 bits */ if (gsf->gf_numsrc >= 0x1ffffff || if (gsf->gf_numsrc >= 0x1ffffff || gsf->gf_numsrc > sysctl_igmp_max_msf) { gsf->gf_numsrc > sysctl_igmp_max_msf) { Loading Loading @@ -957,6 +960,7 @@ int ip_setsockopt(struct sock *sk, int level, #endif #endif return err; return err; } } EXPORT_SYMBOL(ip_setsockopt); #ifdef CONFIG_COMPAT #ifdef CONFIG_COMPAT int compat_ip_setsockopt(struct sock *sk, int level, int optname, int compat_ip_setsockopt(struct sock *sk, int level, int optname, Loading Loading @@ -986,13 +990,12 @@ int compat_ip_setsockopt(struct sock *sk, int level, int optname, #endif #endif return err; return err; } } EXPORT_SYMBOL(compat_ip_setsockopt); EXPORT_SYMBOL(compat_ip_setsockopt); #endif #endif /* /* * Get the options. Note for future reference. The GET of IP options gets the * Get the options. Note for future reference. The GET of IP options gets * _received_ ones. The set sets the _sent_ ones. * the _received_ ones. The set sets the _sent_ ones. */ */ static int do_ip_getsockopt(struct sock *sk, int level, int optname, static int do_ip_getsockopt(struct sock *sk, int level, int optname, Loading Loading @@ -1143,7 +1146,8 @@ static int do_ip_getsockopt(struct sock *sk, int level, int optname, return -EFAULT; return -EFAULT; } } err = ip_mc_gsfget(sk, &gsf, err = ip_mc_gsfget(sk, &gsf, (struct group_filter __user *)optval, optlen); (struct group_filter __user *)optval, optlen); release_sock(sk); release_sock(sk); return err; return err; } } Loading Loading @@ -1230,6 +1234,7 @@ int ip_getsockopt(struct sock *sk, int level, #endif #endif return err; return err; } } EXPORT_SYMBOL(ip_getsockopt); #ifdef CONFIG_COMPAT #ifdef CONFIG_COMPAT int compat_ip_getsockopt(struct sock *sk, int level, int optname, int compat_ip_getsockopt(struct sock *sk, int level, int optname, Loading Loading @@ -1262,11 +1267,5 @@ int compat_ip_getsockopt(struct sock *sk, int level, int optname, #endif #endif return err; return err; } } EXPORT_SYMBOL(compat_ip_getsockopt); EXPORT_SYMBOL(compat_ip_getsockopt); #endif #endif EXPORT_SYMBOL(ip_cmsg_recv); EXPORT_SYMBOL(ip_getsockopt); EXPORT_SYMBOL(ip_setsockopt);