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

From: Date: Thu, 28 Sep 2000 02:55:18 +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-33752@lists.php.net to get a copy of this message
ID: 6913 User Update by: melchers@cis.fu-berlin.de Status: Open Bug Type: Sockets related Description: wrong use of C language, serious bug! 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; ... } Previous Comments: --------------------------------------------------------------------------- [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 (#33752) next »