Bug 751: file handle leaks can add up until available filehandles for the
process are exhausted.
This commit is contained in:
parent
d6e14d8bee
commit
e8f504e86d
@ -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)
|
if ((fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0)
|
||||||
return -1;
|
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;
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
memset(&client, 0, sizeof(client));
|
memset(&client, 0, sizeof(client));
|
||||||
client.sin_family = AF_INET;
|
client.sin_family = AF_INET;
|
||||||
client.sin_port = htons(source_port);
|
client.sin_port = htons(source_port);
|
||||||
client.sin_addr.s_addr = source_ip;
|
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;
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
memset(&client, 0, sizeof(client));
|
memset(&client, 0, sizeof(client));
|
||||||
client.sin_family = AF_INET;
|
client.sin_family = AF_INET;
|
||||||
client.sin_port = htons(dest_port);
|
client.sin_port = htons(dest_port);
|
||||||
client.sin_addr.s_addr = dest_ip;
|
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;
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
result = write(fd, payload, sizeof(struct dhcpMessage));
|
result = write(fd, payload, sizeof(struct dhcpMessage));
|
||||||
close(fd);
|
close(fd);
|
||||||
|
@ -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));
|
DEBUG(LOG_INFO, "%s (our ip) = %s", ifr.ifr_name, inet_ntoa(our_ip->sin_addr));
|
||||||
} else {
|
} else {
|
||||||
LOG(LOG_ERR, "SIOCGIFADDR failed, is the interface up and configured?: %m");
|
LOG(LOG_ERR, "SIOCGIFADDR failed, is the interface up and configured?: %m");
|
||||||
|
close(fd);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -71,6 +72,7 @@ int read_interface(char *interface, int *ifindex, uint32_t *addr, uint8_t *arp)
|
|||||||
*ifindex = ifr.ifr_ifindex;
|
*ifindex = ifr.ifr_ifindex;
|
||||||
} else {
|
} else {
|
||||||
LOG(LOG_ERR, "SIOCGIFINDEX failed!: %m");
|
LOG(LOG_ERR, "SIOCGIFINDEX failed!: %m");
|
||||||
|
close(fd);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (ioctl(fd, SIOCGIFHWADDR, &ifr) == 0) {
|
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]);
|
arp[0], arp[1], arp[2], arp[3], arp[4], arp[5]);
|
||||||
} else {
|
} else {
|
||||||
LOG(LOG_ERR, "SIOCGIFHWADDR failed!: %m");
|
LOG(LOG_ERR, "SIOCGIFHWADDR failed!: %m");
|
||||||
|
close(fd);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
Loading…
Reference in New Issue
Block a user