inetd bug
walter harms
wharms at bfs.de
Wed Nov 5 00:40:31 PST 2008
Cathey, Jim schrieb:
> 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.
you are right according to specs here:
http://www.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_12.html
rlim_t is a "Unsigned integer type" what make -1 a bad marker.
we need to fix that too.
re,
wh
> 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:wharms at bfs.de]
> Sent: Tuesday, November 04, 2008 10:46 AM
> To: Cathey, Jim
> Cc: busybox at busybox.net
> 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
>
>
>
More information about the busybox
mailing list