mwan3: fix race condition on mwan3 restart
authorFlorian Eckert <fe@dev.tdt.de>
Wed, 22 Jul 2020 07:19:55 +0000 (09:19 +0200)
committerFlorian Eckert <fe@dev.tdt.de>
Tue, 28 Jul 2020 04:53:24 +0000 (06:53 +0200)
This adjustment of the locks fixes the race condition when a mwan3
hotplug script and a mwan3 command are running at the same time.

Signed-off-by: Florian Eckert <fe@dev.tdt.de>
net/mwan3/files/etc/hotplug.d/iface/15-mwan3
net/mwan3/files/etc/hotplug.d/iface/16-mwan3
net/mwan3/files/etc/hotplug.d/iface/16-mwan3-user
net/mwan3/files/usr/sbin/mwan3

index 5bfbd24624ad21ba28570c518576800f020d226e..db2dc237a94147d6a381124d56073b9b7f14ed95 100644 (file)
@@ -12,19 +12,24 @@ if [ "$ACTION" == "ifup" ]; then
         [ -n "$DEVICE" ] || exit 3
 fi
 
+mwan3_lock "$ACTION" "$INTERFACE"
 config_load mwan3
 config_get_bool enabled globals 'enabled' '0'
-[ ${enabled} -gt 0 ] || exit 0
+[ ${enabled} -gt 0 ] || {
+       mwan3_unlock "$ACTION" "$INTERFACE"
+       exit 0
+}
 
-mwan3_lock "$ACTION" "$INTERFACE"
 mwan3_init
 mwan3_set_connected_iptables
 mwan3_set_custom_ipset
-mwan3_unlock "$ACTION" "$INTERFACE"
 
 config_get enabled $INTERFACE enabled 0
 config_get initial_state $INTERFACE initial_state "online"
-[ "$enabled" == "1" ] || exit 0
+[ "${enabled}" == "1" ] || {
+       mwan3_unlock "$ACTION" "$INTERFACE"
+       exit 0
+}
 
 if [ "$ACTION" == "ifup" ]; then
        config_get family $INTERFACE family ipv4
@@ -58,7 +63,6 @@ else
        running=1
 fi
 
-mwan3_lock "$ACTION" "$INTERFACE"
 $LOG notice "Execute "$ACTION" event on interface $INTERFACE (${DEVICE:-unknown})"
 
 case "$ACTION" in
index c243d55ff8e0b6c63b517858c39cd496b77f583a..d68401fedc91030a2fdad0bbbad1250d6cd5485b 100644 (file)
@@ -4,14 +4,17 @@
 . /lib/functions/network.sh
 . /lib/mwan3/mwan3.sh
 
+mwan3_lock "$ACTION" "mwan3rtmon"
+
 config_load mwan3
 config_get_bool enabled globals 'enabled' '0'
-[ ${enabled} -gt 0 ] || exit 0
+[ ${enabled} -gt 0 ] || {
+       mwan3_unlock "$ACTION" "mwan3rtmon"
+       exit 0
+}
 
 if [ "$ACTION" == "ifup" ]; then
-       mwan3_lock "$ACTION" "mwan3rtmon"
        mwan3_rtmon
-       mwan3_unlock "$ACTION" "mwan3rtmon"
 fi
 
 config_get enabled $INTERFACE enabled 0
@@ -19,4 +22,6 @@ config_get enabled $INTERFACE enabled 0
        mwan3_flush_conntrack "$INTERFACE" "$ACTION"
 }
 
+mwan3_unlock "$ACTION" "mwan3rtmon"
+
 exit 0
index 9372c736e100607f9411eb327ff47e7ef7d3d14e..ef490e183303f406f0fd16de884ae251333d250b 100644 (file)
@@ -2,13 +2,25 @@
 
 [ -f "/etc/mwan3.user" ] && {
        . /lib/functions.sh
+       . /lib/mwan3/mwan3.sh
+
+       mwan3_lock "$ACTION" "user"
 
        config_load mwan3
        config_get_bool enabled globals 'enabled' '0'
-       [ ${enabled} -gt 0 ] || exit 0
+       [ ${enabled} -gt 0 ] || {
+               mwan3_unlock "$ACTION" "user"
+               exit 0
+       }
 
        config_get enabled "$INTERFACE" enabled 0
-       [ "${enabled}" = "1" ] || exit 0
+       [ "${enabled}" = "1" ] || {
+               mwan3_unlock "$ACTION" "user"
+               exit 0
+       }
+
+       mwan3_unlock "$ACTION" "user"
+
        env -i ACTION="$ACTION" INTERFACE="$INTERFACE" DEVICE="$DEVICE" \
                /bin/sh /etc/mwan3.user
 }
index b9a5afb9e471b8bb89fdf843de39aea04ea4b484..dc65279bec02c05105c29b028e46057bf878f53a 100755 (executable)
@@ -45,30 +45,39 @@ ifup()
 {
        local device enabled up l3_device status
 
+       mwan3_lock "command" "mwan3"
+
        config_load mwan3
        config_get_bool enabled globals 'enabled' 0
+
        [ ${enabled} -gt 0 ] || {
                echo "The service mwan3 is global disabled."
                echo "Please execute \"/etc/init.d/mwan3 start\" first."
+               mwan3_unlock "command" "mwan3"
                exit 1
        }
 
        if [ -z "$1" ]; then
-               echo "Expecting interface. Usage: mwan3 ifup <interface>" && exit 0
+               echo "Expecting interface. Usage: mwan3 ifup <interface>"
+               mwan3_unlock "command" "mwan3"
+               exit 0
        fi
 
        if [ -n "$2" ]; then
-               echo "Too many arguments. Usage: mwan3 ifup <interface>" && exit 0
+               echo "Too many arguments. Usage: mwan3 ifup <interface>"
+               mwan3_unlock "command" "mwan3"
+               exit 0
        fi
 
+       config_get enabled "$1" enabled 0
+       mwan3_unlock "command" "mwan3"
+
        status=$(ubus -S call network.interface.$1 status)
        [ -n "$status" ] && {
                json_load "$status"
                json_get_vars up l3_device
        }
 
-       config_get enabled "$1" enabled 0
-
        if [ "$up" = "1" ] \
                && [ -n "$l3_device" ] \
                && [ "$enabled" = "1" ]; then
@@ -130,7 +139,9 @@ start()
 {
        local enabled
 
+       mwan3_lock "command" "mwan3"
        uci_toggle_state mwan3 globals enabled "1"
+       mwan3_unlock "command" "mwan3"
 
        config_load mwan3
        config_foreach ifup interface
@@ -141,6 +152,7 @@ stop()
        local ipset route rule table IP IPT pid
 
        mwan3_lock "command" "mwan3"
+       uci_toggle_state mwan3 globals enabled "0"
 
        for pid in $(pgrep -f "mwan3rtmon"); do
                kill -TERM "$pid" > /dev/null 2>&1
@@ -200,8 +212,6 @@ stop()
 
        mwan3_lock_clean
        rm -rf $MWAN3_STATUS_DIR $MWAN3TRACK_STATUS_DIR
-
-       uci_toggle_state mwan3 globals enabled "0"
 }
 
 restart() {