From e8f504e86d90b85d85f6005fa8e53a45385d07c8 Mon Sep 17 00:00:00 2001 From: Rob Landley Date: Wed, 22 Feb 2006 02:10:34 +0000 Subject: Bug 751: file handle leaks can add up until available filehandles for the process are exhausted. --- networking/udhcp/packet.c | 12 +++++++++--- networking/udhcp/socket.c | 3 +++ 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/networking/udhcp/packet.c b/networking/udhcp/packet.c index 1baec55e2..222dd24e0 100644 --- a/networking/udhcp/packet.c +++ b/networking/udhcp/packet.c @@ -177,24 +177,30 @@ int kernel_packet(struct dhcpMessage *payload, uint32_t source_ip, int source_po if ((fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) return -1; - if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char *) &n, sizeof(n)) == -1) + if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char *) &n, sizeof(n)) == -1) { + close(fd); return -1; + } memset(&client, 0, sizeof(client)); client.sin_family = AF_INET; client.sin_port = htons(source_port); client.sin_addr.s_addr = source_ip; - if (bind(fd, (struct sockaddr *)&client, sizeof(struct sockaddr)) == -1) + if (bind(fd, (struct sockaddr *)&client, sizeof(struct sockaddr)) == -1) { + close(fd); return -1; + } memset(&client, 0, sizeof(client)); client.sin_family = AF_INET; client.sin_port = htons(dest_port); client.sin_addr.s_addr = dest_ip; - if (connect(fd, (struct sockaddr *)&client, sizeof(struct sockaddr)) == -1) + if (connect(fd, (struct sockaddr *)&client, sizeof(struct sockaddr)) == -1) { + close(fd); return -1; + } result = write(fd, payload, sizeof(struct dhcpMessage)); close(fd); diff --git a/networking/udhcp/socket.c b/networking/udhcp/socket.c index 7b057523a..036885175 100644 --- a/networking/udhcp/socket.c +++ b/networking/udhcp/socket.c @@ -62,6 +62,7 @@ int read_interface(char *interface, int *ifindex, uint32_t *addr, uint8_t *arp) DEBUG(LOG_INFO, "%s (our ip) = %s", ifr.ifr_name, inet_ntoa(our_ip->sin_addr)); } else { LOG(LOG_ERR, "SIOCGIFADDR failed, is the interface up and configured?: %m"); + close(fd); return -1; } } @@ -71,6 +72,7 @@ int read_interface(char *interface, int *ifindex, uint32_t *addr, uint8_t *arp) *ifindex = ifr.ifr_ifindex; } else { LOG(LOG_ERR, "SIOCGIFINDEX failed!: %m"); + close(fd); return -1; } if (ioctl(fd, SIOCGIFHWADDR, &ifr) == 0) { @@ -79,6 +81,7 @@ int read_interface(char *interface, int *ifindex, uint32_t *addr, uint8_t *arp) arp[0], arp[1], arp[2], arp[3], arp[4], arp[5]); } else { LOG(LOG_ERR, "SIOCGIFHWADDR failed!: %m"); + close(fd); return -1; } } else { -- cgit v1.2.3