diff options
Diffstat (limited to 'net')
-rw-r--r-- | net/bluetooth/hidp/core.c | 49 | ||||
-rw-r--r-- | net/bluetooth/rfcomm/tty.c | 3 | ||||
-rw-r--r-- | net/core/rtnetlink.c | 44 | ||||
-rw-r--r-- | net/ipv4/cipso_ipv4.c | 4 | ||||
-rw-r--r-- | net/ipv4/fib_trie.c | 3 | ||||
-rw-r--r-- | net/ipv4/icmp.c | 3 | ||||
-rw-r--r-- | net/ipv4/inet_hashtables.c | 6 | ||||
-rw-r--r-- | net/ipv4/xfrm4_mode_beet.c | 2 | ||||
-rw-r--r-- | net/ipv6/icmp.c | 3 | ||||
-rw-r--r-- | net/ipv6/inet6_hashtables.c | 2 | ||||
-rw-r--r-- | net/netlabel/netlabel_cipso_v4.c | 2 | ||||
-rw-r--r-- | net/netlabel/netlabel_cipso_v4.h | 3 | ||||
-rw-r--r-- | net/netlabel/netlabel_domainhash.h | 1 | ||||
-rw-r--r-- | net/netlabel/netlabel_kapi.c | 177 | ||||
-rw-r--r-- | net/sched/cls_flow.c | 4 | ||||
-rw-r--r-- | net/sched/em_meta.c | 17 | ||||
-rw-r--r-- | net/sctp/auth.c | 6 | ||||
-rw-r--r-- | net/sctp/sm_statefuns.c | 4 |
18 files changed, 242 insertions, 91 deletions
diff --git a/net/bluetooth/hidp/core.c b/net/bluetooth/hidp/core.c index 782a22602b86..519cdb920f93 100644 --- a/net/bluetooth/hidp/core.c +++ b/net/bluetooth/hidp/core.c | |||
@@ -135,8 +135,8 @@ static void __hidp_copy_session(struct hidp_session *session, struct hidp_connin | |||
135 | } | 135 | } |
136 | } | 136 | } |
137 | 137 | ||
138 | static inline int hidp_queue_event(struct hidp_session *session, struct input_dev *dev, | 138 | static int hidp_queue_event(struct hidp_session *session, struct input_dev *dev, |
139 | unsigned int type, unsigned int code, int value) | 139 | unsigned int type, unsigned int code, int value) |
140 | { | 140 | { |
141 | unsigned char newleds; | 141 | unsigned char newleds; |
142 | struct sk_buff *skb; | 142 | struct sk_buff *skb; |
@@ -243,7 +243,8 @@ static void hidp_input_report(struct hidp_session *session, struct sk_buff *skb) | |||
243 | input_sync(dev); | 243 | input_sync(dev); |
244 | } | 244 | } |
245 | 245 | ||
246 | static inline int hidp_queue_report(struct hidp_session *session, unsigned char *data, int size) | 246 | static int hidp_queue_report(struct hidp_session *session, |
247 | unsigned char *data, int size) | ||
247 | { | 248 | { |
248 | struct sk_buff *skb; | 249 | struct sk_buff *skb; |
249 | 250 | ||
@@ -287,7 +288,7 @@ static void hidp_idle_timeout(unsigned long arg) | |||
287 | hidp_schedule(session); | 288 | hidp_schedule(session); |
288 | } | 289 | } |
289 | 290 | ||
290 | static inline void hidp_set_timer(struct hidp_session *session) | 291 | static void hidp_set_timer(struct hidp_session *session) |
291 | { | 292 | { |
292 | if (session->idle_to > 0) | 293 | if (session->idle_to > 0) |
293 | mod_timer(&session->timer, jiffies + HZ * session->idle_to); | 294 | mod_timer(&session->timer, jiffies + HZ * session->idle_to); |
@@ -332,7 +333,8 @@ static inline int hidp_send_ctrl_message(struct hidp_session *session, | |||
332 | return err; | 333 | return err; |
333 | } | 334 | } |
334 | 335 | ||
335 | static inline void hidp_process_handshake(struct hidp_session *session, unsigned char param) | 336 | static void hidp_process_handshake(struct hidp_session *session, |
337 | unsigned char param) | ||
336 | { | 338 | { |
337 | BT_DBG("session %p param 0x%02x", session, param); | 339 | BT_DBG("session %p param 0x%02x", session, param); |
338 | 340 | ||
@@ -365,38 +367,23 @@ static inline void hidp_process_handshake(struct hidp_session *session, unsigned | |||
365 | } | 367 | } |
366 | } | 368 | } |
367 | 369 | ||
368 | static inline void hidp_process_hid_control(struct hidp_session *session, unsigned char param) | 370 | static void hidp_process_hid_control(struct hidp_session *session, |
371 | unsigned char param) | ||
369 | { | 372 | { |
370 | BT_DBG("session %p param 0x%02x", session, param); | 373 | BT_DBG("session %p param 0x%02x", session, param); |
371 | 374 | ||
372 | switch (param) { | 375 | if (param == HIDP_CTRL_VIRTUAL_CABLE_UNPLUG) { |
373 | case HIDP_CTRL_NOP: | ||
374 | break; | ||
375 | |||
376 | case HIDP_CTRL_VIRTUAL_CABLE_UNPLUG: | ||
377 | /* Flush the transmit queues */ | 376 | /* Flush the transmit queues */ |
378 | skb_queue_purge(&session->ctrl_transmit); | 377 | skb_queue_purge(&session->ctrl_transmit); |
379 | skb_queue_purge(&session->intr_transmit); | 378 | skb_queue_purge(&session->intr_transmit); |
380 | 379 | ||
381 | /* Kill session thread */ | 380 | /* Kill session thread */ |
382 | atomic_inc(&session->terminate); | 381 | atomic_inc(&session->terminate); |
383 | break; | ||
384 | |||
385 | case HIDP_CTRL_HARD_RESET: | ||
386 | case HIDP_CTRL_SOFT_RESET: | ||
387 | case HIDP_CTRL_SUSPEND: | ||
388 | case HIDP_CTRL_EXIT_SUSPEND: | ||
389 | /* FIXME: We have to parse these and return no error */ | ||
390 | break; | ||
391 | |||
392 | default: | ||
393 | __hidp_send_ctrl_message(session, | ||
394 | HIDP_TRANS_HANDSHAKE | HIDP_HSHK_ERR_INVALID_PARAMETER, NULL, 0); | ||
395 | break; | ||
396 | } | 382 | } |
397 | } | 383 | } |
398 | 384 | ||
399 | static inline void hidp_process_data(struct hidp_session *session, struct sk_buff *skb, unsigned char param) | 385 | static void hidp_process_data(struct hidp_session *session, struct sk_buff *skb, |
386 | unsigned char param) | ||
400 | { | 387 | { |
401 | BT_DBG("session %p skb %p len %d param 0x%02x", session, skb, skb->len, param); | 388 | BT_DBG("session %p skb %p len %d param 0x%02x", session, skb, skb->len, param); |
402 | 389 | ||
@@ -423,7 +410,8 @@ static inline void hidp_process_data(struct hidp_session *session, struct sk_buf | |||
423 | } | 410 | } |
424 | } | 411 | } |
425 | 412 | ||
426 | static inline void hidp_recv_ctrl_frame(struct hidp_session *session, struct sk_buff *skb) | 413 | static void hidp_recv_ctrl_frame(struct hidp_session *session, |
414 | struct sk_buff *skb) | ||
427 | { | 415 | { |
428 | unsigned char hdr, type, param; | 416 | unsigned char hdr, type, param; |
429 | 417 | ||
@@ -457,7 +445,8 @@ static inline void hidp_recv_ctrl_frame(struct hidp_session *session, struct sk_ | |||
457 | kfree_skb(skb); | 445 | kfree_skb(skb); |
458 | } | 446 | } |
459 | 447 | ||
460 | static inline void hidp_recv_intr_frame(struct hidp_session *session, struct sk_buff *skb) | 448 | static void hidp_recv_intr_frame(struct hidp_session *session, |
449 | struct sk_buff *skb) | ||
461 | { | 450 | { |
462 | unsigned char hdr; | 451 | unsigned char hdr; |
463 | 452 | ||
@@ -625,7 +614,8 @@ static struct device *hidp_get_device(struct hidp_session *session) | |||
625 | return conn ? &conn->dev : NULL; | 614 | return conn ? &conn->dev : NULL; |
626 | } | 615 | } |
627 | 616 | ||
628 | static inline int hidp_setup_input(struct hidp_session *session, struct hidp_connadd_req *req) | 617 | static int hidp_setup_input(struct hidp_session *session, |
618 | struct hidp_connadd_req *req) | ||
629 | { | 619 | { |
630 | struct input_dev *input = session->input; | 620 | struct input_dev *input = session->input; |
631 | int i; | 621 | int i; |
@@ -702,7 +692,8 @@ static void hidp_setup_quirks(struct hid_device *hid) | |||
702 | hid->quirks = hidp_blacklist[n].quirks; | 692 | hid->quirks = hidp_blacklist[n].quirks; |
703 | } | 693 | } |
704 | 694 | ||
705 | static inline void hidp_setup_hid(struct hidp_session *session, struct hidp_connadd_req *req) | 695 | static void hidp_setup_hid(struct hidp_session *session, |
696 | struct hidp_connadd_req *req) | ||
706 | { | 697 | { |
707 | struct hid_device *hid = session->hid; | 698 | struct hid_device *hid = session->hid; |
708 | struct hid_report *report; | 699 | struct hid_report *report; |
diff --git a/net/bluetooth/rfcomm/tty.c b/net/bluetooth/rfcomm/tty.c index 788c70321858..e4c779bb8d76 100644 --- a/net/bluetooth/rfcomm/tty.c +++ b/net/bluetooth/rfcomm/tty.c | |||
@@ -429,7 +429,8 @@ static int rfcomm_release_dev(void __user *arg) | |||
429 | if (dev->tty) | 429 | if (dev->tty) |
430 | tty_vhangup(dev->tty); | 430 | tty_vhangup(dev->tty); |
431 | 431 | ||
432 | rfcomm_dev_del(dev); | 432 | if (!test_bit(RFCOMM_RELEASE_ONHUP, &dev->flags)) |
433 | rfcomm_dev_del(dev); | ||
433 | rfcomm_dev_put(dev); | 434 | rfcomm_dev_put(dev); |
434 | return 0; | 435 | return 0; |
435 | } | 436 | } |
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index ddbdde82a700..61ac8d06292c 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c | |||
@@ -82,32 +82,6 @@ int rtnl_trylock(void) | |||
82 | return mutex_trylock(&rtnl_mutex); | 82 | return mutex_trylock(&rtnl_mutex); |
83 | } | 83 | } |
84 | 84 | ||
85 | int rtattr_parse(struct rtattr *tb[], int maxattr, struct rtattr *rta, int len) | ||
86 | { | ||
87 | memset(tb, 0, sizeof(struct rtattr*)*maxattr); | ||
88 | |||
89 | while (RTA_OK(rta, len)) { | ||
90 | unsigned flavor = rta->rta_type; | ||
91 | if (flavor && flavor <= maxattr) | ||
92 | tb[flavor-1] = rta; | ||
93 | rta = RTA_NEXT(rta, len); | ||
94 | } | ||
95 | return 0; | ||
96 | } | ||
97 | |||
98 | int __rtattr_parse_nested_compat(struct rtattr *tb[], int maxattr, | ||
99 | struct rtattr *rta, int len) | ||
100 | { | ||
101 | if (RTA_PAYLOAD(rta) < len) | ||
102 | return -1; | ||
103 | if (RTA_PAYLOAD(rta) >= RTA_ALIGN(len) + sizeof(struct rtattr)) { | ||
104 | rta = RTA_DATA(rta) + RTA_ALIGN(len); | ||
105 | return rtattr_parse_nested(tb, maxattr, rta); | ||
106 | } | ||
107 | memset(tb, 0, sizeof(struct rtattr *) * maxattr); | ||
108 | return 0; | ||
109 | } | ||
110 | |||
111 | static struct rtnl_link *rtnl_msg_handlers[NPROTO]; | 85 | static struct rtnl_link *rtnl_msg_handlers[NPROTO]; |
112 | 86 | ||
113 | static inline int rtm_msgindex(int msgtype) | 87 | static inline int rtm_msgindex(int msgtype) |
@@ -442,21 +416,6 @@ void __rta_fill(struct sk_buff *skb, int attrtype, int attrlen, const void *data | |||
442 | memset(RTA_DATA(rta) + attrlen, 0, RTA_ALIGN(size) - size); | 416 | memset(RTA_DATA(rta) + attrlen, 0, RTA_ALIGN(size) - size); |
443 | } | 417 | } |
444 | 418 | ||
445 | size_t rtattr_strlcpy(char *dest, const struct rtattr *rta, size_t size) | ||
446 | { | ||
447 | size_t ret = RTA_PAYLOAD(rta); | ||
448 | char *src = RTA_DATA(rta); | ||
449 | |||
450 | if (ret > 0 && src[ret - 1] == '\0') | ||
451 | ret--; | ||
452 | if (size > 0) { | ||
453 | size_t len = (ret >= size) ? size - 1 : ret; | ||
454 | memset(dest, 0, size); | ||
455 | memcpy(dest, src, len); | ||
456 | } | ||
457 | return ret; | ||
458 | } | ||
459 | |||
460 | int rtnetlink_send(struct sk_buff *skb, struct net *net, u32 pid, unsigned group, int echo) | 419 | int rtnetlink_send(struct sk_buff *skb, struct net *net, u32 pid, unsigned group, int echo) |
461 | { | 420 | { |
462 | struct sock *rtnl = net->rtnl; | 421 | struct sock *rtnl = net->rtnl; |
@@ -1411,9 +1370,6 @@ void __init rtnetlink_init(void) | |||
1411 | } | 1370 | } |
1412 | 1371 | ||
1413 | EXPORT_SYMBOL(__rta_fill); | 1372 | EXPORT_SYMBOL(__rta_fill); |
1414 | EXPORT_SYMBOL(rtattr_strlcpy); | ||
1415 | EXPORT_SYMBOL(rtattr_parse); | ||
1416 | EXPORT_SYMBOL(__rtattr_parse_nested_compat); | ||
1417 | EXPORT_SYMBOL(rtnetlink_put_metrics); | 1373 | EXPORT_SYMBOL(rtnetlink_put_metrics); |
1418 | EXPORT_SYMBOL(rtnl_lock); | 1374 | EXPORT_SYMBOL(rtnl_lock); |
1419 | EXPORT_SYMBOL(rtnl_trylock); | 1375 | EXPORT_SYMBOL(rtnl_trylock); |
diff --git a/net/ipv4/cipso_ipv4.c b/net/ipv4/cipso_ipv4.c index a2241060113b..8cd357f41283 100644 --- a/net/ipv4/cipso_ipv4.c +++ b/net/ipv4/cipso_ipv4.c | |||
@@ -547,8 +547,8 @@ int cipso_v4_doi_remove(u32 doi, | |||
547 | rcu_read_lock(); | 547 | rcu_read_lock(); |
548 | list_for_each_entry_rcu(dom_iter, &doi_def->dom_list, list) | 548 | list_for_each_entry_rcu(dom_iter, &doi_def->dom_list, list) |
549 | if (dom_iter->valid) | 549 | if (dom_iter->valid) |
550 | netlbl_domhsh_remove(dom_iter->domain, | 550 | netlbl_cfg_map_del(dom_iter->domain, |
551 | audit_info); | 551 | audit_info); |
552 | rcu_read_unlock(); | 552 | rcu_read_unlock(); |
553 | cipso_v4_cache_invalidate(); | 553 | cipso_v4_cache_invalidate(); |
554 | call_rcu(&doi_def->rcu, callback); | 554 | call_rcu(&doi_def->rcu, callback); |
diff --git a/net/ipv4/fib_trie.c b/net/ipv4/fib_trie.c index 35851c96bdfb..f5fba3f71c06 100644 --- a/net/ipv4/fib_trie.c +++ b/net/ipv4/fib_trie.c | |||
@@ -2431,8 +2431,7 @@ static int fib_trie_seq_show(struct seq_file *seq, void *v) | |||
2431 | rtn_type(buf2, sizeof(buf2), | 2431 | rtn_type(buf2, sizeof(buf2), |
2432 | fa->fa_type)); | 2432 | fa->fa_type)); |
2433 | if (fa->fa_tos) | 2433 | if (fa->fa_tos) |
2434 | seq_printf(seq, "tos =%d\n", | 2434 | seq_printf(seq, " tos=%d", fa->fa_tos); |
2435 | fa->fa_tos); | ||
2436 | seq_putc(seq, '\n'); | 2435 | seq_putc(seq, '\n'); |
2437 | } | 2436 | } |
2438 | } | 2437 | } |
diff --git a/net/ipv4/icmp.c b/net/ipv4/icmp.c index a7321a82df6d..a13c074dac09 100644 --- a/net/ipv4/icmp.c +++ b/net/ipv4/icmp.c | |||
@@ -1015,7 +1015,8 @@ int icmp_rcv(struct sk_buff *skb) | |||
1015 | goto error; | 1015 | goto error; |
1016 | } | 1016 | } |
1017 | 1017 | ||
1018 | __skb_pull(skb, sizeof(*icmph)); | 1018 | if (!pskb_pull(skb, sizeof(*icmph))) |
1019 | goto error; | ||
1019 | 1020 | ||
1020 | icmph = icmp_hdr(skb); | 1021 | icmph = icmp_hdr(skb); |
1021 | 1022 | ||
diff --git a/net/ipv4/inet_hashtables.c b/net/ipv4/inet_hashtables.c index 90f422c9447b..9cac6c034abd 100644 --- a/net/ipv4/inet_hashtables.c +++ b/net/ipv4/inet_hashtables.c | |||
@@ -398,7 +398,7 @@ out: | |||
398 | EXPORT_SYMBOL_GPL(inet_unhash); | 398 | EXPORT_SYMBOL_GPL(inet_unhash); |
399 | 399 | ||
400 | int __inet_hash_connect(struct inet_timewait_death_row *death_row, | 400 | int __inet_hash_connect(struct inet_timewait_death_row *death_row, |
401 | struct sock *sk, | 401 | struct sock *sk, u32 port_offset, |
402 | int (*check_established)(struct inet_timewait_death_row *, | 402 | int (*check_established)(struct inet_timewait_death_row *, |
403 | struct sock *, __u16, struct inet_timewait_sock **), | 403 | struct sock *, __u16, struct inet_timewait_sock **), |
404 | void (*hash)(struct sock *sk)) | 404 | void (*hash)(struct sock *sk)) |
@@ -413,7 +413,7 @@ int __inet_hash_connect(struct inet_timewait_death_row *death_row, | |||
413 | if (!snum) { | 413 | if (!snum) { |
414 | int i, remaining, low, high, port; | 414 | int i, remaining, low, high, port; |
415 | static u32 hint; | 415 | static u32 hint; |
416 | u32 offset = hint + inet_sk_port_offset(sk); | 416 | u32 offset = hint + port_offset; |
417 | struct hlist_node *node; | 417 | struct hlist_node *node; |
418 | struct inet_timewait_sock *tw = NULL; | 418 | struct inet_timewait_sock *tw = NULL; |
419 | 419 | ||
@@ -502,7 +502,7 @@ EXPORT_SYMBOL_GPL(__inet_hash_connect); | |||
502 | int inet_hash_connect(struct inet_timewait_death_row *death_row, | 502 | int inet_hash_connect(struct inet_timewait_death_row *death_row, |
503 | struct sock *sk) | 503 | struct sock *sk) |
504 | { | 504 | { |
505 | return __inet_hash_connect(death_row, sk, | 505 | return __inet_hash_connect(death_row, sk, inet_sk_port_offset(sk), |
506 | __inet_check_established, __inet_hash_nolisten); | 506 | __inet_check_established, __inet_hash_nolisten); |
507 | } | 507 | } |
508 | 508 | ||
diff --git a/net/ipv4/xfrm4_mode_beet.c b/net/ipv4/xfrm4_mode_beet.c index e093a7b59e18..b47030ba162b 100644 --- a/net/ipv4/xfrm4_mode_beet.c +++ b/net/ipv4/xfrm4_mode_beet.c | |||
@@ -102,7 +102,7 @@ static int xfrm4_beet_input(struct xfrm_state *x, struct sk_buff *skb) | |||
102 | 102 | ||
103 | XFRM_MODE_SKB_CB(skb)->protocol = ph->nexthdr; | 103 | XFRM_MODE_SKB_CB(skb)->protocol = ph->nexthdr; |
104 | 104 | ||
105 | if (!pskb_may_pull(skb, phlen)); | 105 | if (!pskb_may_pull(skb, phlen)) |
106 | goto out; | 106 | goto out; |
107 | __skb_pull(skb, phlen); | 107 | __skb_pull(skb, phlen); |
108 | } | 108 | } |
diff --git a/net/ipv6/icmp.c b/net/ipv6/icmp.c index cbb5b9cf84ad..121d517bf91c 100644 --- a/net/ipv6/icmp.c +++ b/net/ipv6/icmp.c | |||
@@ -683,7 +683,8 @@ static int icmpv6_rcv(struct sk_buff *skb) | |||
683 | } | 683 | } |
684 | } | 684 | } |
685 | 685 | ||
686 | __skb_pull(skb, sizeof(*hdr)); | 686 | if (!pskb_pull(skb, sizeof(*hdr))) |
687 | goto discard_it; | ||
687 | 688 | ||
688 | hdr = icmp6_hdr(skb); | 689 | hdr = icmp6_hdr(skb); |
689 | 690 | ||
diff --git a/net/ipv6/inet6_hashtables.c b/net/ipv6/inet6_hashtables.c index 43f3993e1f30..99fd25f7f005 100644 --- a/net/ipv6/inet6_hashtables.c +++ b/net/ipv6/inet6_hashtables.c | |||
@@ -236,7 +236,7 @@ static inline u32 inet6_sk_port_offset(const struct sock *sk) | |||
236 | int inet6_hash_connect(struct inet_timewait_death_row *death_row, | 236 | int inet6_hash_connect(struct inet_timewait_death_row *death_row, |
237 | struct sock *sk) | 237 | struct sock *sk) |
238 | { | 238 | { |
239 | return __inet_hash_connect(death_row, sk, | 239 | return __inet_hash_connect(death_row, sk, inet6_sk_port_offset(sk), |
240 | __inet6_check_established, __inet6_hash); | 240 | __inet6_check_established, __inet6_hash); |
241 | } | 241 | } |
242 | 242 | ||
diff --git a/net/netlabel/netlabel_cipso_v4.c b/net/netlabel/netlabel_cipso_v4.c index becf91a952ae..c7ad64d664ad 100644 --- a/net/netlabel/netlabel_cipso_v4.c +++ b/net/netlabel/netlabel_cipso_v4.c | |||
@@ -90,7 +90,7 @@ static const struct nla_policy netlbl_cipsov4_genl_policy[NLBL_CIPSOV4_A_MAX + 1 | |||
90 | * safely. | 90 | * safely. |
91 | * | 91 | * |
92 | */ | 92 | */ |
93 | static void netlbl_cipsov4_doi_free(struct rcu_head *entry) | 93 | void netlbl_cipsov4_doi_free(struct rcu_head *entry) |
94 | { | 94 | { |
95 | struct cipso_v4_doi *ptr; | 95 | struct cipso_v4_doi *ptr; |
96 | 96 | ||
diff --git a/net/netlabel/netlabel_cipso_v4.h b/net/netlabel/netlabel_cipso_v4.h index f03cf9b78286..220cb9d06b49 100644 --- a/net/netlabel/netlabel_cipso_v4.h +++ b/net/netlabel/netlabel_cipso_v4.h | |||
@@ -163,4 +163,7 @@ enum { | |||
163 | /* NetLabel protocol functions */ | 163 | /* NetLabel protocol functions */ |
164 | int netlbl_cipsov4_genl_init(void); | 164 | int netlbl_cipsov4_genl_init(void); |
165 | 165 | ||
166 | /* Free the memory associated with a CIPSOv4 DOI definition */ | ||
167 | void netlbl_cipsov4_doi_free(struct rcu_head *entry); | ||
168 | |||
166 | #endif | 169 | #endif |
diff --git a/net/netlabel/netlabel_domainhash.h b/net/netlabel/netlabel_domainhash.h index 3689956c3436..8220990ceb96 100644 --- a/net/netlabel/netlabel_domainhash.h +++ b/net/netlabel/netlabel_domainhash.h | |||
@@ -61,6 +61,7 @@ int netlbl_domhsh_add(struct netlbl_dom_map *entry, | |||
61 | struct netlbl_audit *audit_info); | 61 | struct netlbl_audit *audit_info); |
62 | int netlbl_domhsh_add_default(struct netlbl_dom_map *entry, | 62 | int netlbl_domhsh_add_default(struct netlbl_dom_map *entry, |
63 | struct netlbl_audit *audit_info); | 63 | struct netlbl_audit *audit_info); |
64 | int netlbl_domhsh_remove(const char *domain, struct netlbl_audit *audit_info); | ||
64 | int netlbl_domhsh_remove_default(struct netlbl_audit *audit_info); | 65 | int netlbl_domhsh_remove_default(struct netlbl_audit *audit_info); |
65 | struct netlbl_dom_map *netlbl_domhsh_getentry(const char *domain); | 66 | struct netlbl_dom_map *netlbl_domhsh_getentry(const char *domain); |
66 | int netlbl_domhsh_walk(u32 *skip_bkt, | 67 | int netlbl_domhsh_walk(u32 *skip_bkt, |
diff --git a/net/netlabel/netlabel_kapi.c b/net/netlabel/netlabel_kapi.c index c69e3e1f05c3..39793a1a93aa 100644 --- a/net/netlabel/netlabel_kapi.c +++ b/net/netlabel/netlabel_kapi.c | |||
@@ -30,6 +30,7 @@ | |||
30 | 30 | ||
31 | #include <linux/init.h> | 31 | #include <linux/init.h> |
32 | #include <linux/types.h> | 32 | #include <linux/types.h> |
33 | #include <linux/audit.h> | ||
33 | #include <net/ip.h> | 34 | #include <net/ip.h> |
34 | #include <net/netlabel.h> | 35 | #include <net/netlabel.h> |
35 | #include <net/cipso_ipv4.h> | 36 | #include <net/cipso_ipv4.h> |
@@ -38,10 +39,186 @@ | |||
38 | 39 | ||
39 | #include "netlabel_domainhash.h" | 40 | #include "netlabel_domainhash.h" |
40 | #include "netlabel_unlabeled.h" | 41 | #include "netlabel_unlabeled.h" |
42 | #include "netlabel_cipso_v4.h" | ||
41 | #include "netlabel_user.h" | 43 | #include "netlabel_user.h" |
42 | #include "netlabel_mgmt.h" | 44 | #include "netlabel_mgmt.h" |
43 | 45 | ||
44 | /* | 46 | /* |
47 | * Configuration Functions | ||
48 | */ | ||
49 | |||
50 | /** | ||
51 | * netlbl_cfg_map_del - Remove a NetLabel/LSM domain mapping | ||
52 | * @domain: the domain mapping to remove | ||
53 | * @audit_info: NetLabel audit information | ||
54 | * | ||
55 | * Description: | ||
56 | * Removes a NetLabel/LSM domain mapping. A @domain value of NULL causes the | ||
57 | * default domain mapping to be removed. Returns zero on success, negative | ||
58 | * values on failure. | ||
59 | * | ||
60 | */ | ||
61 | int netlbl_cfg_map_del(const char *domain, struct netlbl_audit *audit_info) | ||
62 | { | ||
63 | return netlbl_domhsh_remove(domain, audit_info); | ||
64 | } | ||
65 | |||
66 | /** | ||
67 | * netlbl_cfg_unlbl_add_map - Add an unlabeled NetLabel/LSM domain mapping | ||
68 | * @domain: the domain mapping to add | ||
69 | * @audit_info: NetLabel audit information | ||
70 | * | ||
71 | * Description: | ||
72 | * Adds a new unlabeled NetLabel/LSM domain mapping. A @domain value of NULL | ||
73 | * causes a new default domain mapping to be added. Returns zero on success, | ||
74 | * negative values on failure. | ||
75 | * | ||
76 | */ | ||
77 | int netlbl_cfg_unlbl_add_map(const char *domain, | ||
78 | struct netlbl_audit *audit_info) | ||
79 | { | ||
80 | int ret_val = -ENOMEM; | ||
81 | struct netlbl_dom_map *entry; | ||
82 | |||
83 | entry = kzalloc(sizeof(*entry), GFP_ATOMIC); | ||
84 | if (entry == NULL) | ||
85 | goto cfg_unlbl_add_map_failure; | ||
86 | if (domain != NULL) { | ||
87 | entry->domain = kstrdup(domain, GFP_ATOMIC); | ||
88 | if (entry->domain == NULL) | ||
89 | goto cfg_unlbl_add_map_failure; | ||
90 | } | ||
91 | entry->type = NETLBL_NLTYPE_UNLABELED; | ||
92 | |||
93 | ret_val = netlbl_domhsh_add(entry, audit_info); | ||
94 | if (ret_val != 0) | ||
95 | goto cfg_unlbl_add_map_failure; | ||
96 | |||
97 | return 0; | ||
98 | |||
99 | cfg_unlbl_add_map_failure: | ||
100 | if (entry != NULL) | ||
101 | kfree(entry->domain); | ||
102 | kfree(entry); | ||
103 | return ret_val; | ||
104 | } | ||
105 | |||
106 | /** | ||
107 | * netlbl_cfg_cipsov4_add - Add a new CIPSOv4 DOI definition | ||
108 | * @doi_def: the DOI definition | ||
109 | * @audit_info: NetLabel audit information | ||
110 | * | ||
111 | * Description: | ||
112 | * Add a new CIPSOv4 DOI definition to the NetLabel subsystem. Returns zero on | ||
113 | * success, negative values on failure. | ||
114 | * | ||
115 | */ | ||
116 | int netlbl_cfg_cipsov4_add(struct cipso_v4_doi *doi_def, | ||
117 | struct netlbl_audit *audit_info) | ||
118 | { | ||
119 | int ret_val; | ||
120 | const char *type_str; | ||
121 | struct audit_buffer *audit_buf; | ||
122 | |||
123 | ret_val = cipso_v4_doi_add(doi_def); | ||
124 | |||
125 | audit_buf = netlbl_audit_start_common(AUDIT_MAC_CIPSOV4_ADD, | ||
126 | audit_info); | ||
127 | if (audit_buf != NULL) { | ||
128 | switch (doi_def->type) { | ||
129 | case CIPSO_V4_MAP_STD: | ||
130 | type_str = "std"; | ||
131 | break; | ||
132 | case CIPSO_V4_MAP_PASS: | ||
133 | type_str = "pass"; | ||
134 | break; | ||
135 | default: | ||
136 | type_str = "(unknown)"; | ||
137 | } | ||
138 | audit_log_format(audit_buf, | ||
139 | " cipso_doi=%u cipso_type=%s res=%u", | ||
140 | doi_def->doi, | ||
141 | type_str, | ||
142 | ret_val == 0 ? 1 : 0); | ||
143 | audit_log_end(audit_buf); | ||
144 | } | ||
145 | |||
146 | return ret_val; | ||
147 | } | ||
148 | |||
149 | /** | ||
150 | * netlbl_cfg_cipsov4_add_map - Add a new CIPSOv4 DOI definition and mapping | ||
151 | * @doi_def: the DOI definition | ||
152 | * @domain: the domain mapping to add | ||
153 | * @audit_info: NetLabel audit information | ||
154 | * | ||
155 | * Description: | ||
156 | * Add a new CIPSOv4 DOI definition and NetLabel/LSM domain mapping for this | ||
157 | * new DOI definition to the NetLabel subsystem. A @domain value of NULL adds | ||
158 | * a new default domain mapping. Returns zero on success, negative values on | ||
159 | * failure. | ||
160 | * | ||
161 | */ | ||
162 | int netlbl_cfg_cipsov4_add_map(struct cipso_v4_doi *doi_def, | ||
163 | const char *domain, | ||
164 | struct netlbl_audit *audit_info) | ||
165 | { | ||
166 | int ret_val = -ENOMEM; | ||
167 | struct netlbl_dom_map *entry; | ||
168 | |||
169 | entry = kzalloc(sizeof(*entry), GFP_ATOMIC); | ||
170 | if (entry == NULL) | ||
171 | goto cfg_cipsov4_add_map_failure; | ||
172 | if (domain != NULL) { | ||
173 | entry->domain = kstrdup(domain, GFP_ATOMIC); | ||
174 | if (entry->domain == NULL) | ||
175 | goto cfg_cipsov4_add_map_failure; | ||
176 | } | ||
177 | entry->type = NETLBL_NLTYPE_CIPSOV4; | ||
178 | entry->type_def.cipsov4 = doi_def; | ||
179 | |||
180 | /* Grab a RCU read lock here so nothing happens to the doi_def variable | ||
181 | * between adding it to the CIPSOv4 protocol engine and adding a | ||
182 | * domain mapping for it. */ | ||
183 | |||
184 | rcu_read_lock(); | ||
185 | ret_val = netlbl_cfg_cipsov4_add(doi_def, audit_info); | ||
186 | if (ret_val != 0) | ||
187 | goto cfg_cipsov4_add_map_failure_unlock; | ||
188 | ret_val = netlbl_domhsh_add(entry, audit_info); | ||
189 | if (ret_val != 0) | ||
190 | goto cfg_cipsov4_add_map_failure_remove_doi; | ||
191 | rcu_read_unlock(); | ||
192 | |||
193 | return 0; | ||
194 | |||
195 | cfg_cipsov4_add_map_failure_remove_doi: | ||
196 | cipso_v4_doi_remove(doi_def->doi, audit_info, netlbl_cipsov4_doi_free); | ||
197 | cfg_cipsov4_add_map_failure_unlock: | ||
198 | rcu_read_unlock(); | ||
199 | cfg_cipsov4_add_map_failure: | ||
200 | if (entry != NULL) | ||
201 | kfree(entry->domain); | ||
202 | kfree(entry); | ||
203 | return ret_val; | ||
204 | } | ||
205 | |||
206 | /** | ||
207 | * netlbl_cfg_cipsov4_del - Removean existing CIPSOv4 DOI definition | ||
208 | * @doi: the CIPSO DOI value | ||
209 | * @audit_info: NetLabel audit information | ||
210 | * | ||
211 | * Description: | ||
212 | * Removes an existing CIPSOv4 DOI definition from the NetLabel subsystem. | ||
213 | * Returns zero on success, negative values on failure. | ||
214 | * | ||
215 | */ | ||
216 | int netlbl_cfg_cipsov4_del(u32 doi, struct netlbl_audit *audit_info) | ||
217 | { | ||
218 | return cipso_v4_doi_remove(doi, audit_info, netlbl_cipsov4_doi_free); | ||
219 | } | ||
220 | |||
221 | /* | ||
45 | * Security Attribute Functions | 222 | * Security Attribute Functions |
46 | */ | 223 | */ |
47 | 224 | ||
diff --git a/net/sched/cls_flow.c b/net/sched/cls_flow.c index 5a7f6a3060fc..8d7698621f0a 100644 --- a/net/sched/cls_flow.c +++ b/net/sched/cls_flow.c | |||
@@ -594,11 +594,11 @@ static int flow_dump(struct tcf_proto *tp, unsigned long fh, | |||
594 | 594 | ||
595 | if (tcf_exts_dump(skb, &f->exts, &flow_ext_map) < 0) | 595 | if (tcf_exts_dump(skb, &f->exts, &flow_ext_map) < 0) |
596 | goto nla_put_failure; | 596 | goto nla_put_failure; |
597 | 597 | #ifdef CONFIG_NET_EMATCH | |
598 | if (f->ematches.hdr.nmatches && | 598 | if (f->ematches.hdr.nmatches && |
599 | tcf_em_tree_dump(skb, &f->ematches, TCA_FLOW_EMATCHES) < 0) | 599 | tcf_em_tree_dump(skb, &f->ematches, TCA_FLOW_EMATCHES) < 0) |
600 | goto nla_put_failure; | 600 | goto nla_put_failure; |
601 | 601 | #endif | |
602 | nla_nest_end(skb, nest); | 602 | nla_nest_end(skb, nest); |
603 | 603 | ||
604 | if (tcf_exts_dump_stats(skb, &f->exts, &flow_ext_map) < 0) | 604 | if (tcf_exts_dump_stats(skb, &f->exts, &flow_ext_map) < 0) |
diff --git a/net/sched/em_meta.c b/net/sched/em_meta.c index a1e5619b1876..9c2ec1992a2a 100644 --- a/net/sched/em_meta.c +++ b/net/sched/em_meta.c | |||
@@ -65,6 +65,7 @@ | |||
65 | #include <linux/string.h> | 65 | #include <linux/string.h> |
66 | #include <linux/skbuff.h> | 66 | #include <linux/skbuff.h> |
67 | #include <linux/random.h> | 67 | #include <linux/random.h> |
68 | #include <linux/if_vlan.h> | ||
68 | #include <linux/tc_ematch/tc_em_meta.h> | 69 | #include <linux/tc_ematch/tc_em_meta.h> |
69 | #include <net/dst.h> | 70 | #include <net/dst.h> |
70 | #include <net/route.h> | 71 | #include <net/route.h> |
@@ -170,6 +171,21 @@ META_COLLECTOR(var_dev) | |||
170 | } | 171 | } |
171 | 172 | ||
172 | /************************************************************************** | 173 | /************************************************************************** |
174 | * vlan tag | ||
175 | **************************************************************************/ | ||
176 | |||
177 | META_COLLECTOR(int_vlan_tag) | ||
178 | { | ||
179 | unsigned short tag; | ||
180 | if (vlan_get_tag(skb, &tag) < 0) | ||
181 | *err = -1; | ||
182 | else | ||
183 | dst->value = tag; | ||
184 | } | ||
185 | |||
186 | |||
187 | |||
188 | /************************************************************************** | ||
173 | * skb attributes | 189 | * skb attributes |
174 | **************************************************************************/ | 190 | **************************************************************************/ |
175 | 191 | ||
@@ -520,6 +536,7 @@ static struct meta_ops __meta_ops[TCF_META_TYPE_MAX+1][TCF_META_ID_MAX+1] = { | |||
520 | [META_ID(SK_SNDTIMEO)] = META_FUNC(int_sk_sndtimeo), | 536 | [META_ID(SK_SNDTIMEO)] = META_FUNC(int_sk_sndtimeo), |
521 | [META_ID(SK_SENDMSG_OFF)] = META_FUNC(int_sk_sendmsg_off), | 537 | [META_ID(SK_SENDMSG_OFF)] = META_FUNC(int_sk_sendmsg_off), |
522 | [META_ID(SK_WRITE_PENDING)] = META_FUNC(int_sk_write_pend), | 538 | [META_ID(SK_WRITE_PENDING)] = META_FUNC(int_sk_write_pend), |
539 | [META_ID(VLAN_TAG)] = META_FUNC(int_vlan_tag), | ||
523 | } | 540 | } |
524 | }; | 541 | }; |
525 | 542 | ||
diff --git a/net/sctp/auth.c b/net/sctp/auth.c index 97e6ebd14500..ae367c82e512 100644 --- a/net/sctp/auth.c +++ b/net/sctp/auth.c | |||
@@ -420,15 +420,15 @@ struct sctp_shared_key *sctp_auth_get_shkey( | |||
420 | const struct sctp_association *asoc, | 420 | const struct sctp_association *asoc, |
421 | __u16 key_id) | 421 | __u16 key_id) |
422 | { | 422 | { |
423 | struct sctp_shared_key *key = NULL; | 423 | struct sctp_shared_key *key; |
424 | 424 | ||
425 | /* First search associations set of endpoint pair shared keys */ | 425 | /* First search associations set of endpoint pair shared keys */ |
426 | key_for_each(key, &asoc->endpoint_shared_keys) { | 426 | key_for_each(key, &asoc->endpoint_shared_keys) { |
427 | if (key->key_id == key_id) | 427 | if (key->key_id == key_id) |
428 | break; | 428 | return key; |
429 | } | 429 | } |
430 | 430 | ||
431 | return key; | 431 | return NULL; |
432 | } | 432 | } |
433 | 433 | ||
434 | /* | 434 | /* |
diff --git a/net/sctp/sm_statefuns.c b/net/sctp/sm_statefuns.c index 5df0c4bd415b..f98658782d4f 100644 --- a/net/sctp/sm_statefuns.c +++ b/net/sctp/sm_statefuns.c | |||
@@ -3865,6 +3865,10 @@ sctp_disposition_t sctp_sf_eat_auth(const struct sctp_endpoint *ep, | |||
3865 | struct sctp_chunk *err_chunk; | 3865 | struct sctp_chunk *err_chunk; |
3866 | sctp_ierror_t error; | 3866 | sctp_ierror_t error; |
3867 | 3867 | ||
3868 | /* Make sure that the peer has AUTH capable */ | ||
3869 | if (!asoc->peer.auth_capable) | ||
3870 | return sctp_sf_unk_chunk(ep, asoc, type, arg, commands); | ||
3871 | |||
3868 | if (!sctp_vtag_verify(chunk, asoc)) { | 3872 | if (!sctp_vtag_verify(chunk, asoc)) { |
3869 | sctp_add_cmd_sf(commands, SCTP_CMD_REPORT_BAD_TAG, | 3873 | sctp_add_cmd_sf(commands, SCTP_CMD_REPORT_BAD_TAG, |
3870 | SCTP_NULL()); | 3874 | SCTP_NULL()); |