[Buildroot] Bug report

王琦 wangwangqi2011 at gmail.com
Mon Aug 16 03:43:03 UTC 2021


*Summary*: udhcpc.script file cannot assign a right action to hook files
*Description*:
When passing `bound` or `renew` parameter to udhcpc.script, these
parameters are wiped out before hooking files with them. So an empty string
passed to these hooked files, which failed to configure some necessary
parameters.

Following are some detailed info:

Version of Buildroot: 2021.02.2
Version of Busybox: 1.33.0

File Location: package/busybox/udhcpc.script

Description: The DHCP action is empty after the 'deconfig'. Actually, it
should be 'bound'(or 'renew'). As a result, the hook operation at the end
of this script will not pass the right parameters to the relevant files.

Cause: When the condition of Line.67 is true, then Line.75 will change
'$@', after the Line.78 shifts all the parameters, the '$@' becomes empty.
At last, an empty '$@' is passed to the hook operation, which will cause
problems.

Fix: At first, store the '$@' to a variable and at last, use the variable
instead of '$@' to get the action parameter.

Serial Logs from GCP:
Starting network: udhcpc: started, v1.33.0
DHCP action="deconfig" with variables
udhcpc: sending discover
udhcpc: sending select for **.**.**.**
udhcpc: lease of **.**.**.** obtained, lease time *****
deleting routers
route: SIOCADDRT: Invalid argument
adding dns **.**.**.**
DHCP action="" with variables
OK

>From the above log, we can see obviously that the DHCP action is an empty
string, which should be 'bound' or 'renew'.

And I've attached the busybox.config and my fix for reference, thanks~
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.busybox.net/pipermail/buildroot/attachments/20210816/28a6c02f/attachment.html>
-------------- next part --------------
#!/bin/sh

# udhcpc script edited by Tim Riker <Tim at Rikers.org>

[ -z "$1" ] && echo "Error: should be called from udhcpc" && exit 1

action=$@
RESOLV_CONF="/etc/resolv.conf"
[ -e $RESOLV_CONF ] || touch $RESOLV_CONF
[ -n "$broadcast" ] && BROADCAST="broadcast $broadcast"
[ -n "$subnet" ] && NETMASK="netmask $subnet"
# Handle stateful DHCPv6 like DHCPv4
[ -n "$ipv6" ] && ip="$ipv6/128"

if [ -z "${IF_WAIT_DELAY}" ]; then
	IF_WAIT_DELAY=10
fi

wait_for_ipv6_default_route() {
	printf "Waiting for IPv6 default route to appear"
	while [ $IF_WAIT_DELAY -gt 0 ]; do
		if ip -6 route list | grep -q default; then
			printf "\n"
			return
		fi
		sleep 1
		printf "."
		: $((IF_WAIT_DELAY -= 1))
	done
	printf " timeout!\n"
}

case "$1" in
	deconfig)
		/sbin/ifconfig $interface up
		/sbin/ifconfig $interface 0.0.0.0

		# drop info from this interface
		# resolv.conf may be a symlink to /tmp/, so take care
		TMPFILE=$(mktemp)
		grep -vE "# $interface\$" $RESOLV_CONF > $TMPFILE
		cat $TMPFILE > $RESOLV_CONF
		rm -f $TMPFILE

		if [ -x /usr/sbin/avahi-autoipd ]; then
			/usr/sbin/avahi-autoipd -c $interface && /usr/sbin/avahi-autoipd -k $interface
		fi
		;;

	leasefail|nak)
		if [ -x /usr/sbin/avahi-autoipd ]; then
			/usr/sbin/avahi-autoipd -c $interface || /usr/sbin/avahi-autoipd -wD $interface --no-chroot
		fi
		;;

	renew|bound)
		if [ -x /usr/sbin/avahi-autoipd ]; then
			/usr/sbin/avahi-autoipd -c $interface && /usr/sbin/avahi-autoipd -k $interface
		fi
		/sbin/ifconfig $interface $ip $BROADCAST $NETMASK
		if [ -n "$ipv6" ] ; then
			wait_for_ipv6_default_route
		fi

		# RFC3442: If the DHCP server returns both a Classless
		# Static Routes option and a Router option, the DHCP
		# client MUST ignore the Router option.
		if [ -n "$staticroutes" ]; then
			echo "deleting routers"
			route -n | while read dest gw mask flags metric ref use iface; do
				[ "$iface" != "$interface" -o "$gw" = "0.0.0.0" ] || \
					route del -net "$dest" netmask "$mask" gw "$gw" dev "$interface"
			done

			# format: dest1/mask gw1 ... destn/mask gwn
			set -- $staticroutes
			while [ -n "$1" -a -n "$2" ]; do
				route add -net "$1" gw "$2" dev "$interface"
				shift 2
			done
		elif [ -n "$router" ] ; then
			echo "deleting routers"
			while route del default gw 0.0.0.0 dev $interface 2> /dev/null; do
				:
			done

			for i in $router ; do
				route add default gw $i dev $interface
			done
		fi

		# drop info from this interface
		# resolv.conf may be a symlink to /tmp/, so take care
		TMPFILE=$(mktemp)
		grep -vE "# $interface\$" $RESOLV_CONF > $TMPFILE
		cat $TMPFILE > $RESOLV_CONF
		rm -f $TMPFILE

		# prefer rfc3397 domain search list (option 119) if available
		if [ -n "$search" ]; then
			search_list=$search
		elif [ -n "$domain" ]; then
			search_list=$domain
		fi

		[ -n "$search_list" ] &&
			echo "search $search_list # $interface" >> $RESOLV_CONF

		for i in $dns ; do
			echo adding dns $i
			echo "nameserver $i # $interface" >> $RESOLV_CONF
		done
		;;
esac

HOOK_DIR="$0.d"
for hook in "${HOOK_DIR}/"*; do
    [ -f "${hook}" -a -x "${hook}" ] || continue
    "${hook}" "$action"
done

exit 0
-------------- next part --------------
A non-text attachment was scrubbed...
Name: busybox.config
Type: application/octet-stream
Size: 33419 bytes
Desc: not available
URL: <http://lists.busybox.net/pipermail/buildroot/attachments/20210816/28a6c02f/attachment.obj>


More information about the buildroot mailing list