diff options
author | Allan Stephens <allan.stephens@windriver.com> | 2006-06-26 02:38:58 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2006-06-26 02:38:58 -0400 |
commit | 9688243b635ecede23fe4492ba23f36439398095 (patch) | |
tree | 5e32d909a89a1e4efe53fd8f1cf9eaa14cfddad5 /net | |
parent | 49384507896ee26e67266cebef6b6a9f2e31081c (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')
-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); |