[PHP-DEV] Re: PHP dies on URL fopen From: J Smith (dark_panda <email protected>)
Date: 07/31/01

Stanislav Malyshev wrote:

> Recently, PHP started to segfault for me on URL fopen, e.g.:
> fopen("http://www.host.com","r") brings immediate segfault.
>
> Investigation showed that the problem happens in php_sock_fgets_internal
> (file fsock.c), in the first SEARCHCR() statement and is because when sock
> parameter is passed to php_sock_fgets_internal, both readbuf and readpos
> are 0, and SEARCHCR does p = READPTR(sock), which makes p be 0 too, and
> then uses *p != '\n' as a condition.
> Could anybody who know the code look at this and check what has gone
> wrong?
>

Here's what I came up with:

What it was (latest CVS I have, fsock.c revision 1.74):

#define SEARCHCR() do { \
        for (p = READPTR(sock), pe = p + MIN(TOREAD(sock), maxlen); \

                        *p != '\n'; ) if (++p >= pe) { p = NULL; break; }
    \

} while (0)

What I did instead:

#define SEARCHCR() \
    if (MIN(TOREAD(sock), maxlen) == 0) \
        p = NULL; \
    else { \

        for (p = READPTR(sock), pe = p + MIN(TOREAD(sock), maxlen); *p !=
'\n'; p++) { \

            if (p >= pe) { \
                p = NULL; \
                break; \
            } \
        } \
    }

That seems to work nicely. Looks like crap, but it works. It also fires
off some warnings about comparing READPTR(sock) to 0 since you're
comparing a pointer address to an integer, but that shouldn't be a big deal.

A patch follows if anybody's interested.

btw, this is my first ever patch submitted for PHP, so if it totally sucks,
be kind.

J

Patch:

--- ext/standard/fsock.c Tue Jul 31 17:27:42 2001
+++ ext/standard/newfsock.c Tue Jul 31 17:34:31 2001
@@ -89,10 +89,18 @@
                efree(key); \
        }

-#define SEARCHCR() do { \
- for (p = READPTR(sock), pe = p + MIN(TOREAD(sock), maxlen); \
- *p != '\n'; ) if (++p >= pe) { p = NULL; break; } \
-} while (0)
+#define SEARCHCR() \
+ if (MIN(TOREAD(sock), maxlen) == 0) \
+ p = NULL; \
+ else { \
+ for (p = READPTR(sock), pe = p + MIN(TOREAD(sock),maxlen);
*p != '\n'; p++) { \
+ if (p >= pe) { \
+ p = NULL; \
+ break; \
+ } \
+ } \
+ }
+

-- 
PHP Development Mailing List <http://www.php.net/>
To unsubscribe, e-mail: php-dev-unsubscribe <email protected>
For additional commands, e-mail: php-dev-help <email protected>
To contact the list administrators, e-mail: php-list-admin <email protected>