X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Flibsystemd-dhcp%2Fdhcp-packet.c;h=1937de4252110106aa7abf1fb2ad7842bed43267;hp=7c209fa658b13022fb927efb713c93628d4c0c97;hb=0a1b6da82109c3b08b1f966a1625a77cc312135a;hpb=06b44be71db4033db8c855491a95f3cf0e7e4595 diff --git a/src/libsystemd-dhcp/dhcp-packet.c b/src/libsystemd-dhcp/dhcp-packet.c index 7c209fa65..1937de425 100644 --- a/src/libsystemd-dhcp/dhcp-packet.c +++ b/src/libsystemd-dhcp/dhcp-packet.c @@ -37,10 +37,11 @@ #define DHCP_CLIENT_MIN_OPTIONS_SIZE 312 int dhcp_message_init(DHCPMessage *message, uint8_t op, uint32_t xid, - uint8_t type, uint16_t secs, uint8_t **opt, - size_t *optlen) { + uint8_t type, uint8_t **opt, size_t *optlen) { int err; + assert(op == BOOTREQUEST || op == BOOTREPLY); + *opt = (uint8_t *)(message + 1); if (*optlen < 4) @@ -52,10 +53,6 @@ int dhcp_message_init(DHCPMessage *message, uint8_t op, uint32_t xid, message->hlen = ETHER_ADDR_LEN; message->xid = htobe32(xid); - /* Although 'secs' field is a SHOULD in RFC 2131, certain DHCP servers - refuse to issue an DHCP lease if 'secs' is set to zero */ - message->secs = htobe16(secs); - (*opt)[0] = 0x63; (*opt)[1] = 0x82; (*opt)[2] = 0x53; @@ -119,6 +116,8 @@ void dhcp_packet_append_ip_headers(DHCPPacket *packet, uint16_t len) { int dhcp_packet_verify_headers(DHCPPacket *packet, size_t len) { size_t hdrlen; + assert(packet); + /* IP */ if (len < DHCP_IP_SIZE) { @@ -162,7 +161,7 @@ int dhcp_packet_verify_headers(DHCPPacket *packet, size_t len) { return -EINVAL; } - if (hdrlen + be16toh(packet->udp.len) > len) { + if (len < hdrlen + be16toh(packet->udp.len)) { log_dhcp_client(client, "ignoring packet: packet (%zu bytes) " "smaller than expected (%zu) by UDP header", len, hdrlen + be16toh(packet->udp.len)); @@ -180,10 +179,10 @@ int dhcp_packet_verify_headers(DHCPPacket *packet, size_t len) { } } - if (be16toh(packet->udp.source) != DHCP_PORT_SERVER || - be16toh(packet->udp.dest) != DHCP_PORT_CLIENT) { - log_dhcp_client(client, "ignoring packet: wrong ports (source: %u, destination: %u)", - be16toh(packet->udp.source), be16toh(packet->udp.dest)); + if (be16toh(packet->udp.dest) != DHCP_PORT_CLIENT) { + log_dhcp_client(client, "ignoring packet: to port %u, which " + "is not the DHCP client port (%u)", + be16toh(packet->udp.dest), DHCP_PORT_CLIENT); return -EINVAL; }