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