Преглед изворни кода

dnsmasq: write atomic host file

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 <[email protected]>
Signed-off-by: Hans Dedecker <[email protected]>
Hans Dedecker пре 8 година
родитељ
комит
a39ddff428

+ 1 - 1
package/network/services/dnsmasq/Makefile

@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
 
 
 PKG_NAME:=dnsmasq
 PKG_NAME:=dnsmasq
 PKG_VERSION:=2.78
 PKG_VERSION:=2.78
-PKG_RELEASE:=5
+PKG_RELEASE:=6
 
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
 PKG_SOURCE_URL:=http://thekelleys.org.uk/dnsmasq/
 PKG_SOURCE_URL:=http://thekelleys.org.uk/dnsmasq/

+ 5 - 3
package/network/services/dnsmasq/files/dnsmasq.init

@@ -294,7 +294,7 @@ dhcp_host_add() {
 
 
 	config_get_bool dns "$cfg" dns 0
 	config_get_bool dns "$cfg" dns 0
 	[ "$dns" = "1" -a -n "$ip" -a -n "$name" ] && {
 	[ "$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
 	config_get mac "$cfg" mac
@@ -635,7 +635,7 @@ dhcp_domain_add() {
 		record="${record:+$record }$name"
 		record="${record:+$record }$name"
 	done
 	done
 
 
-	echo "$ip $record" >> $HOSTFILE
+	echo "$ip $record" >> $HOSTFILE_TMP
 }
 }
 
 
 dhcp_srv_add() {
 dhcp_srv_add() {
@@ -741,6 +741,7 @@ dnsmasq_start()
 	CONFIGFILE="${BASECONFIGFILE}.${cfg}"
 	CONFIGFILE="${BASECONFIGFILE}.${cfg}"
 	CONFIGFILE_TMP="${CONFIGFILE}.$$"
 	CONFIGFILE_TMP="${CONFIGFILE}.$$"
 	HOSTFILE="${BASEHOSTFILE}.${cfg}"
 	HOSTFILE="${BASEHOSTFILE}.${cfg}"
+	HOSTFILE_TMP="${HOSTFILE}.$$"
 	BASEDHCPSTAMPFILE_CFG="${BASEDHCPSTAMPFILE}.${cfg}"
 	BASEDHCPSTAMPFILE_CFG="${BASEDHCPSTAMPFILE}.${cfg}"
 
 
 	# before we can call xappend
 	# before we can call xappend
@@ -751,7 +752,7 @@ dnsmasq_start()
 	chown dnsmasq:dnsmasq /var/run/dnsmasq
 	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" > $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"
 	local dnsmasqconffile="/etc/dnsmasq.${cfg}.conf"
 	if [ ! -r "$dnsmasqconffile" ]; then
 	if [ ! -r "$dnsmasqconffile" ]; then
@@ -998,6 +999,7 @@ dnsmasq_start()
 
 
 	echo >> $CONFIGFILE_TMP
 	echo >> $CONFIGFILE_TMP
 	mv -f $CONFIGFILE_TMP $CONFIGFILE
 	mv -f $CONFIGFILE_TMP $CONFIGFILE
+	mv -f $HOSTFILE_TMP $HOSTFILE
 
 
 	[ "$resolvfile" = "/tmp/resolv.conf.auto" ] && {
 	[ "$resolvfile" = "/tmp/resolv.conf.auto" ] && {
 		rm -f /tmp/resolv.conf
 		rm -f /tmp/resolv.conf