hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/net/qrtr/ns.c
....@@ -83,7 +83,10 @@
8383
8484 node->id = node_id;
8585
86
- radix_tree_insert(&nodes, node_id, node);
86
+ if (radix_tree_insert(&nodes, node_id, node)) {
87
+ kfree(node);
88
+ return NULL;
89
+ }
8790
8891 return node;
8992 }
....@@ -270,7 +273,7 @@
270273 return NULL;
271274 }
272275
273
-static int server_del(struct qrtr_node *node, unsigned int port)
276
+static int server_del(struct qrtr_node *node, unsigned int port, bool bcast)
274277 {
275278 struct qrtr_lookup *lookup;
276279 struct qrtr_server *srv;
....@@ -283,7 +286,7 @@
283286 radix_tree_delete(&node->servers, port);
284287
285288 /* Broadcast the removal of local servers */
286
- if (srv->node == qrtr_ns.local_node)
289
+ if (srv->node == qrtr_ns.local_node && bcast)
287290 service_announce_del(&qrtr_ns.bcast_sq, srv);
288291
289292 /* Announce the service's disappearance to observers */
....@@ -369,7 +372,7 @@
369372 }
370373 slot = radix_tree_iter_resume(slot, &iter);
371374 rcu_read_unlock();
372
- server_del(node, srv->port);
375
+ server_del(node, srv->port, true);
373376 rcu_read_lock();
374377 }
375378 rcu_read_unlock();
....@@ -455,10 +458,13 @@
455458 kfree(lookup);
456459 }
457460
458
- /* Remove the server belonging to this port */
461
+ /* Remove the server belonging to this port but don't broadcast
462
+ * DEL_SERVER. Neighbours would've already removed the server belonging
463
+ * to this port due to the DEL_CLIENT broadcast from qrtr_port_remove().
464
+ */
459465 node = node_get(node_id);
460466 if (node)
461
- server_del(node, port);
467
+ server_del(node, port, false);
462468
463469 /* Advertise the removal of this client to all local servers */
464470 local_node = node_get(qrtr_ns.local_node);
....@@ -571,7 +577,7 @@
571577 if (!node)
572578 return -ENOENT;
573579
574
- return server_del(node, port);
580
+ return server_del(node, port, true);
575581 }
576582
577583 static int ctrl_cmd_new_lookup(struct sockaddr_qrtr *from,