aboutsummaryrefslogtreecommitdiff
path: root/networking/udhcp/packet.c
diff options
context:
space:
mode:
authorRob Landley <rob@landley.net>2006-02-22 02:10:34 +0000
committerRob Landley <rob@landley.net>2006-02-22 02:10:34 +0000
commite8f504e86d90b85d85f6005fa8e53a45385d07c8 (patch)
tree0d8962e3c3bc86d129c9fba431204dfb43c3cc48 /networking/udhcp/packet.c
parentd6e14d8beebb5c9571bded30df6568570f0c2a54 (diff)
downloadbusybox-w32-e8f504e86d90b85d85f6005fa8e53a45385d07c8.tar.gz
busybox-w32-e8f504e86d90b85d85f6005fa8e53a45385d07c8.tar.bz2
busybox-w32-e8f504e86d90b85d85f6005fa8e53a45385d07c8.zip
Bug 751: file handle leaks can add up until available filehandles for the
process are exhausted.
Diffstat (limited to 'networking/udhcp/packet.c')
-rw-r--r--networking/udhcp/packet.c12
1 files changed, 9 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
177 if ((fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) 177 if ((fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0)
178 return -1; 178 return -1;
179 179
180 if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char *) &n, sizeof(n)) == -1) 180 if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char *) &n, sizeof(n)) == -1) {
181 close(fd);
181 return -1; 182 return -1;
183 }
182 184
183 memset(&client, 0, sizeof(client)); 185 memset(&client, 0, sizeof(client));
184 client.sin_family = AF_INET; 186 client.sin_family = AF_INET;
185 client.sin_port = htons(source_port); 187 client.sin_port = htons(source_port);
186 client.sin_addr.s_addr = source_ip; 188 client.sin_addr.s_addr = source_ip;
187 189
188 if (bind(fd, (struct sockaddr *)&client, sizeof(struct sockaddr)) == -1) 190 if (bind(fd, (struct sockaddr *)&client, sizeof(struct sockaddr)) == -1) {
191 close(fd);
189 return -1; 192 return -1;
193 }
190 194
191 memset(&client, 0, sizeof(client)); 195 memset(&client, 0, sizeof(client));
192 client.sin_family = AF_INET; 196 client.sin_family = AF_INET;
193 client.sin_port = htons(dest_port); 197 client.sin_port = htons(dest_port);
194 client.sin_addr.s_addr = dest_ip; 198 client.sin_addr.s_addr = dest_ip;
195 199
196 if (connect(fd, (struct sockaddr *)&client, sizeof(struct sockaddr)) == -1) 200 if (connect(fd, (struct sockaddr *)&client, sizeof(struct sockaddr)) == -1) {
201 close(fd);
197 return -1; 202 return -1;
203 }
198 204
199 result = write(fd, payload, sizeof(struct dhcpMessage)); 205 result = write(fd, payload, sizeof(struct dhcpMessage));
200 close(fd); 206 close(fd);