Bug 751: file handle leaks can add up until available filehandles for the
authorRob Landley <rob@landley.net>
Wed, 22 Feb 2006 02:10:34 +0000 (02:10 -0000)
committerRob Landley <rob@landley.net>
Wed, 22 Feb 2006 02:10:34 +0000 (02:10 -0000)
process are exhausted.

networking/udhcp/packet.c
networking/udhcp/socket.c

index 1baec55e2be743b6e6be1f85253c0f896ec4c6f6..222dd24e02a53263aa8f1c11c89dec4696c083ea 100644 (file)
@@ -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);
index 7b057523a167b2c29ad4f194495e8293b2a14a28..0368851755f361f1337ddf20c473d95fba242568 100644 (file)
@@ -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 {