PHP 4.0 Bug #6913 Updated: wrong use of C language, serious bug!

From: Date: Mon, 02 Oct 2000 17:26:36 +0000
Subject: PHP 4.0 Bug #6913 Updated: wrong use of C language, serious bug!
Groups: php.dev 
Request: Send a blank email to php-dev+get-33959@lists.php.net to get a copy of this message
ID: 6913 Updated by: sterling Reported By: melchers@cis.fu-berlin.de Status: Closed Bug Type: Sockets related Assigned To: Comments: fixed in CVS Previous Comments: --------------------------------------------------------------------------- [2000-09-29 20:16:32] melchers@cis.fu-berlin.de my last explanation is a bit unclear, sorry! with all php-3.0.x versions, i have the following problem with socket usage and php: When the socket connection is established, i.e. between the php-Script(client) and a mail server, the php script could _only_ receive data, when the data written by the server are already received by the client OS protocol stack. Otherwise, i.e. when the client tries to read (blocking or unblocking) data, the fgets() function _never returns data. Even if the data packets from the server side of the socket arrives one second later, fgets() never return any byte more. Using blocking reads: the function fgets() returns never. Using unblocking reads: the function fgets() never returns any byte. Perhaps the handling of EOF in fgets() is a problem. Perhaps a signed/unsigned problem? Ok, i have to read the manual of my debugger... --------------------------------------------------------------------------- [2000-09-27 22:55:17] melchers@cis.fu-berlin.de i don't find this line in the php-3.x series, although socket communication is not possible in irix: fgets() never returns as long as the other side keeps the socket open and php is blocked by waiting for data. The above error can trivially fixed by writing: int ii; if ((ii = FP_FGETC(socketd, (FILE*)what, issock)) == EOF) { *buf = ii; ... } else { *buf = ii; ... } --------------------------------------------------------------------------- [2000-09-27 21:47:32] melchers@cis.fu-berlin.de file ext/standard/file.c contains the line: if ((*buf = FP_FGETC(socketd, (FILE*)what, issock)) == EOF) { this is a _serious_ bug, since on _all_ machine architectures where the data type "char" defaults to unsigned, the return value of FP_FGETC() is converted to unsigned, before it is compared to EOF. Since EOF is defined as (-1), the comparison _never_ succedds. This makes any usage of sockets and file-I/O on "unsigned char" architectures impossible. As far as i remember, the bug occurs in all php versions, i.e. 3.x and 4.x. my page for fgetc(3) says: WARNING If the integer value returned by getc, getchar, or fgetc is stored into a character variable and then compared against the integer constant EOF, the comparison may never succeed, because sign-extension of a character on widening to integer is machine-dependent. --------------------------------------------------------------------------- Full Bug description available at: http://bugs.php.net/?id=6913

« previous php.dev (#33959) next »