diff options
Diffstat (limited to 'net/tipc')
| -rw-r--r-- | net/tipc/port.c | 26 |
1 files changed, 16 insertions, 10 deletions
diff --git a/net/tipc/port.c b/net/tipc/port.c index 67e96cb1e825..360920b3d821 100644 --- a/net/tipc/port.c +++ b/net/tipc/port.c | |||
| @@ -810,18 +810,20 @@ static void port_dispatcher_sigh(void *dummy) | |||
| 810 | void *usr_handle; | 810 | void *usr_handle; |
| 811 | int connected; | 811 | int connected; |
| 812 | int published; | 812 | int published; |
| 813 | u32 message_type; | ||
| 813 | 814 | ||
| 814 | struct sk_buff *next = buf->next; | 815 | struct sk_buff *next = buf->next; |
| 815 | struct tipc_msg *msg = buf_msg(buf); | 816 | struct tipc_msg *msg = buf_msg(buf); |
| 816 | u32 dref = msg_destport(msg); | 817 | u32 dref = msg_destport(msg); |
| 817 | 818 | ||
| 819 | message_type = msg_type(msg); | ||
| 820 | if (message_type > TIPC_DIRECT_MSG) | ||
| 821 | goto reject; /* Unsupported message type */ | ||
| 822 | |||
| 818 | p_ptr = tipc_port_lock(dref); | 823 | p_ptr = tipc_port_lock(dref); |
| 819 | if (!p_ptr) { | 824 | if (!p_ptr) |
| 820 | /* Port deleted while msg in queue */ | 825 | goto reject; /* Port deleted while msg in queue */ |
| 821 | tipc_reject_msg(buf, TIPC_ERR_NO_PORT); | 826 | |
| 822 | buf = next; | ||
| 823 | continue; | ||
| 824 | } | ||
| 825 | orig.ref = msg_origport(msg); | 827 | orig.ref = msg_origport(msg); |
| 826 | orig.node = msg_orignode(msg); | 828 | orig.node = msg_orignode(msg); |
| 827 | up_ptr = p_ptr->user_port; | 829 | up_ptr = p_ptr->user_port; |
| @@ -832,7 +834,7 @@ static void port_dispatcher_sigh(void *dummy) | |||
| 832 | if (unlikely(msg_errcode(msg))) | 834 | if (unlikely(msg_errcode(msg))) |
| 833 | goto err; | 835 | goto err; |
| 834 | 836 | ||
| 835 | switch (msg_type(msg)) { | 837 | switch (message_type) { |
| 836 | 838 | ||
| 837 | case TIPC_CONN_MSG:{ | 839 | case TIPC_CONN_MSG:{ |
| 838 | tipc_conn_msg_event cb = up_ptr->conn_msg_cb; | 840 | tipc_conn_msg_event cb = up_ptr->conn_msg_cb; |
| @@ -874,6 +876,7 @@ static void port_dispatcher_sigh(void *dummy) | |||
| 874 | &orig); | 876 | &orig); |
| 875 | break; | 877 | break; |
| 876 | } | 878 | } |
| 879 | case TIPC_MCAST_MSG: | ||
| 877 | case TIPC_NAMED_MSG:{ | 880 | case TIPC_NAMED_MSG:{ |
| 878 | tipc_named_msg_event cb = up_ptr->named_msg_cb; | 881 | tipc_named_msg_event cb = up_ptr->named_msg_cb; |
| 879 | 882 | ||
| @@ -886,7 +889,8 @@ static void port_dispatcher_sigh(void *dummy) | |||
| 886 | goto reject; | 889 | goto reject; |
| 887 | dseq.type = msg_nametype(msg); | 890 | dseq.type = msg_nametype(msg); |
| 888 | dseq.lower = msg_nameinst(msg); | 891 | dseq.lower = msg_nameinst(msg); |
| 889 | dseq.upper = dseq.lower; | 892 | dseq.upper = (message_type == TIPC_NAMED_MSG) |
| 893 | ? dseq.lower : msg_nameupper(msg); | ||
| 890 | skb_pull(buf, msg_hdr_sz(msg)); | 894 | skb_pull(buf, msg_hdr_sz(msg)); |
| 891 | cb(usr_handle, dref, &buf, msg_data(msg), | 895 | cb(usr_handle, dref, &buf, msg_data(msg), |
| 892 | msg_data_sz(msg), msg_importance(msg), | 896 | msg_data_sz(msg), msg_importance(msg), |
| @@ -899,7 +903,7 @@ static void port_dispatcher_sigh(void *dummy) | |||
| 899 | buf = next; | 903 | buf = next; |
| 900 | continue; | 904 | continue; |
| 901 | err: | 905 | err: |
| 902 | switch (msg_type(msg)) { | 906 | switch (message_type) { |
| 903 | 907 | ||
| 904 | case TIPC_CONN_MSG:{ | 908 | case TIPC_CONN_MSG:{ |
| 905 | tipc_conn_shutdown_event cb = | 909 | tipc_conn_shutdown_event cb = |
| @@ -931,6 +935,7 @@ err: | |||
| 931 | msg_data_sz(msg), msg_errcode(msg), &orig); | 935 | msg_data_sz(msg), msg_errcode(msg), &orig); |
| 932 | break; | 936 | break; |
| 933 | } | 937 | } |
| 938 | case TIPC_MCAST_MSG: | ||
| 934 | case TIPC_NAMED_MSG:{ | 939 | case TIPC_NAMED_MSG:{ |
| 935 | tipc_named_msg_err_event cb = | 940 | tipc_named_msg_err_event cb = |
| 936 | up_ptr->named_err_cb; | 941 | up_ptr->named_err_cb; |
| @@ -940,7 +945,8 @@ err: | |||
| 940 | break; | 945 | break; |
| 941 | dseq.type = msg_nametype(msg); | 946 | dseq.type = msg_nametype(msg); |
| 942 | dseq.lower = msg_nameinst(msg); | 947 | dseq.lower = msg_nameinst(msg); |
| 943 | dseq.upper = dseq.lower; | 948 | dseq.upper = (message_type == TIPC_NAMED_MSG) |
| 949 | ? dseq.lower : msg_nameupper(msg); | ||
| 944 | skb_pull(buf, msg_hdr_sz(msg)); | 950 | skb_pull(buf, msg_hdr_sz(msg)); |
| 945 | cb(usr_handle, dref, &buf, msg_data(msg), | 951 | cb(usr_handle, dref, &buf, msg_data(msg), |
| 946 | msg_data_sz(msg), msg_errcode(msg), &dseq); | 952 | msg_data_sz(msg), msg_errcode(msg), &dseq); |
