You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@httpd.apache.org by "Min Xu(Hsu)" <mx...@cae.wisc.edu> on 2004/02/05 19:17:42 UTC
Re: apache bug archive?
Jeff,
On Mon, 26 Jan 2004 Jeff Trawick wrote :
> bug was that there were two places where we tried to close a single file
> descriptor... 2nd close would fail with EBADF unless some other thread
> had that file descriptor assigned to another file because it got a
> socket or file or pipe or whatever after the first close() but before
> the second close()... that could cause the 2nd thread to fail to write
> data (getting EBADF) or even worse write to some other thread's
> socket/pipe/file/whatever if thread 3 got that fd assigned in the mean time
Thanks for your detailed explanation. I really appreciate it.
Since then I try to repeat this bug on a real server with 12 CPUs. I wrote
a driver program that repeatedly fetch a cgi URL with each time with unique
parameters. The server is configured with worker MPM and cgid module.
The driver matches the cgi (in fact, "test-cgi" in cgi-bin directory)
output with the unique parameter sent and raise error if they don't match.
However, I couldn't repeat the bug with such setup. I didn't see any
mismatch of cgi output from the driver neither do I saw any error message
of bad file descriptor being closed in the error log.
I wonder what's wrong with my setup? Maybe the test-cgi isn't running
long enough?
In fact, I try to understand the cgid source code to understand this file
descriptor mishandling. However, I couldn't find any place where this file
descriptor, which I assume is tempsock in cgid_handler(), is passed to
another thread. The closest place I found was the place where tempsock is
placed into a bucket b, and then added to the tail of a brigade bb, then
ap_pass_brigade (r->output_filters, bb) is called to pass tempsock
to next filter. However, it seems ap_pass_brigade() still executes the
filter function within the same thread. In other words, tempsock never
escaped this thread. How could a second thread get this file descriptor?
Thanks a lot again.
-Min