aboutsummaryrefslogtreecommitdiffstats
path: root/net/tipc/port.c
diff options
context:
space:
mode:
authorAllan Stephens <allan.stephens@windriver.com>2012-04-17 18:22:49 -0400
committerPaul Gortmaker <paul.gortmaker@windriver.com>2012-04-19 15:46:42 -0400
commitf21536d1e73c36b37c50f71013c67f19db77d4b8 (patch)
treeaefaeb429a611ae8a5489956e4004cdf09379416 /net/tipc/port.c
parent5eb0a291fbde1842b8e3f241183a0e2c1399c600 (diff)
tipc: Ensure network address change doesn't impact new port
Re-orders port creation logic so that the initialization of a new port's message header template occurs while the port list lock is held. This ensures that a change to the node's network address that occurs at the same time as the port is being created does not result in the template identifying the sender using the former network address. The new approach guarantees that the new port's template is using the current network address or that it will be updated when the address changes. Signed-off-by: Allan Stephens <allan.stephens@windriver.com> Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com>
Diffstat (limited to 'net/tipc/port.c')
-rw-r--r--net/tipc/port.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/net/tipc/port.c b/net/tipc/port.c
index 6156c6740f67..3b7162c1f074 100644
--- a/net/tipc/port.c
+++ b/net/tipc/port.c
@@ -221,18 +221,25 @@ struct tipc_port *tipc_createport_raw(void *usr_handle,
221 p_ptr->usr_handle = usr_handle; 221 p_ptr->usr_handle = usr_handle;
222 p_ptr->max_pkt = MAX_PKT_DEFAULT; 222 p_ptr->max_pkt = MAX_PKT_DEFAULT;
223 p_ptr->ref = ref; 223 p_ptr->ref = ref;
224 msg = &p_ptr->phdr;
225 tipc_msg_init(msg, importance, TIPC_NAMED_MSG, NAMED_H_SIZE, 0);
226 msg_set_origport(msg, ref);
227 INIT_LIST_HEAD(&p_ptr->wait_list); 224 INIT_LIST_HEAD(&p_ptr->wait_list);
228 INIT_LIST_HEAD(&p_ptr->subscription.nodesub_list); 225 INIT_LIST_HEAD(&p_ptr->subscription.nodesub_list);
229 p_ptr->dispatcher = dispatcher; 226 p_ptr->dispatcher = dispatcher;
230 p_ptr->wakeup = wakeup; 227 p_ptr->wakeup = wakeup;
231 p_ptr->user_port = NULL; 228 p_ptr->user_port = NULL;
232 k_init_timer(&p_ptr->timer, (Handler)port_timeout, ref); 229 k_init_timer(&p_ptr->timer, (Handler)port_timeout, ref);
233 spin_lock_bh(&tipc_port_list_lock);
234 INIT_LIST_HEAD(&p_ptr->publications); 230 INIT_LIST_HEAD(&p_ptr->publications);
235 INIT_LIST_HEAD(&p_ptr->port_list); 231 INIT_LIST_HEAD(&p_ptr->port_list);
232
233 /*
234 * Must hold port list lock while initializing message header template
235 * to ensure a change to node's own network address doesn't result
236 * in template containing out-dated network address information
237 */
238
239 spin_lock_bh(&tipc_port_list_lock);
240 msg = &p_ptr->phdr;
241 tipc_msg_init(msg, importance, TIPC_NAMED_MSG, NAMED_H_SIZE, 0);
242 msg_set_origport(msg, ref);
236 list_add_tail(&p_ptr->port_list, &ports); 243 list_add_tail(&p_ptr->port_list, &ports);
237 spin_unlock_bh(&tipc_port_list_lock); 244 spin_unlock_bh(&tipc_port_list_lock);
238 return p_ptr; 245 return p_ptr;