[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