Merge tag 'v3.10.95' into update
This is the 3.10.95 stable release
This commit is contained in:
@@ -806,6 +806,9 @@ static int ax25_create(struct net *net, struct socket *sock, int protocol,
|
||||
struct sock *sk;
|
||||
ax25_cb *ax25;
|
||||
|
||||
if (protocol < 0 || protocol > SK_PROTOCOL_MAX)
|
||||
return -EINVAL;
|
||||
|
||||
if (!net_eq(net, &init_net))
|
||||
return -EAFNOSUPPORT;
|
||||
|
||||
|
||||
@@ -306,6 +306,8 @@ void scm_detach_fds(struct msghdr *msg, struct scm_cookie *scm)
|
||||
err = put_user(cmlen, &cm->cmsg_len);
|
||||
if (!err) {
|
||||
cmlen = CMSG_SPACE(i*sizeof(int));
|
||||
if (msg->msg_controllen < cmlen)
|
||||
cmlen = msg->msg_controllen;
|
||||
msg->msg_control += cmlen;
|
||||
msg->msg_controllen -= cmlen;
|
||||
}
|
||||
|
||||
@@ -423,8 +423,6 @@ static void sock_warn_obsolete_bsdism(const char *name)
|
||||
}
|
||||
}
|
||||
|
||||
#define SK_FLAGS_TIMESTAMP ((1UL << SOCK_TIMESTAMP) | (1UL << SOCK_TIMESTAMPING_RX_SOFTWARE))
|
||||
|
||||
static void sock_disable_timestamp(struct sock *sk, unsigned long flags)
|
||||
{
|
||||
if (sk->sk_flags & flags) {
|
||||
|
||||
@@ -677,6 +677,9 @@ static int dn_create(struct net *net, struct socket *sock, int protocol,
|
||||
{
|
||||
struct sock *sk;
|
||||
|
||||
if (protocol < 0 || protocol > SK_PROTOCOL_MAX)
|
||||
return -EINVAL;
|
||||
|
||||
if (!net_eq(net, &init_net))
|
||||
return -EAFNOSUPPORT;
|
||||
|
||||
|
||||
@@ -304,6 +304,9 @@ static int inet_create(struct net *net, struct socket *sock, int protocol,
|
||||
if (sock->type != SOCK_RAW && sock->type != SOCK_DGRAM)
|
||||
build_ehash_secret();
|
||||
|
||||
if (protocol < 0 || protocol >= IPPROTO_MAX)
|
||||
return -EINVAL;
|
||||
|
||||
sock->state = SS_UNCONNECTED;
|
||||
|
||||
/* Look for the requested type/protocol pair. */
|
||||
|
||||
+8
-7
@@ -136,7 +136,7 @@ static int __ipmr_fill_mroute(struct mr_table *mrt, struct sk_buff *skb,
|
||||
struct mfc_cache *c, struct rtmsg *rtm);
|
||||
static void mroute_netlink_event(struct mr_table *mrt, struct mfc_cache *mfc,
|
||||
int cmd);
|
||||
static void mroute_clean_tables(struct mr_table *mrt);
|
||||
static void mroute_clean_tables(struct mr_table *mrt, bool all);
|
||||
static void ipmr_expire_process(unsigned long arg);
|
||||
|
||||
#ifdef CONFIG_IP_MROUTE_MULTIPLE_TABLES
|
||||
@@ -348,7 +348,7 @@ static struct mr_table *ipmr_new_table(struct net *net, u32 id)
|
||||
static void ipmr_free_table(struct mr_table *mrt)
|
||||
{
|
||||
del_timer_sync(&mrt->ipmr_expire_timer);
|
||||
mroute_clean_tables(mrt);
|
||||
mroute_clean_tables(mrt, true);
|
||||
kfree(mrt);
|
||||
}
|
||||
|
||||
@@ -1199,7 +1199,7 @@ static int ipmr_mfc_add(struct net *net, struct mr_table *mrt,
|
||||
* Close the multicast socket, and clear the vif tables etc
|
||||
*/
|
||||
|
||||
static void mroute_clean_tables(struct mr_table *mrt)
|
||||
static void mroute_clean_tables(struct mr_table *mrt, bool all)
|
||||
{
|
||||
int i;
|
||||
LIST_HEAD(list);
|
||||
@@ -1208,8 +1208,9 @@ static void mroute_clean_tables(struct mr_table *mrt)
|
||||
/* Shut down all active vif entries */
|
||||
|
||||
for (i = 0; i < mrt->maxvif; i++) {
|
||||
if (!(mrt->vif_table[i].flags & VIFF_STATIC))
|
||||
vif_delete(mrt, i, 0, &list);
|
||||
if (!all && (mrt->vif_table[i].flags & VIFF_STATIC))
|
||||
continue;
|
||||
vif_delete(mrt, i, 0, &list);
|
||||
}
|
||||
unregister_netdevice_many(&list);
|
||||
|
||||
@@ -1217,7 +1218,7 @@ static void mroute_clean_tables(struct mr_table *mrt)
|
||||
|
||||
for (i = 0; i < MFC_LINES; i++) {
|
||||
list_for_each_entry_safe(c, next, &mrt->mfc_cache_array[i], list) {
|
||||
if (c->mfc_flags & MFC_STATIC)
|
||||
if (!all && (c->mfc_flags & MFC_STATIC))
|
||||
continue;
|
||||
list_del_rcu(&c->list);
|
||||
mroute_netlink_event(mrt, c, RTM_DELROUTE);
|
||||
@@ -1252,7 +1253,7 @@ static void mrtsock_destruct(struct sock *sk)
|
||||
NETCONFA_IFINDEX_ALL,
|
||||
net->ipv4.devconf_all);
|
||||
RCU_INIT_POINTER(mrt->mroute_sk, NULL);
|
||||
mroute_clean_tables(mrt);
|
||||
mroute_clean_tables(mrt, false);
|
||||
}
|
||||
}
|
||||
rtnl_unlock();
|
||||
|
||||
@@ -5618,6 +5618,7 @@ discard:
|
||||
}
|
||||
|
||||
tp->rcv_nxt = TCP_SKB_CB(skb)->seq + 1;
|
||||
tp->copied_seq = tp->rcv_nxt;
|
||||
tp->rcv_wup = TCP_SKB_CB(skb)->seq + 1;
|
||||
|
||||
/* RFC1323: The window in SYN & SYN/ACK segments is
|
||||
|
||||
+2
-1
@@ -1015,7 +1015,8 @@ int tcp_md5_do_add(struct sock *sk, const union tcp_md5_addr *addr,
|
||||
}
|
||||
|
||||
md5sig = rcu_dereference_protected(tp->md5sig_info,
|
||||
sock_owned_by_user(sk));
|
||||
sock_owned_by_user(sk) ||
|
||||
lockdep_is_held(&sk->sk_lock.slock));
|
||||
if (!md5sig) {
|
||||
md5sig = kmalloc(sizeof(*md5sig), gfp);
|
||||
if (!md5sig)
|
||||
|
||||
@@ -131,6 +131,9 @@ static int inet6_create(struct net *net, struct socket *sock, int protocol,
|
||||
!inet_ehash_secret)
|
||||
build_ehash_secret();
|
||||
|
||||
if (protocol < 0 || protocol >= IPPROTO_MAX)
|
||||
return -EINVAL;
|
||||
|
||||
/* Look for the requested type/protocol pair. */
|
||||
lookup_protocol:
|
||||
err = -ESOCKTNOSUPPORT;
|
||||
|
||||
+3
-5
@@ -1541,13 +1541,11 @@ static int ip6gre_changelink(struct net_device *dev, struct nlattr *tb[],
|
||||
return -EEXIST;
|
||||
} else {
|
||||
t = nt;
|
||||
|
||||
ip6gre_tunnel_unlink(ign, t);
|
||||
ip6gre_tnl_change(t, &p, !tb[IFLA_MTU]);
|
||||
ip6gre_tunnel_link(ign, t);
|
||||
netdev_state_change(dev);
|
||||
}
|
||||
|
||||
ip6gre_tunnel_unlink(ign, t);
|
||||
ip6gre_tnl_change(t, &p, !tb[IFLA_MTU]);
|
||||
ip6gre_tunnel_link(ign, t);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
+8
-7
@@ -120,7 +120,7 @@ static void mr6_netlink_event(struct mr6_table *mrt, struct mfc6_cache *mfc,
|
||||
int cmd);
|
||||
static int ip6mr_rtm_dumproute(struct sk_buff *skb,
|
||||
struct netlink_callback *cb);
|
||||
static void mroute_clean_tables(struct mr6_table *mrt);
|
||||
static void mroute_clean_tables(struct mr6_table *mrt, bool all);
|
||||
static void ipmr_expire_process(unsigned long arg);
|
||||
|
||||
#ifdef CONFIG_IPV6_MROUTE_MULTIPLE_TABLES
|
||||
@@ -337,7 +337,7 @@ static struct mr6_table *ip6mr_new_table(struct net *net, u32 id)
|
||||
static void ip6mr_free_table(struct mr6_table *mrt)
|
||||
{
|
||||
del_timer(&mrt->ipmr_expire_timer);
|
||||
mroute_clean_tables(mrt);
|
||||
mroute_clean_tables(mrt, true);
|
||||
kfree(mrt);
|
||||
}
|
||||
|
||||
@@ -1537,7 +1537,7 @@ static int ip6mr_mfc_add(struct net *net, struct mr6_table *mrt,
|
||||
* Close the multicast socket, and clear the vif tables etc
|
||||
*/
|
||||
|
||||
static void mroute_clean_tables(struct mr6_table *mrt)
|
||||
static void mroute_clean_tables(struct mr6_table *mrt, bool all)
|
||||
{
|
||||
int i;
|
||||
LIST_HEAD(list);
|
||||
@@ -1547,8 +1547,9 @@ static void mroute_clean_tables(struct mr6_table *mrt)
|
||||
* Shut down all active vif entries
|
||||
*/
|
||||
for (i = 0; i < mrt->maxvif; i++) {
|
||||
if (!(mrt->vif6_table[i].flags & VIFF_STATIC))
|
||||
mif6_delete(mrt, i, &list);
|
||||
if (!all && (mrt->vif6_table[i].flags & VIFF_STATIC))
|
||||
continue;
|
||||
mif6_delete(mrt, i, &list);
|
||||
}
|
||||
unregister_netdevice_many(&list);
|
||||
|
||||
@@ -1557,7 +1558,7 @@ static void mroute_clean_tables(struct mr6_table *mrt)
|
||||
*/
|
||||
for (i = 0; i < MFC6_LINES; i++) {
|
||||
list_for_each_entry_safe(c, next, &mrt->mfc6_cache_array[i], list) {
|
||||
if (c->mfc_flags & MFC_STATIC)
|
||||
if (!all && (c->mfc_flags & MFC_STATIC))
|
||||
continue;
|
||||
write_lock_bh(&mrt_lock);
|
||||
list_del(&c->list);
|
||||
@@ -1620,7 +1621,7 @@ int ip6mr_sk_done(struct sock *sk)
|
||||
net->ipv6.devconf_all);
|
||||
write_unlock_bh(&mrt_lock);
|
||||
|
||||
mroute_clean_tables(mrt);
|
||||
mroute_clean_tables(mrt, false);
|
||||
err = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -1441,7 +1441,6 @@ out:
|
||||
if (!err) {
|
||||
ICMP6MSGOUT_INC_STATS(net, idev, ICMPV6_MLD2_REPORT);
|
||||
ICMP6_INC_STATS(net, idev, ICMP6_MIB_OUTMSGS);
|
||||
IP6_UPD_PO_STATS(net, idev, IPSTATS_MIB_OUTMCAST, payload_len);
|
||||
} else {
|
||||
IP6_INC_STATS(net, idev, IPSTATS_MIB_OUTDISCARDS);
|
||||
}
|
||||
@@ -1805,7 +1804,6 @@ out:
|
||||
if (!err) {
|
||||
ICMP6MSGOUT_INC_STATS(net, idev, type);
|
||||
ICMP6_INC_STATS(net, idev, ICMP6_MIB_OUTMSGS);
|
||||
IP6_UPD_PO_STATS(net, idev, IPSTATS_MIB_OUTMCAST, full_len);
|
||||
} else
|
||||
IP6_INC_STATS(net, idev, IPSTATS_MIB_OUTDISCARDS);
|
||||
|
||||
|
||||
@@ -172,7 +172,7 @@ static void nf_ct_frag6_expire(unsigned long data)
|
||||
/* Creation primitives. */
|
||||
static inline struct frag_queue *fq_find(struct net *net, __be32 id,
|
||||
u32 user, struct in6_addr *src,
|
||||
struct in6_addr *dst, u8 ecn)
|
||||
struct in6_addr *dst, int iif, u8 ecn)
|
||||
{
|
||||
struct inet_frag_queue *q;
|
||||
struct ip6_create_arg arg;
|
||||
@@ -182,6 +182,7 @@ static inline struct frag_queue *fq_find(struct net *net, __be32 id,
|
||||
arg.user = user;
|
||||
arg.src = src;
|
||||
arg.dst = dst;
|
||||
arg.iif = iif;
|
||||
arg.ecn = ecn;
|
||||
|
||||
read_lock_bh(&nf_frags.lock);
|
||||
@@ -590,7 +591,7 @@ struct sk_buff *nf_ct_frag6_gather(struct sk_buff *skb, u32 user)
|
||||
local_bh_enable();
|
||||
|
||||
fq = fq_find(net, fhdr->identification, user, &hdr->saddr, &hdr->daddr,
|
||||
ip6_frag_ecn(hdr));
|
||||
skb->dev ? skb->dev->ifindex : 0, ip6_frag_ecn(hdr));
|
||||
if (fq == NULL) {
|
||||
pr_debug("Can't find and can't create new queue\n");
|
||||
goto ret_orig;
|
||||
|
||||
@@ -111,7 +111,10 @@ bool ip6_frag_match(struct inet_frag_queue *q, void *a)
|
||||
return fq->id == arg->id &&
|
||||
fq->user == arg->user &&
|
||||
ipv6_addr_equal(&fq->saddr, arg->src) &&
|
||||
ipv6_addr_equal(&fq->daddr, arg->dst);
|
||||
ipv6_addr_equal(&fq->daddr, arg->dst) &&
|
||||
(arg->iif == fq->iif ||
|
||||
!(ipv6_addr_type(arg->dst) & (IPV6_ADDR_MULTICAST |
|
||||
IPV6_ADDR_LINKLOCAL)));
|
||||
}
|
||||
EXPORT_SYMBOL(ip6_frag_match);
|
||||
|
||||
@@ -180,7 +183,7 @@ static void ip6_frag_expire(unsigned long data)
|
||||
|
||||
static __inline__ struct frag_queue *
|
||||
fq_find(struct net *net, __be32 id, const struct in6_addr *src,
|
||||
const struct in6_addr *dst, u8 ecn)
|
||||
const struct in6_addr *dst, int iif, u8 ecn)
|
||||
{
|
||||
struct inet_frag_queue *q;
|
||||
struct ip6_create_arg arg;
|
||||
@@ -190,6 +193,7 @@ fq_find(struct net *net, __be32 id, const struct in6_addr *src,
|
||||
arg.user = IP6_DEFRAG_LOCAL_DELIVER;
|
||||
arg.src = src;
|
||||
arg.dst = dst;
|
||||
arg.iif = iif;
|
||||
arg.ecn = ecn;
|
||||
|
||||
read_lock(&ip6_frags.lock);
|
||||
@@ -558,7 +562,7 @@ static int ipv6_frag_rcv(struct sk_buff *skb)
|
||||
IPSTATS_MIB_REASMFAILS, evicted);
|
||||
|
||||
fq = fq_find(net, fhdr->identification, &hdr->saddr, &hdr->daddr,
|
||||
ip6_frag_ecn(hdr));
|
||||
skb->dev ? skb->dev->ifindex : 0, ip6_frag_ecn(hdr));
|
||||
if (fq != NULL) {
|
||||
int ret;
|
||||
|
||||
|
||||
@@ -1105,6 +1105,9 @@ static int irda_create(struct net *net, struct socket *sock, int protocol,
|
||||
|
||||
IRDA_DEBUG(2, "%s()\n", __func__);
|
||||
|
||||
if (protocol < 0 || protocol > SK_PROTOCOL_MAX)
|
||||
return -EINVAL;
|
||||
|
||||
if (net != &init_net)
|
||||
return -EAFNOSUPPORT;
|
||||
|
||||
|
||||
+2
-2
@@ -812,8 +812,8 @@ int sctp_auth_ep_set_hmacs(struct sctp_endpoint *ep,
|
||||
if (!has_sha1)
|
||||
return -EINVAL;
|
||||
|
||||
memcpy(ep->auth_hmacs_list->hmac_ids, &hmacs->shmac_idents[0],
|
||||
hmacs->shmac_num_idents * sizeof(__u16));
|
||||
for (i = 0; i < hmacs->shmac_num_idents; i++)
|
||||
ep->auth_hmacs_list->hmac_ids[i] = htons(hmacs->shmac_idents[i]);
|
||||
ep->auth_hmacs_list->param_hdr.length = htons(sizeof(sctp_paramhdr_t) +
|
||||
hmacs->shmac_num_idents * sizeof(__u16));
|
||||
return 0;
|
||||
|
||||
@@ -639,6 +639,7 @@ static struct sock *sctp_v6_create_accept_sk(struct sock *sk,
|
||||
struct sock *newsk;
|
||||
struct ipv6_pinfo *newnp, *np = inet6_sk(sk);
|
||||
struct sctp6_sock *newsctp6sk;
|
||||
struct ipv6_txoptions *opt;
|
||||
|
||||
newsk = sk_alloc(sock_net(sk), PF_INET6, GFP_KERNEL, sk->sk_prot);
|
||||
if (!newsk)
|
||||
@@ -658,6 +659,13 @@ static struct sock *sctp_v6_create_accept_sk(struct sock *sk,
|
||||
|
||||
memcpy(newnp, np, sizeof(struct ipv6_pinfo));
|
||||
|
||||
rcu_read_lock();
|
||||
opt = rcu_dereference(np->opt);
|
||||
if (opt)
|
||||
opt = ipv6_dup_options(newsk, opt);
|
||||
RCU_INIT_POINTER(newnp->opt, opt);
|
||||
rcu_read_unlock();
|
||||
|
||||
/* Initialize sk's sport, dport, rcv_saddr and daddr for getsockname()
|
||||
* and getpeername().
|
||||
*/
|
||||
|
||||
+11
-1
@@ -6969,6 +6969,9 @@ void sctp_copy_sock(struct sock *newsk, struct sock *sk,
|
||||
newinet->mc_ttl = 1;
|
||||
newinet->mc_index = 0;
|
||||
newinet->mc_list = NULL;
|
||||
|
||||
if (newsk->sk_flags & SK_FLAGS_TIMESTAMP)
|
||||
net_enable_timestamp();
|
||||
}
|
||||
|
||||
static inline void sctp_copy_descendant(struct sock *sk_to,
|
||||
@@ -7149,6 +7152,13 @@ struct proto sctp_prot = {
|
||||
|
||||
#if IS_ENABLED(CONFIG_IPV6)
|
||||
|
||||
#include <net/transp_v6.h>
|
||||
static void sctp_v6_destroy_sock(struct sock *sk)
|
||||
{
|
||||
sctp_destroy_sock(sk);
|
||||
inet6_destroy_sock(sk);
|
||||
}
|
||||
|
||||
struct proto sctpv6_prot = {
|
||||
.name = "SCTPv6",
|
||||
.owner = THIS_MODULE,
|
||||
@@ -7158,7 +7168,7 @@ struct proto sctpv6_prot = {
|
||||
.accept = sctp_accept,
|
||||
.ioctl = sctp_ioctl,
|
||||
.init = sctp_init_sock,
|
||||
.destroy = sctp_destroy_sock,
|
||||
.destroy = sctp_v6_destroy_sock,
|
||||
.shutdown = sctp_shutdown,
|
||||
.setsockopt = sctp_setsockopt,
|
||||
.getsockopt = sctp_getsockopt,
|
||||
|
||||
+17
-10
@@ -1622,7 +1622,11 @@ static int unix_dgram_sendmsg(struct kiocb *kiocb, struct socket *sock,
|
||||
int max_level;
|
||||
int data_len = 0;
|
||||
int sk_locked;
|
||||
<<<<<<< HEAD
|
||||
|
||||
=======
|
||||
|
||||
>>>>>>> v3.10.95
|
||||
if (NULL == siocb->scm)
|
||||
siocb->scm = &tmp_scm;
|
||||
wait_for_unix_gc();
|
||||
@@ -1714,7 +1718,13 @@ restart_locked:
|
||||
sock_put(other);
|
||||
|
||||
if (!sk_locked)
|
||||
<<<<<<< HEAD
|
||||
unix_state_lock(sk);
|
||||
=======
|
||||
unix_state_lock(sk);
|
||||
|
||||
err = 0;
|
||||
>>>>>>> v3.10.95
|
||||
if (unix_peer(sk) == other) {
|
||||
unix_peer(sk) = NULL;
|
||||
unix_dgram_peer_wake_disconnect_wakeup(sk, other);
|
||||
@@ -1744,12 +1754,16 @@ restart_locked:
|
||||
goto out_unlock;
|
||||
}
|
||||
|
||||
<<<<<<< HEAD
|
||||
/* other == sk && unix_peer(other) != sk if
|
||||
* - unix_peer(sk) == NULL, destination address bound to sk
|
||||
* - unix_peer(sk) == sk by time of get but disconnected before lock
|
||||
*/
|
||||
if (other != sk &&
|
||||
unlikely(unix_peer(other) != sk && unix_recvq_full(other))) {
|
||||
=======
|
||||
if (unlikely(unix_peer(other) != sk && unix_recvq_full(other))) {
|
||||
>>>>>>> v3.10.95
|
||||
if (timeo) {
|
||||
timeo = unix_wait_for_peer(other, timeo);
|
||||
|
||||
@@ -2016,14 +2030,7 @@ static int unix_dgram_recvmsg(struct kiocb *iocb, struct socket *sock,
|
||||
if (flags&MSG_OOB)
|
||||
goto out;
|
||||
|
||||
err = mutex_lock_interruptible(&u->readlock);
|
||||
if (unlikely(err)) {
|
||||
/* recvmsg() in non blocking mode is supposed to return -EAGAIN
|
||||
* sk_rcvtimeo is not honored by mutex_lock_interruptible()
|
||||
*/
|
||||
err = noblock ? -EAGAIN : -ERESTARTSYS;
|
||||
goto out;
|
||||
}
|
||||
mutex_lock(&u->readlock);
|
||||
|
||||
skip = sk_peek_offset(sk, flags);
|
||||
|
||||
@@ -2258,12 +2265,12 @@ again:
|
||||
|
||||
}
|
||||
|
||||
if (signal_pending(current)
|
||||
|| mutex_lock_interruptible(&u->readlock)) {
|
||||
if (signal_pending(current)) {
|
||||
err = sock_intr_errno(timeo);
|
||||
goto out;
|
||||
}
|
||||
|
||||
mutex_lock(&u->readlock);
|
||||
continue;
|
||||
unlock:
|
||||
unix_state_unlock(sk);
|
||||
|
||||
Reference in New Issue
Block a user