diff options
author | Linus Torvalds <torvalds@g5.osdl.org> | 2006-06-26 13:08:13 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-06-26 13:08:13 -0400 |
commit | 61a46dc9d1c10d07a2ed6b7d346b868803b52506 (patch) | |
tree | ac81648c6aa7315f42d1d17455ddf7f09d14e6b6 /net/tipc/port.c | |
parent | b78709cfd4387c15a9894748bcada8a4ca75c561 (diff) | |
parent | 8070b2b1ecbeb5437c92c33b4dcea1d8d80399ee (diff) |
Merge master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
* master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6: (42 commits)
[IOAT]: Do not dereference THIS_MODULE directly to set unsafe.
[NETROM]: Fix possible null pointer dereference.
[NET] netpoll: break recursive loop in netpoll rx path
[NET] netpoll: don't spin forever sending to stopped queues
[IRDA]: add some IBM think pads
[ATM]: atm/mpc.c warning fix
[NET]: skb_find_text ignores to argument
[NET]: make net/core/dev.c:netdev_nit static
[NET]: Fix GSO problems in dev_hard_start_xmit()
[NET]: Fix CHECKSUM_HW GSO problems.
[TIPC]: Fix incorrect correction to discovery timer frequency computation.
[TIPC]: Get rid of dynamically allocated arrays in broadcast code.
[TIPC]: Fixed link switchover bugs
[TIPC]: Enhanced & cleaned up system messages; fixed 2 obscure memory leaks.
[TIPC]: First phase of assert() cleanup
[TIPC]: Disallow config operations that aren't supported in certain modes.
[TIPC]: Fixed memory leak in tipc_link_send() when destination is unreachable
[TIPC]: Added missing warning for out-of-memory condition
[TIPC]: Withdrawing all names from nameless port now returns success, not error
[TIPC]: Optimized argument validation done by connect().
...
Diffstat (limited to 'net/tipc/port.c')
-rw-r--r-- | net/tipc/port.c | 41 |
1 files changed, 22 insertions, 19 deletions
diff --git a/net/tipc/port.c b/net/tipc/port.c index 67e96cb1e825..47d97404e3ee 100644 --- a/net/tipc/port.c +++ b/net/tipc/port.c | |||
@@ -168,7 +168,6 @@ void tipc_port_recv_mcast(struct sk_buff *buf, struct port_list *dp) | |||
168 | struct port_list *item = dp; | 168 | struct port_list *item = dp; |
169 | int cnt = 0; | 169 | int cnt = 0; |
170 | 170 | ||
171 | assert(buf); | ||
172 | msg = buf_msg(buf); | 171 | msg = buf_msg(buf); |
173 | 172 | ||
174 | /* Create destination port list, if one wasn't supplied */ | 173 | /* Create destination port list, if one wasn't supplied */ |
@@ -196,7 +195,7 @@ void tipc_port_recv_mcast(struct sk_buff *buf, struct port_list *dp) | |||
196 | struct sk_buff *b = skb_clone(buf, GFP_ATOMIC); | 195 | struct sk_buff *b = skb_clone(buf, GFP_ATOMIC); |
197 | 196 | ||
198 | if (b == NULL) { | 197 | if (b == NULL) { |
199 | warn("Buffer allocation failure\n"); | 198 | warn("Unable to deliver multicast message(s)\n"); |
200 | msg_dbg(msg, "LOST:"); | 199 | msg_dbg(msg, "LOST:"); |
201 | goto exit; | 200 | goto exit; |
202 | } | 201 | } |
@@ -228,14 +227,14 @@ u32 tipc_createport_raw(void *usr_handle, | |||
228 | u32 ref; | 227 | u32 ref; |
229 | 228 | ||
230 | p_ptr = kmalloc(sizeof(*p_ptr), GFP_ATOMIC); | 229 | p_ptr = kmalloc(sizeof(*p_ptr), GFP_ATOMIC); |
231 | if (p_ptr == NULL) { | 230 | if (!p_ptr) { |
232 | warn("Memory squeeze; failed to create port\n"); | 231 | warn("Port creation failed, no memory\n"); |
233 | return 0; | 232 | return 0; |
234 | } | 233 | } |
235 | memset(p_ptr, 0, sizeof(*p_ptr)); | 234 | memset(p_ptr, 0, sizeof(*p_ptr)); |
236 | ref = tipc_ref_acquire(p_ptr, &p_ptr->publ.lock); | 235 | ref = tipc_ref_acquire(p_ptr, &p_ptr->publ.lock); |
237 | if (!ref) { | 236 | if (!ref) { |
238 | warn("Reference Table Exhausted\n"); | 237 | warn("Port creation failed, reference table exhausted\n"); |
239 | kfree(p_ptr); | 238 | kfree(p_ptr); |
240 | return 0; | 239 | return 0; |
241 | } | 240 | } |
@@ -810,18 +809,20 @@ static void port_dispatcher_sigh(void *dummy) | |||
810 | void *usr_handle; | 809 | void *usr_handle; |
811 | int connected; | 810 | int connected; |
812 | int published; | 811 | int published; |
812 | u32 message_type; | ||
813 | 813 | ||
814 | struct sk_buff *next = buf->next; | 814 | struct sk_buff *next = buf->next; |
815 | struct tipc_msg *msg = buf_msg(buf); | 815 | struct tipc_msg *msg = buf_msg(buf); |
816 | u32 dref = msg_destport(msg); | 816 | u32 dref = msg_destport(msg); |
817 | 817 | ||
818 | message_type = msg_type(msg); | ||
819 | if (message_type > TIPC_DIRECT_MSG) | ||
820 | goto reject; /* Unsupported message type */ | ||
821 | |||
818 | p_ptr = tipc_port_lock(dref); | 822 | p_ptr = tipc_port_lock(dref); |
819 | if (!p_ptr) { | 823 | if (!p_ptr) |
820 | /* Port deleted while msg in queue */ | 824 | goto reject; /* Port deleted while msg in queue */ |
821 | tipc_reject_msg(buf, TIPC_ERR_NO_PORT); | 825 | |
822 | buf = next; | ||
823 | continue; | ||
824 | } | ||
825 | orig.ref = msg_origport(msg); | 826 | orig.ref = msg_origport(msg); |
826 | orig.node = msg_orignode(msg); | 827 | orig.node = msg_orignode(msg); |
827 | up_ptr = p_ptr->user_port; | 828 | up_ptr = p_ptr->user_port; |
@@ -832,7 +833,7 @@ static void port_dispatcher_sigh(void *dummy) | |||
832 | if (unlikely(msg_errcode(msg))) | 833 | if (unlikely(msg_errcode(msg))) |
833 | goto err; | 834 | goto err; |
834 | 835 | ||
835 | switch (msg_type(msg)) { | 836 | switch (message_type) { |
836 | 837 | ||
837 | case TIPC_CONN_MSG:{ | 838 | case TIPC_CONN_MSG:{ |
838 | tipc_conn_msg_event cb = up_ptr->conn_msg_cb; | 839 | tipc_conn_msg_event cb = up_ptr->conn_msg_cb; |
@@ -874,6 +875,7 @@ static void port_dispatcher_sigh(void *dummy) | |||
874 | &orig); | 875 | &orig); |
875 | break; | 876 | break; |
876 | } | 877 | } |
878 | case TIPC_MCAST_MSG: | ||
877 | case TIPC_NAMED_MSG:{ | 879 | case TIPC_NAMED_MSG:{ |
878 | tipc_named_msg_event cb = up_ptr->named_msg_cb; | 880 | tipc_named_msg_event cb = up_ptr->named_msg_cb; |
879 | 881 | ||
@@ -886,7 +888,8 @@ static void port_dispatcher_sigh(void *dummy) | |||
886 | goto reject; | 888 | goto reject; |
887 | dseq.type = msg_nametype(msg); | 889 | dseq.type = msg_nametype(msg); |
888 | dseq.lower = msg_nameinst(msg); | 890 | dseq.lower = msg_nameinst(msg); |
889 | dseq.upper = dseq.lower; | 891 | dseq.upper = (message_type == TIPC_NAMED_MSG) |
892 | ? dseq.lower : msg_nameupper(msg); | ||
890 | skb_pull(buf, msg_hdr_sz(msg)); | 893 | skb_pull(buf, msg_hdr_sz(msg)); |
891 | cb(usr_handle, dref, &buf, msg_data(msg), | 894 | cb(usr_handle, dref, &buf, msg_data(msg), |
892 | msg_data_sz(msg), msg_importance(msg), | 895 | msg_data_sz(msg), msg_importance(msg), |
@@ -899,7 +902,7 @@ static void port_dispatcher_sigh(void *dummy) | |||
899 | buf = next; | 902 | buf = next; |
900 | continue; | 903 | continue; |
901 | err: | 904 | err: |
902 | switch (msg_type(msg)) { | 905 | switch (message_type) { |
903 | 906 | ||
904 | case TIPC_CONN_MSG:{ | 907 | case TIPC_CONN_MSG:{ |
905 | tipc_conn_shutdown_event cb = | 908 | tipc_conn_shutdown_event cb = |
@@ -931,6 +934,7 @@ err: | |||
931 | msg_data_sz(msg), msg_errcode(msg), &orig); | 934 | msg_data_sz(msg), msg_errcode(msg), &orig); |
932 | break; | 935 | break; |
933 | } | 936 | } |
937 | case TIPC_MCAST_MSG: | ||
934 | case TIPC_NAMED_MSG:{ | 938 | case TIPC_NAMED_MSG:{ |
935 | tipc_named_msg_err_event cb = | 939 | tipc_named_msg_err_event cb = |
936 | up_ptr->named_err_cb; | 940 | up_ptr->named_err_cb; |
@@ -940,7 +944,8 @@ err: | |||
940 | break; | 944 | break; |
941 | dseq.type = msg_nametype(msg); | 945 | dseq.type = msg_nametype(msg); |
942 | dseq.lower = msg_nameinst(msg); | 946 | dseq.lower = msg_nameinst(msg); |
943 | dseq.upper = dseq.lower; | 947 | dseq.upper = (message_type == TIPC_NAMED_MSG) |
948 | ? dseq.lower : msg_nameupper(msg); | ||
944 | skb_pull(buf, msg_hdr_sz(msg)); | 949 | skb_pull(buf, msg_hdr_sz(msg)); |
945 | cb(usr_handle, dref, &buf, msg_data(msg), | 950 | cb(usr_handle, dref, &buf, msg_data(msg), |
946 | msg_data_sz(msg), msg_errcode(msg), &dseq); | 951 | msg_data_sz(msg), msg_errcode(msg), &dseq); |
@@ -1054,7 +1059,8 @@ int tipc_createport(u32 user_ref, | |||
1054 | u32 ref; | 1059 | u32 ref; |
1055 | 1060 | ||
1056 | up_ptr = (struct user_port *)kmalloc(sizeof(*up_ptr), GFP_ATOMIC); | 1061 | up_ptr = (struct user_port *)kmalloc(sizeof(*up_ptr), GFP_ATOMIC); |
1057 | if (up_ptr == NULL) { | 1062 | if (!up_ptr) { |
1063 | warn("Port creation failed, no memory\n"); | ||
1058 | return -ENOMEM; | 1064 | return -ENOMEM; |
1059 | } | 1065 | } |
1060 | ref = tipc_createport_raw(NULL, port_dispatcher, port_wakeup, importance); | 1066 | ref = tipc_createport_raw(NULL, port_dispatcher, port_wakeup, importance); |
@@ -1165,8 +1171,6 @@ int tipc_withdraw(u32 ref, unsigned int scope, struct tipc_name_seq const *seq) | |||
1165 | p_ptr = tipc_port_lock(ref); | 1171 | p_ptr = tipc_port_lock(ref); |
1166 | if (!p_ptr) | 1172 | if (!p_ptr) |
1167 | return -EINVAL; | 1173 | return -EINVAL; |
1168 | if (!p_ptr->publ.published) | ||
1169 | goto exit; | ||
1170 | if (!seq) { | 1174 | if (!seq) { |
1171 | list_for_each_entry_safe(publ, tpubl, | 1175 | list_for_each_entry_safe(publ, tpubl, |
1172 | &p_ptr->publications, pport_list) { | 1176 | &p_ptr->publications, pport_list) { |
@@ -1193,7 +1197,6 @@ int tipc_withdraw(u32 ref, unsigned int scope, struct tipc_name_seq const *seq) | |||
1193 | } | 1197 | } |
1194 | if (list_empty(&p_ptr->publications)) | 1198 | if (list_empty(&p_ptr->publications)) |
1195 | p_ptr->publ.published = 0; | 1199 | p_ptr->publ.published = 0; |
1196 | exit: | ||
1197 | tipc_port_unlock(p_ptr); | 1200 | tipc_port_unlock(p_ptr); |
1198 | return res; | 1201 | return res; |
1199 | } | 1202 | } |