Am 03.12.2013 00:37, schrieb William A. Rowe Jr.:
On Mon, 02 Dec 2013 01:34:58 +0100
Branko Čibej <[email protected]> wrote:

On 02.12.2013 01:29, Eric Covener wrote:
I am looking at a httpd bug that causes a hang on windows but
succeeds on unix.

It seems that (short) files are opened w/ buffering, read,
apr_file_closed, and read again [succesfully on unix]

On Unix, they sare satisfied out of the buffer.  file->fileset is
-1. On Windows, the destroyed apr_thread_mutex causes a hang.

Is reading from the closed file on the extreme bogus end of the
spectrum as I suspect and just getting lucky on the unix case?

I'd certainly call a successful read from a closed file a bug.

Should they blow up in 2.0 during a read if they've been closed?

Dunno ... my gut feeling in cases like this is to just leave it be.
Developers should have some fun finding heisenbugs, too. :)

If we fix this, it needs to be minimal impact.  Zero'ing out the
buffer on close seems like the lowest cpu impact.


A minimal impact and IMHO the correct fix is to return an error in buffered I/O if the file was closed.

An application should not call a read or write function on a closed file. If it does its a bug and it should be notified about that fact.

Thus I would propose the following fix in apr_file_read() and any other read/write function which uses buffered I/O:

APR_DECLARE(apr_status_t) apr_file_read(apr_file_t *thefile, void *buf, apr_size_t *nbytes)
{
    apr_ssize_t rv;
    apr_size_t bytes_read;

+    if (thefile->filedes < 0) {
+        return APR_EBADF;
+    }

    if (*nbytes <= 0) {
        *nbytes = 0;
        return APR_SUCCESS;
    }

Regards,
Stefan

Reply via email to