From: Roy Marples Date: Sun, 21 Oct 2007 19:15:23 +0000 (+0000) Subject: Add warnings about requesting a link local address. X-Git-Tag: v3.2.3~180 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ed604a709b499f5ca3129e95d90168c1465e8bc5;p=thirdparty%2Fdhcpcd.git Add warnings about requesting a link local address. --- diff --git a/ChangeLog b/ChangeLog index e7a543af..4ff01af5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,4 @@ +Add warnings about requesting a link local address. Always add a link-local route unless we're given a non-private address by the DHCP server. Reduce stack usage by using malloc more. diff --git a/client.c b/client.c index 7c4deb3d..549a6735 100644 --- a/client.c +++ b/client.c @@ -284,6 +284,11 @@ int dhcp_run (const options_t *options, int *pidfd) return (-1); } + if (! options->daemonised && IN_LINKLOCAL (dhcp->address.s_addr)) { + logger (LOG_ERR, "cannot request a link local address"); + return (-1); + } + #ifdef THERE_IS_NO_FORK if (options->daemonised) { state = STATE_BOUND; diff --git a/dhcp.c b/dhcp.c index 94e5510f..cc6e89b9 100644 --- a/dhcp.c +++ b/dhcp.c @@ -87,9 +87,10 @@ size_t send_message (const interface_t *iface, const dhcp_t *dhcp, m = (unsigned char *) message; p = (unsigned char *) &message->options; - if (type == DHCP_INFORM || + if ((type == DHCP_INFORM || type == DHCP_RELEASE || - type == DHCP_REQUEST) + type == DHCP_REQUEST) && + ! IN_LINKLOCAL (iface->previous_address.s_addr)) { message->ciaddr = iface->previous_address.s_addr; from.s_addr = iface->previous_address.s_addr; @@ -154,13 +155,17 @@ size_t send_message (const interface_t *iface, const dhcp_t *dhcp, memcpy (p, &_val.s_addr, 4); \ p += 4; \ } - if (dhcp->address.s_addr != iface->previous_address.s_addr && - type != DHCP_RELEASE) - PUTADDR (DHCP_ADDRESS, dhcp->address); + if (IN_LINKLOCAL (dhcp->address.s_addr)) + logger (LOG_ERR, "cannot request a link local address"); + else { + if (dhcp->address.s_addr != iface->previous_address.s_addr && + type != DHCP_RELEASE) + PUTADDR (DHCP_ADDRESS, dhcp->address); - if (dhcp->serveraddress.s_addr != 0 && dhcp->address.s_addr !=0 && - (iface->previous_address.s_addr == 0 || type == DHCP_RELEASE)) - PUTADDR (DHCP_SERVERIDENTIFIER, dhcp->serveraddress); + if (dhcp->serveraddress.s_addr != 0 && dhcp->address.s_addr !=0 && + (iface->previous_address.s_addr == 0 || type == DHCP_RELEASE)) + PUTADDR (DHCP_SERVERIDENTIFIER, dhcp->serveraddress); + } #undef PUTADDR } diff --git a/dhcpcd.c b/dhcpcd.c index ac4de084..e053bf2c 100644 --- a/dhcpcd.c +++ b/dhcpcd.c @@ -130,8 +130,9 @@ static pid_t read_pid (const char *pidfile) static void usage () { printf ("usage: "PACKAGE" [-adknpEGHMNRTY] [-c script] [-h hostame] [-i classID]\n" - " [-l leasetime] [-m metric] [-s ipaddress] [-t timeout]\n" - " [-u userclass] [-F none | ptr | both] [-I clientID]\n"); + " [-l leasetime] [-m metric] [-r ipaddress] [-s ipaddress]\n" + " [-t timeout] [-u userclass] [-F none | ptr | both]\n" + " [-I clientID] \n"); } int main(int argc, char **argv) @@ -442,6 +443,11 @@ int main(int argc, char **argv) options->keep_address = true; } + if (IN_LINKLOCAL (options->request_address.s_addr)) { + logger (LOG_ERR, "you are not allowed to request a link local address"); + exit (EXIT_FAILURE); + } + if (geteuid ()) { logger (LOG_ERR, "you need to be root to run "PACKAGE); exit (EXIT_FAILURE);