tipc: properly handle off-node send requests with invalid addr
authorAllan Stephens <allan.stephens@windriver.com>
Wed, 18 Apr 2012 13:22:56 +0000 (09:22 -0400)
committerPaul Gortmaker <paul.gortmaker@windriver.com>
Thu, 19 Apr 2012 19:46:47 +0000 (15:46 -0400)
There are two send routines that might conceivably be asked by an
application to send a message off-node when the node is still using
the default network address.  These now have an added check that
detects this and rejects the message gracefully.

Signed-off-by: Allan Stephens <allan.stephens@windriver.com>
Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com>
net/tipc/port.c

index 616c72f..dc7f916 100644 (file)
@@ -1270,10 +1270,14 @@ int tipc_send2name(u32 ref, struct tipc_name const *name, unsigned int domain,
                if (likely(destnode == tipc_own_addr))
                        res = tipc_port_recv_sections(p_ptr, num_sect,
                                                      msg_sect, total_len);
-               else
+               else if (tipc_own_addr)
                        res = tipc_link_send_sections_fast(p_ptr, msg_sect,
                                                           num_sect, total_len,
                                                           destnode);
+               else
+                       res = tipc_port_reject_sections(p_ptr, msg, msg_sect,
+                                                       num_sect, total_len,
+                                                       TIPC_ERR_NO_NODE);
                if (likely(res != -ELINKCONG)) {
                        if (res > 0)
                                p_ptr->sent++;
@@ -1314,9 +1318,12 @@ int tipc_send2port(u32 ref, struct tipc_portid const *dest,
        if (dest->node == tipc_own_addr)
                res =  tipc_port_recv_sections(p_ptr, num_sect, msg_sect,
                                               total_len);
-       else
+       else if (tipc_own_addr)
                res = tipc_link_send_sections_fast(p_ptr, msg_sect, num_sect,
                                                   total_len, dest->node);
+       else
+               res = tipc_port_reject_sections(p_ptr, msg, msg_sect, num_sect,
+                                               total_len, TIPC_ERR_NO_NODE);
        if (likely(res != -ELINKCONG)) {
                if (res > 0)
                        p_ptr->sent++;