Merge tag 'v3.10.72' into update
This is the 3.10.72 stable release
This commit is contained in:
@@ -738,24 +738,18 @@ static unsigned char nas[21] = {
|
||||
|
||||
asmlinkage long compat_sys_sendmsg(int fd, struct compat_msghdr __user *msg, unsigned int flags)
|
||||
{
|
||||
if (flags & MSG_CMSG_COMPAT)
|
||||
return -EINVAL;
|
||||
return __sys_sendmsg(fd, (struct msghdr __user *)msg, flags | MSG_CMSG_COMPAT);
|
||||
}
|
||||
|
||||
asmlinkage long compat_sys_sendmmsg(int fd, struct compat_mmsghdr __user *mmsg,
|
||||
unsigned int vlen, unsigned int flags)
|
||||
{
|
||||
if (flags & MSG_CMSG_COMPAT)
|
||||
return -EINVAL;
|
||||
return __sys_sendmmsg(fd, (struct mmsghdr __user *)mmsg, vlen,
|
||||
flags | MSG_CMSG_COMPAT);
|
||||
}
|
||||
|
||||
asmlinkage long compat_sys_recvmsg(int fd, struct compat_msghdr __user *msg, unsigned int flags)
|
||||
{
|
||||
if (flags & MSG_CMSG_COMPAT)
|
||||
return -EINVAL;
|
||||
return __sys_recvmsg(fd, (struct msghdr __user *)msg, flags | MSG_CMSG_COMPAT);
|
||||
}
|
||||
|
||||
@@ -778,9 +772,6 @@ asmlinkage long compat_sys_recvmmsg(int fd, struct compat_mmsghdr __user *mmsg,
|
||||
int datagrams;
|
||||
struct timespec ktspec;
|
||||
|
||||
if (flags & MSG_CMSG_COMPAT)
|
||||
return -EINVAL;
|
||||
|
||||
if (timeout == NULL)
|
||||
return __sys_recvmmsg(fd, (struct mmsghdr __user *)mmsg, vlen,
|
||||
flags | MSG_CMSG_COMPAT, NULL);
|
||||
|
||||
+1
-1
@@ -931,7 +931,7 @@ bool dev_valid_name(const char *name)
|
||||
return false;
|
||||
|
||||
while (*name) {
|
||||
if (*name == '/' || isspace(*name))
|
||||
if (*name == '/' || *name == ':' || isspace(*name))
|
||||
return false;
|
||||
name++;
|
||||
}
|
||||
|
||||
+14
-1
@@ -32,6 +32,9 @@ gnet_stats_copy(struct gnet_dump *d, int type, void *buf, int size)
|
||||
return 0;
|
||||
|
||||
nla_put_failure:
|
||||
kfree(d->xstats);
|
||||
d->xstats = NULL;
|
||||
d->xstats_len = 0;
|
||||
spin_unlock_bh(d->lock);
|
||||
return -1;
|
||||
}
|
||||
@@ -205,7 +208,9 @@ int
|
||||
gnet_stats_copy_app(struct gnet_dump *d, void *st, int len)
|
||||
{
|
||||
if (d->compat_xstats) {
|
||||
d->xstats = st;
|
||||
d->xstats = kmemdup(st, len, GFP_ATOMIC);
|
||||
if (!d->xstats)
|
||||
goto err_out;
|
||||
d->xstats_len = len;
|
||||
}
|
||||
|
||||
@@ -213,6 +218,11 @@ gnet_stats_copy_app(struct gnet_dump *d, void *st, int len)
|
||||
return gnet_stats_copy(d, TCA_STATS_APP, st, len);
|
||||
|
||||
return 0;
|
||||
|
||||
err_out:
|
||||
d->xstats_len = 0;
|
||||
spin_unlock_bh(d->lock);
|
||||
return -1;
|
||||
}
|
||||
EXPORT_SYMBOL(gnet_stats_copy_app);
|
||||
|
||||
@@ -245,6 +255,9 @@ gnet_stats_finish_copy(struct gnet_dump *d)
|
||||
return -1;
|
||||
}
|
||||
|
||||
kfree(d->xstats);
|
||||
d->xstats = NULL;
|
||||
d->xstats_len = 0;
|
||||
spin_unlock_bh(d->lock);
|
||||
return 0;
|
||||
}
|
||||
|
||||
+14
-10
@@ -1149,14 +1149,10 @@ static const struct nla_policy ifla_vfinfo_policy[IFLA_VF_INFO_MAX+1] = {
|
||||
};
|
||||
|
||||
static const struct nla_policy ifla_vf_policy[IFLA_VF_MAX+1] = {
|
||||
[IFLA_VF_MAC] = { .type = NLA_BINARY,
|
||||
.len = sizeof(struct ifla_vf_mac) },
|
||||
[IFLA_VF_VLAN] = { .type = NLA_BINARY,
|
||||
.len = sizeof(struct ifla_vf_vlan) },
|
||||
[IFLA_VF_TX_RATE] = { .type = NLA_BINARY,
|
||||
.len = sizeof(struct ifla_vf_tx_rate) },
|
||||
[IFLA_VF_SPOOFCHK] = { .type = NLA_BINARY,
|
||||
.len = sizeof(struct ifla_vf_spoofchk) },
|
||||
[IFLA_VF_MAC] = { .len = sizeof(struct ifla_vf_mac) },
|
||||
[IFLA_VF_VLAN] = { .len = sizeof(struct ifla_vf_vlan) },
|
||||
[IFLA_VF_TX_RATE] = { .len = sizeof(struct ifla_vf_tx_rate) },
|
||||
[IFLA_VF_SPOOFCHK] = { .len = sizeof(struct ifla_vf_spoofchk) },
|
||||
};
|
||||
|
||||
static const struct nla_policy ifla_port_policy[IFLA_PORT_MAX+1] = {
|
||||
@@ -1866,8 +1862,16 @@ replay:
|
||||
goto out;
|
||||
|
||||
err = rtnl_configure_link(dev, ifm);
|
||||
if (err < 0)
|
||||
unregister_netdevice(dev);
|
||||
if (err < 0) {
|
||||
if (ops->newlink) {
|
||||
LIST_HEAD(list_kill);
|
||||
|
||||
ops->dellink(dev, &list_kill);
|
||||
unregister_netdevice_many(&list_kill);
|
||||
} else {
|
||||
unregister_netdevice(dev);
|
||||
}
|
||||
}
|
||||
out:
|
||||
put_net(dest_net);
|
||||
return err;
|
||||
|
||||
@@ -678,27 +678,30 @@ EXPORT_SYMBOL(ip_defrag);
|
||||
struct sk_buff *ip_check_defrag(struct sk_buff *skb, u32 user)
|
||||
{
|
||||
struct iphdr iph;
|
||||
int netoff;
|
||||
u32 len;
|
||||
|
||||
if (skb->protocol != htons(ETH_P_IP))
|
||||
return skb;
|
||||
|
||||
if (!skb_copy_bits(skb, 0, &iph, sizeof(iph)))
|
||||
netoff = skb_network_offset(skb);
|
||||
|
||||
if (skb_copy_bits(skb, netoff, &iph, sizeof(iph)) < 0)
|
||||
return skb;
|
||||
|
||||
if (iph.ihl < 5 || iph.version != 4)
|
||||
return skb;
|
||||
|
||||
len = ntohs(iph.tot_len);
|
||||
if (skb->len < len || len < (iph.ihl * 4))
|
||||
if (skb->len < netoff + len || len < (iph.ihl * 4))
|
||||
return skb;
|
||||
|
||||
if (ip_is_fragment(&iph)) {
|
||||
skb = skb_share_check(skb, GFP_ATOMIC);
|
||||
if (skb) {
|
||||
if (!pskb_may_pull(skb, iph.ihl*4))
|
||||
if (!pskb_may_pull(skb, netoff + iph.ihl * 4))
|
||||
return skb;
|
||||
if (pskb_trim_rcsum(skb, len))
|
||||
if (pskb_trim_rcsum(skb, netoff + len))
|
||||
return skb;
|
||||
memset(IPCB(skb), 0, sizeof(struct inet_skb_parm));
|
||||
if (ip_defrag(skb, user))
|
||||
|
||||
@@ -845,7 +845,8 @@ static int __ip_append_data(struct sock *sk,
|
||||
cork->length += length;
|
||||
if (((length > mtu) || (skb && skb_has_frags(skb))) &&
|
||||
(sk->sk_protocol == IPPROTO_UDP) &&
|
||||
(rt->dst.dev->features & NETIF_F_UFO) && !rt->dst.header_len) {
|
||||
(rt->dst.dev->features & NETIF_F_UFO) && !rt->dst.header_len &&
|
||||
(sk->sk_type == SOCK_DGRAM)) {
|
||||
err = ip_ufo_append_data(sk, queue, getfrag, from, length,
|
||||
hh_len, fragheaderlen, transhdrlen,
|
||||
maxfraglen, flags);
|
||||
|
||||
@@ -1286,7 +1286,8 @@ int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to,
|
||||
if (((length > mtu) ||
|
||||
(skb && skb_has_frags(skb))) &&
|
||||
(sk->sk_protocol == IPPROTO_UDP) &&
|
||||
(rt->dst.dev->features & NETIF_F_UFO)) {
|
||||
(rt->dst.dev->features & NETIF_F_UFO) &&
|
||||
(sk->sk_type == SOCK_DGRAM)) {
|
||||
err = ip6_ufo_append_data(sk, getfrag, from, length,
|
||||
hh_len, fragheaderlen,
|
||||
transhdrlen, mtu, flags, rt);
|
||||
|
||||
+1
-1
@@ -108,7 +108,7 @@ static u32 *ipv6_cow_metrics(struct dst_entry *dst, unsigned long old)
|
||||
u32 *p = NULL;
|
||||
|
||||
if (!(rt->dst.flags & DST_HOST))
|
||||
return NULL;
|
||||
return dst_cow_metrics_generic(dst, old);
|
||||
|
||||
peer = rt6_get_peer_create(rt);
|
||||
if (peer) {
|
||||
|
||||
@@ -820,7 +820,9 @@ static void ircomm_tty_wait_until_sent(struct tty_struct *tty, int timeout)
|
||||
orig_jiffies = jiffies;
|
||||
|
||||
/* Set poll time to 200 ms */
|
||||
poll_time = IRDA_MIN(timeout, msecs_to_jiffies(200));
|
||||
poll_time = msecs_to_jiffies(200);
|
||||
if (timeout)
|
||||
poll_time = min_t(unsigned long, timeout, poll_time);
|
||||
|
||||
spin_lock_irqsave(&self->spinlock, flags);
|
||||
while (self->tx_skb && self->tx_skb->len) {
|
||||
|
||||
@@ -227,6 +227,7 @@ static int tcf_em_validate(struct tcf_proto *tp,
|
||||
* to replay the request.
|
||||
*/
|
||||
module_put(em->ops->owner);
|
||||
em->ops = NULL;
|
||||
err = -EAGAIN;
|
||||
}
|
||||
#endif
|
||||
|
||||
+1
-1
@@ -930,7 +930,7 @@ static unsigned int cache_poll(struct file *filp, poll_table *wait,
|
||||
poll_wait(filp, &queue_wait, wait);
|
||||
|
||||
/* alway allow write */
|
||||
mask = POLL_OUT | POLLWRNORM;
|
||||
mask = POLLOUT | POLLWRNORM;
|
||||
|
||||
if (!rp)
|
||||
return mask;
|
||||
|
||||
Reference in New Issue
Block a user