diff -Naurp dhcp-4.1.2-P1/common/discover.c dhcp-4.1.2-P1.oden/common/discover.c --- dhcp-4.1.2-P1/common/discover.c 2011-08-18 09:32:19.000000000 +0000 +++ dhcp-4.1.2-P1.oden/common/discover.c 2011-08-18 09:31:26.000000000 +0000 @@ -1383,12 +1383,16 @@ isc_result_t got_one (h) if (result == 0) return ISC_R_UNEXPECTED; - /* If we didn't at least get the fixed portion of the BOOTP - packet, drop the packet. We're allowing packets with no - sname or filename, because we're aware of at least one - client that sends such packets, but this definitely falls - into the category of being forgiving. */ - if (result < DHCP_FIXED_NON_UDP - DHCP_SNAME_LEN - DHCP_FILE_LEN) + /* + * If we didn't at least get the fixed portion of the BOOTP + * packet, drop the packet. + * Previously we allowed packets with no sname or filename + * as we were aware of at least one client that did. But + * a bug caused short packets to not work and nobody has + * complained, it seems rational to tighten up that + * restriction. + */ + if (result < DHCP_FIXED_NON_UDP) return ISC_R_UNEXPECTED; if (bootp_packet_handler) { diff -Naurp dhcp-4.1.2-P1/common/options.c dhcp-4.1.2-P1.oden/common/options.c --- dhcp-4.1.2-P1/common/options.c 2011-08-18 09:32:19.000000000 +0000 +++ dhcp-4.1.2-P1.oden/common/options.c 2011-08-18 09:31:26.000000000 +0000 @@ -592,8 +592,8 @@ cons_options(struct packet *inpacket, st } else if (bootpp) { mb_size = 64; if (inpacket != NULL && - (inpacket->packet_length - DHCP_FIXED_LEN >= 64)) - mb_size = inpacket->packet_length - DHCP_FIXED_LEN; + (inpacket->packet_length >= 64 + DHCP_FIXED_NON_UDP)) + mb_size = inpacket->packet_length - DHCP_FIXED_NON_UDP; } else mb_size = DHCP_MIN_OPTION_LEN; diff -Naurp dhcp-4.1.2-P1/server/dhcp.c dhcp-4.1.2-P1.oden/server/dhcp.c --- dhcp-4.1.2-P1/server/dhcp.c 2010-09-16 23:16:46.000000000 +0000 +++ dhcp-4.1.2-P1.oden/server/dhcp.c 2011-08-18 09:31:26.000000000 +0000 @@ -1541,6 +1541,7 @@ void ack_lease (packet, lease, offer, wh * by the user into the new state, not just give up. */ if (!packet->agent_options_stashed && + (packet->options != NULL) && packet->options->universe_count > agent_universe.index && packet->options->universes[agent_universe.index] != NULL && (state->options->universe_count <= agent_universe.index || @@ -2346,6 +2347,7 @@ void ack_lease (packet, lease, offer, wh * giaddr. */ if (!packet->agent_options_stashed && + (packet->options != NULL) && packet->options->universe_count > agent_universe.index && packet->options->universes[agent_universe.index] != NULL) { oc = lookup_option (&server_universe, state -> options,