aboutsummaryrefslogtreecommitdiffstats
path: root/net/tipc/port.c
diff options
context:
space:
mode:
authorAllan Stephens <allan.stephens@windriver.com>2006-06-26 02:38:58 -0400
committerDavid S. Miller <davem@davemloft.net>2006-06-26 02:38:58 -0400
commit9688243b635ecede23fe4492ba23f36439398095 (patch)
tree5e32d909a89a1e4efe53fd8f1cf9eaa14cfddad5 /net/tipc/port.c
parent49384507896ee26e67266cebef6b6a9f2e31081c (diff)
[TIPC]: Allow ports to receive multicast messages through native API.
This fix prevents a kernel panic if an application mistakenly sends a multicast message to TIPC's topology service or configuration service. Signed-off-by: Allan Stephens <allan.stephens@windriver.com> Signed-off-by: Per Liden <per.liden@ericsson.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/tipc/port.c')
-rw-r--r--net/tipc/port.c26
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;
901err: 905err:
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);