+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.
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;
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;
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
}
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] <interface>\n");
}
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);