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 <e9hack@gmail.com>
Signed-off-by: Hans Dedecker <dedeckeh@gmail.com>
openwrt-18.06
Hans Dedecker 2017-12-07 10:11:50 +01:00
parent 94fcd92913
commit a39ddff428
2 changed files with 6 additions and 4 deletions

View File

@ -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/

View File

@ -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