[OpenWrt-Devel] [PATCH 1/3] netifd: Fix possible hotplug race conditions

Hans Dedecker dedeckeh at gmail.com
Thu Feb 12 11:41:15 EST 2015


Don't drop ifup/ifdown events in case an interface event is cached
as it leads to possible race conditions (eg firewall not being
reloaded as ifup is dropped) when multiple interface events are fired
in a short timeframe (eg multiple PPP link flaps).
Always overwrite the cached interface event except for the
interface update event so the hotplug scripts are launched
with the last known status.

Signed-off-by: Hans Dedecker <dedeckeh at gmail.com>
---
 interface-event.c | 19 ++++---------------
 1 file changed, 4 insertions(+), 15 deletions(-)

diff --git a/interface-event.c b/interface-event.c
index 24af8f5..cfbc15c 100644
--- a/interface-event.c
+++ b/interface-event.c
@@ -120,22 +120,11 @@ interface_queue_event(struct interface *iface, enum interface_event ev)
 	if (current == iface) {
 		/* an event for iface is being processed */
 		if (!list_empty(&iface->hotplug_list)) {
-			/* an additional event for iface is pending */
-			if ((ev != current_ev || ev == IFEV_UPDATE) &&
-			!(iface->hotplug_ev == IFEV_UP && ev == IFEV_UPDATE)) {
-				/* if incoming event is different from the one
-				 * being handled or if it is an update,
-				 * overwrite pending event, but never
-				 * overwrite an ifup with an ifupdate */
+			/* an additional event for iface is pending   */
+			/* overwrite pending event if it differs from */
+			/* an update                                  */
+			if (ev != IFEV_UPDATE)
 				iface->hotplug_ev = ev;
-			}
-			else if (ev == current_ev && ev != IFEV_UPDATE) {
-				/* if incoming event is not an ifupdate
-				 * and is the same as the one that is
-				 * being handled, remove it from the
-				 * pending list */
-				list_del_init(&iface->hotplug_list);
-			}
 		}
 		else {
 			/* no additional event for iface is pending */
-- 
1.9.1
_______________________________________________
openwrt-devel mailing list
openwrt-devel at lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel



More information about the openwrt-devel mailing list