I _believe_ (and this was done some time ago, so my memory is spotty) that it was when the value of maxsock was -1 (zero services in table), that when casted to an rlim_t it turned into a very large positive number, which meant the conditional passed when it shouldn't. My solution, for us using MIPS32, was to reverse the cast and convert the rlim_t'd doodad to int, whereupon the conditional worked as needed. I do not claim that it was a correct fix, merely an adequate one for us at the time.
It was an extremely easy problem to provoke, all you need is an inetd.conf that has only one service in it. Comment it out, HUP, comment it back in, HUP again, and see that the service doesn't come back. -- Jim -----Original Message----- From: walter harms [mailto:[EMAIL PROTECTED] Sent: Tuesday, November 04, 2008 10:46 AM To: Cathey, Jim Cc: [email protected] Subject: Re: inetd bug Cathey, Jim schrieb: > We've been using BB, and found that when we had an /etc/inetd.conf > file with only one service in it, said service being commented in > and out as it was enabled/disabled by the system (along with a HUP > to inetd), that the lone service could not re-enable. I tracked it > down to a bug where the maxsock variable wasn't being used correctly. > (As I recall, we also had some variable typing problems, so I changed > two casts as well. This was with MIPS32.) Enclosed are the patches. > The same problem was in 1.10.2, and 1.11.1 that we're using now. > > -- Jim Cathey > > diff -Naur obusybox-1.10.2/networking/inetd.c > busybox-1.10.2/networking/inetd.c > --- obusybox-1.10.2/networking/inetd.c 2008-04-18 23:50:27.000000000 > -0400 > +++ busybox-1.10.2/networking/inetd.c 2008-10-16 11:00:25.000000000 > -0400 > @@ -341,6 +341,7 @@ > #define INIT_G() do { \ > rlim_ofile_cur = OPEN_MAX; \ > global_queuelen = 128; \ > + maxsock = prev_maxsock = -1; \ > config_filename = "/etc/inetd.conf"; \ > } while (0) > > @@ -459,9 +460,9 @@ > { > if (fd >= 0) { > FD_SET(fd, &allsock); > - if (maxsock >= 0 && fd > maxsock) { > + if (fd > maxsock) { > prev_maxsock = maxsock = fd; > - if ((rlim_t)maxsock > rlim_ofile_cur - > FD_MARGIN) > + if (maxsock > (int)rlim_ofile_cur - FD_MARGIN) > bump_nofile(); > } > } > @@ -476,7 +477,7 @@ > fd++; > } > prev_maxsock = maxsock; > - if ((rlim_t)maxsock > rlim_ofile_cur - FD_MARGIN) > + if (maxsock > (int)rlim_ofile_cur - FD_MARGIN) > bump_nofile(); > } > you changed (rlim_t) -> (int) this seems dangerous since rlim_t can be 64bit. what problem does it solve ? re, wh _______________________________________________ busybox mailing list [email protected] http://busybox.net/cgi-bin/mailman/listinfo/busybox
