summaryrefslogtreecommitdiffstats
path: root/package/busybox/patches/000-upstream-inetd.patch
blob: dc71c7e77136dc0d6f0effb5a2c95c9c1aaccdfd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
--- a/networking/inetd.c
+++ b/networking/inetd.c
@@ -1278,6 +1278,7 @@ int inetd_main(int argc UNUSED_PARAM, ch
 							sep->se_count = 0;
 							rearm_alarm(); /* will revive it in RETRYTIME sec */
 							restore_sigmask(&omask);
+							maybe_close(new_udp_fd);
 							maybe_close(accepted_fd);
 							continue; /* -> check next fd in fd set */
 						}
@@ -1298,17 +1299,18 @@ int inetd_main(int argc UNUSED_PARAM, ch
 					bb_perror_msg("vfork"+1);
 					sleep(1);
 					restore_sigmask(&omask);
+					maybe_close(new_udp_fd);
 					maybe_close(accepted_fd);
 					continue; /* -> check next fd in fd set */
 				}
 				if (pid == 0)
 					pid--; /* -1: "we did fork and we are child" */
 			}
-			/* if pid == 0 here, we never forked */
+			/* if pid == 0 here, we didn't fork */
 
 			if (pid > 0) { /* parent */
 				if (sep->se_wait) {
-					/* tcp wait: we passed listening socket to child,
+					/* wait: we passed socket to child,
 					 * will wait for child to terminate */
 					sep->se_wait = pid;
 					remove_fd_from_set(sep->se_fd);
@@ -1345,9 +1347,13 @@ int inetd_main(int argc UNUSED_PARAM, ch
 			setsid();
 			/* "nowait" udp */
 			if (new_udp_fd >= 0) {
-				len_and_sockaddr *lsa = xzalloc_lsa(sep->se_family);
+				len_and_sockaddr *lsa;
+				int r;
+
+				close(new_udp_fd);
+				lsa = xzalloc_lsa(sep->se_family);
 				/* peek at the packet and remember peer addr */
-				int r = recvfrom(ctrl, NULL, 0, MSG_PEEK|MSG_DONTWAIT,
+				r = recvfrom(ctrl, NULL, 0, MSG_PEEK|MSG_DONTWAIT,
 					&lsa->u.sa, &lsa->len);
 				if (r < 0)
 					goto do_exit1;