[systemd-devel] [PATCH 21/28] dhcp: Handle received DHCP Offer message
Lennart Poettering
lennart at poettering.net
Wed Nov 13 16:38:12 PST 2013
On Wed, 13.11.13 23:22, Patrik Flykt (patrik.flykt at linux.intel.com) wrote:
> + if (client->fd > 0)
> + close(client->fd);
> + client->fd = 0;
fd 0 is a valid fd (actually refers to stdin), I am pretty sure you want
to assign -1 here, no?
> + if (hdrlen + ntohs(offer->udp.len) > len ||
> + client_checksum(&offer->ip.ttl, ntohs(offer->udp.len) + 12))
> + return -EINVAL;
Hmm, so it might make sense to use betoh16() and friends instead of
ntohs() here, where it makes sense, and to declare the integers as
be16_t, be32_t and so on. This is defined in "sparse-endian.h" and is
useful for using the kernel sparse checker on this code, and it will
then detect whenever a non-native endian integer is accessed without
conversion.
> + lease = new0(DHCPLease, 1);
> + if (!lease)
> + return -ENOBUFS;
ENOMEM please
> +
> +error:
> + free(lease);
> +
> + return -ENOMSG;
> +}
_cleanup_free_!
> +
> +static int client_receive_raw_message(sd_event_source *s, int fd,
> + uint32_t revents, void *userdata)
> +{
> + DHCPClient *client = userdata;
> + int err = 0;
> + int len, buflen;
> + uint8_t *buf;
> + DHCPPacket *message;
> +
> + buflen = sizeof(DHCPPacket) + DHCP_CLIENT_MIN_OPTIONS_SIZE;
> + buf = malloc0(buflen);
> + if (!buf)
> + goto error;
Hmm, you eat up the rror here, is that intended?
> + len = read(fd, buf, buflen);
> + if (len < 0) {
> + err = -errno;
> + goto error;
> + }
> +
> + message = (DHCPPacket *)buf;
> +
> + switch (client->state) {
> + case DHCP_STATE_SELECTING:
> +
> + if (client_receive_offer(client, message, len) >= 0) {
> +
> + close(client->fd);
> + client->fd = 0;
-1 again...
> +error:
> + if (!err)
> + read(fd, buf, 1);
You forget to free buf here...
Lennart
--
Lennart Poettering, Red Hat
More information about the systemd-devel
mailing list