dnsmasq: write atomic host file
authorHans Dedecker <dedeckeh@gmail.com>
Thu, 7 Dec 2017 09:11:50 +0000 (10:11 +0100)
committerHans Dedecker <dedeckeh@gmail.com>
Thu, 7 Dec 2017 09:59:03 +0000 (10:59 +0100)
Different invocations of the dnsmasq init script (e.g. at startup by procd)
will rewrite the dhcp host file which might result into dnsmasq reading an
empty dhcp host file as it is being rewritten by the dnsmasq init script.
Let the dnsmasq init script first write to a temp dhcp host file so it does
not overwrite the contents of the existing dhcp host file.

Reported-by: Hartmut Birr <e9hack@gmail.com>
Signed-off-by: Hans Dedecker <dedeckeh@gmail.com>
package/network/services/dnsmasq/Makefile
package/network/services/dnsmasq/files/dnsmasq.init

index 480a8a9f487b893406d14d334d6424c640e92311..59beb98a56aac0a92faf1c2add312caf5765295a 100644 (file)
@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=dnsmasq
 PKG_VERSION:=2.78
-PKG_RELEASE:=5
+PKG_RELEASE:=6
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
 PKG_SOURCE_URL:=http://thekelleys.org.uk/dnsmasq/
index 8c40f3b59adb06764c8a500955d916b4e79e1288..b84f531ac0e2edfda5eb3ba6d39f059bdb060148 100644 (file)
@@ -294,7 +294,7 @@ dhcp_host_add() {
 
        config_get_bool dns "$cfg" dns 0
        [ "$dns" = "1" -a -n "$ip" -a -n "$name" ] && {
-               echo "$ip $name${DOMAIN:+.$DOMAIN}" >> $HOSTFILE
+               echo "$ip $name${DOMAIN:+.$DOMAIN}" >> $HOSTFILE_TMP
        }
 
        config_get mac "$cfg" mac
@@ -635,7 +635,7 @@ dhcp_domain_add() {
                record="${record:+$record }$name"
        done
 
-       echo "$ip $record" >> $HOSTFILE
+       echo "$ip $record" >> $HOSTFILE_TMP
 }
 
 dhcp_srv_add() {
@@ -741,6 +741,7 @@ dnsmasq_start()
        CONFIGFILE="${BASECONFIGFILE}.${cfg}"
        CONFIGFILE_TMP="${CONFIGFILE}.$$"
        HOSTFILE="${BASEHOSTFILE}.${cfg}"
+       HOSTFILE_TMP="${HOSTFILE}.$$"
        BASEDHCPSTAMPFILE_CFG="${BASEDHCPSTAMPFILE}.${cfg}"
 
        # before we can call xappend
@@ -751,7 +752,7 @@ dnsmasq_start()
        chown dnsmasq:dnsmasq /var/run/dnsmasq
 
        echo "# auto-generated config file from /etc/config/dhcp" > $CONFIGFILE_TMP
-       echo "# auto-generated config file from /etc/config/dhcp" > $HOSTFILE
+       echo "# auto-generated config file from /etc/config/dhcp" > $HOSTFILE_TMP
 
        local dnsmasqconffile="/etc/dnsmasq.${cfg}.conf"
        if [ ! -r "$dnsmasqconffile" ]; then
@@ -998,6 +999,7 @@ dnsmasq_start()
 
        echo >> $CONFIGFILE_TMP
        mv -f $CONFIGFILE_TMP $CONFIGFILE
+       mv -f $HOSTFILE_TMP $HOSTFILE
 
        [ "$resolvfile" = "/tmp/resolv.conf.auto" ] && {
                rm -f /tmp/resolv.conf