diff options
Diffstat (limited to 'net/core')
| -rw-r--r-- | net/core/dev.c | 2 | ||||
| -rw-r--r-- | net/core/ethtool.c | 1 | ||||
| -rw-r--r-- | net/core/gen_stats.c | 15 | ||||
| -rw-r--r-- | net/core/pktgen.c | 3 | ||||
| -rw-r--r-- | net/core/rtnetlink.c | 15 | ||||
| -rw-r--r-- | net/core/skbuff.c | 5 |
6 files changed, 32 insertions, 9 deletions
diff --git a/net/core/dev.c b/net/core/dev.c index 8f9710c62e20..962ee9d71964 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
| @@ -946,7 +946,7 @@ bool dev_valid_name(const char *name) | |||
| 946 | return false; | 946 | return false; |
| 947 | 947 | ||
| 948 | while (*name) { | 948 | while (*name) { |
| 949 | if (*name == '/' || isspace(*name)) | 949 | if (*name == '/' || *name == ':' || isspace(*name)) |
| 950 | return false; | 950 | return false; |
| 951 | name++; | 951 | name++; |
| 952 | } | 952 | } |
diff --git a/net/core/ethtool.c b/net/core/ethtool.c index 91f74f3eb204..aa378ecef186 100644 --- a/net/core/ethtool.c +++ b/net/core/ethtool.c | |||
| @@ -98,6 +98,7 @@ static const char netdev_features_strings[NETDEV_FEATURE_COUNT][ETH_GSTRING_LEN] | |||
| 98 | [NETIF_F_RXALL_BIT] = "rx-all", | 98 | [NETIF_F_RXALL_BIT] = "rx-all", |
| 99 | [NETIF_F_HW_L2FW_DOFFLOAD_BIT] = "l2-fwd-offload", | 99 | [NETIF_F_HW_L2FW_DOFFLOAD_BIT] = "l2-fwd-offload", |
| 100 | [NETIF_F_BUSY_POLL_BIT] = "busy-poll", | 100 | [NETIF_F_BUSY_POLL_BIT] = "busy-poll", |
| 101 | [NETIF_F_HW_SWITCH_OFFLOAD_BIT] = "hw-switch-offload", | ||
| 101 | }; | 102 | }; |
| 102 | 103 | ||
| 103 | static const char | 104 | static const char |
diff --git a/net/core/gen_stats.c b/net/core/gen_stats.c index 0c08062d1796..1e2f46a69d50 100644 --- a/net/core/gen_stats.c +++ b/net/core/gen_stats.c | |||
| @@ -32,6 +32,9 @@ gnet_stats_copy(struct gnet_dump *d, int type, void *buf, int size) | |||
| 32 | return 0; | 32 | return 0; |
| 33 | 33 | ||
| 34 | nla_put_failure: | 34 | nla_put_failure: |
| 35 | kfree(d->xstats); | ||
| 36 | d->xstats = NULL; | ||
| 37 | d->xstats_len = 0; | ||
| 35 | spin_unlock_bh(d->lock); | 38 | spin_unlock_bh(d->lock); |
| 36 | return -1; | 39 | return -1; |
| 37 | } | 40 | } |
| @@ -305,7 +308,9 @@ int | |||
| 305 | gnet_stats_copy_app(struct gnet_dump *d, void *st, int len) | 308 | gnet_stats_copy_app(struct gnet_dump *d, void *st, int len) |
| 306 | { | 309 | { |
| 307 | if (d->compat_xstats) { | 310 | if (d->compat_xstats) { |
| 308 | d->xstats = st; | 311 | d->xstats = kmemdup(st, len, GFP_ATOMIC); |
| 312 | if (!d->xstats) | ||
| 313 | goto err_out; | ||
| 309 | d->xstats_len = len; | 314 | d->xstats_len = len; |
| 310 | } | 315 | } |
| 311 | 316 | ||
| @@ -313,6 +318,11 @@ gnet_stats_copy_app(struct gnet_dump *d, void *st, int len) | |||
| 313 | return gnet_stats_copy(d, TCA_STATS_APP, st, len); | 318 | return gnet_stats_copy(d, TCA_STATS_APP, st, len); |
| 314 | 319 | ||
| 315 | return 0; | 320 | return 0; |
| 321 | |||
| 322 | err_out: | ||
| 323 | d->xstats_len = 0; | ||
| 324 | spin_unlock_bh(d->lock); | ||
| 325 | return -1; | ||
| 316 | } | 326 | } |
| 317 | EXPORT_SYMBOL(gnet_stats_copy_app); | 327 | EXPORT_SYMBOL(gnet_stats_copy_app); |
| 318 | 328 | ||
| @@ -345,6 +355,9 @@ gnet_stats_finish_copy(struct gnet_dump *d) | |||
| 345 | return -1; | 355 | return -1; |
| 346 | } | 356 | } |
| 347 | 357 | ||
| 358 | kfree(d->xstats); | ||
| 359 | d->xstats = NULL; | ||
| 360 | d->xstats_len = 0; | ||
| 348 | spin_unlock_bh(d->lock); | 361 | spin_unlock_bh(d->lock); |
| 349 | return 0; | 362 | return 0; |
| 350 | } | 363 | } |
diff --git a/net/core/pktgen.c b/net/core/pktgen.c index b4899f5b7388..508155b283dd 100644 --- a/net/core/pktgen.c +++ b/net/core/pktgen.c | |||
| @@ -1134,6 +1134,9 @@ static ssize_t pktgen_if_write(struct file *file, | |||
| 1134 | return len; | 1134 | return len; |
| 1135 | 1135 | ||
| 1136 | i += len; | 1136 | i += len; |
| 1137 | if ((value > 1) && | ||
| 1138 | (!(pkt_dev->odev->priv_flags & IFF_TX_SKB_SHARING))) | ||
| 1139 | return -ENOTSUPP; | ||
| 1137 | pkt_dev->burst = value < 1 ? 1 : value; | 1140 | pkt_dev->burst = value < 1 ? 1 : value; |
| 1138 | sprintf(pg_result, "OK: burst=%d", pkt_dev->burst); | 1141 | sprintf(pg_result, "OK: burst=%d", pkt_dev->burst); |
| 1139 | return count; | 1142 | return count; |
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index ab293a3066b3..25b4b5d23485 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c | |||
| @@ -1300,7 +1300,6 @@ static int rtnl_dump_ifinfo(struct sk_buff *skb, struct netlink_callback *cb) | |||
| 1300 | s_h = cb->args[0]; | 1300 | s_h = cb->args[0]; |
| 1301 | s_idx = cb->args[1]; | 1301 | s_idx = cb->args[1]; |
| 1302 | 1302 | ||
| 1303 | rcu_read_lock(); | ||
| 1304 | cb->seq = net->dev_base_seq; | 1303 | cb->seq = net->dev_base_seq; |
| 1305 | 1304 | ||
| 1306 | /* A hack to preserve kernel<->userspace interface. | 1305 | /* A hack to preserve kernel<->userspace interface. |
| @@ -1322,7 +1321,7 @@ static int rtnl_dump_ifinfo(struct sk_buff *skb, struct netlink_callback *cb) | |||
| 1322 | for (h = s_h; h < NETDEV_HASHENTRIES; h++, s_idx = 0) { | 1321 | for (h = s_h; h < NETDEV_HASHENTRIES; h++, s_idx = 0) { |
| 1323 | idx = 0; | 1322 | idx = 0; |
| 1324 | head = &net->dev_index_head[h]; | 1323 | head = &net->dev_index_head[h]; |
| 1325 | hlist_for_each_entry_rcu(dev, head, index_hlist) { | 1324 | hlist_for_each_entry(dev, head, index_hlist) { |
| 1326 | if (idx < s_idx) | 1325 | if (idx < s_idx) |
| 1327 | goto cont; | 1326 | goto cont; |
| 1328 | err = rtnl_fill_ifinfo(skb, dev, RTM_NEWLINK, | 1327 | err = rtnl_fill_ifinfo(skb, dev, RTM_NEWLINK, |
| @@ -1344,7 +1343,6 @@ cont: | |||
| 1344 | } | 1343 | } |
| 1345 | } | 1344 | } |
| 1346 | out: | 1345 | out: |
| 1347 | rcu_read_unlock(); | ||
| 1348 | cb->args[1] = idx; | 1346 | cb->args[1] = idx; |
| 1349 | cb->args[0] = h; | 1347 | cb->args[0] = h; |
| 1350 | 1348 | ||
| @@ -2012,8 +2010,8 @@ replay: | |||
| 2012 | } | 2010 | } |
| 2013 | 2011 | ||
| 2014 | if (1) { | 2012 | if (1) { |
| 2015 | struct nlattr *attr[ops ? ops->maxtype + 1 : 0]; | 2013 | struct nlattr *attr[ops ? ops->maxtype + 1 : 1]; |
| 2016 | struct nlattr *slave_attr[m_ops ? m_ops->slave_maxtype + 1 : 0]; | 2014 | struct nlattr *slave_attr[m_ops ? m_ops->slave_maxtype + 1 : 1]; |
| 2017 | struct nlattr **data = NULL; | 2015 | struct nlattr **data = NULL; |
| 2018 | struct nlattr **slave_data = NULL; | 2016 | struct nlattr **slave_data = NULL; |
| 2019 | struct net *dest_net, *link_net = NULL; | 2017 | struct net *dest_net, *link_net = NULL; |
| @@ -2122,6 +2120,10 @@ replay: | |||
| 2122 | if (IS_ERR(dest_net)) | 2120 | if (IS_ERR(dest_net)) |
| 2123 | return PTR_ERR(dest_net); | 2121 | return PTR_ERR(dest_net); |
| 2124 | 2122 | ||
| 2123 | err = -EPERM; | ||
| 2124 | if (!netlink_ns_capable(skb, dest_net->user_ns, CAP_NET_ADMIN)) | ||
| 2125 | goto out; | ||
| 2126 | |||
| 2125 | if (tb[IFLA_LINK_NETNSID]) { | 2127 | if (tb[IFLA_LINK_NETNSID]) { |
| 2126 | int id = nla_get_s32(tb[IFLA_LINK_NETNSID]); | 2128 | int id = nla_get_s32(tb[IFLA_LINK_NETNSID]); |
| 2127 | 2129 | ||
| @@ -2130,6 +2132,9 @@ replay: | |||
| 2130 | err = -EINVAL; | 2132 | err = -EINVAL; |
| 2131 | goto out; | 2133 | goto out; |
| 2132 | } | 2134 | } |
| 2135 | err = -EPERM; | ||
| 2136 | if (!netlink_ns_capable(skb, link_net->user_ns, CAP_NET_ADMIN)) | ||
| 2137 | goto out; | ||
| 2133 | } | 2138 | } |
| 2134 | 2139 | ||
| 2135 | dev = rtnl_create_link(link_net ? : dest_net, ifname, | 2140 | dev = rtnl_create_link(link_net ? : dest_net, ifname, |
diff --git a/net/core/skbuff.c b/net/core/skbuff.c index 88c613eab142..f80507823531 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c | |||
| @@ -3621,13 +3621,14 @@ struct sk_buff *sock_dequeue_err_skb(struct sock *sk) | |||
| 3621 | { | 3621 | { |
| 3622 | struct sk_buff_head *q = &sk->sk_error_queue; | 3622 | struct sk_buff_head *q = &sk->sk_error_queue; |
| 3623 | struct sk_buff *skb, *skb_next; | 3623 | struct sk_buff *skb, *skb_next; |
| 3624 | unsigned long flags; | ||
| 3624 | int err = 0; | 3625 | int err = 0; |
| 3625 | 3626 | ||
| 3626 | spin_lock_bh(&q->lock); | 3627 | spin_lock_irqsave(&q->lock, flags); |
| 3627 | skb = __skb_dequeue(q); | 3628 | skb = __skb_dequeue(q); |
| 3628 | if (skb && (skb_next = skb_peek(q))) | 3629 | if (skb && (skb_next = skb_peek(q))) |
| 3629 | err = SKB_EXT_ERR(skb_next)->ee.ee_errno; | 3630 | err = SKB_EXT_ERR(skb_next)->ee.ee_errno; |
| 3630 | spin_unlock_bh(&q->lock); | 3631 | spin_unlock_irqrestore(&q->lock, flags); |
| 3631 | 3632 | ||
| 3632 | sk->sk_err = err; | 3633 | sk->sk_err = err; |
| 3633 | if (err) | 3634 | if (err) |
