|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2000-09-27 21:47 UTC] melchers at cis dot fu-berlin dot 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.
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Wed Oct 29 23:00:01 2025 UTC |
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; ... }