diff --git a/Python/pythonrun.c b/Python/pythonrun.c index a26781ec471..48b875e149b 100644 --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -580,18 +580,22 @@ maybe_pyc_file(FILE *fp, char* filename, char* ext, int closeit) unsigned char buf[2]; /* Mess: In case of -x, the stream is NOT at its start now, and ungetc() was used to push back the first newline, - which makes the current stream position formally undefined - until that newline is read back. So first we getc(), so - that ftell() is well-defined. + which makes the current stream position formally undefined, + and a x-platform nightmare. + Unfortunately, we have no direct way to know whether -x + was specified. So we use a terrible hack: if the current + stream position is not 0, we assume -x was specified, and + give up. Bug 132850 on SourceForge spells out the + hopelessness of trying anything else (fseek and ftell + don't work predictably x-platform for text-mode files). */ - const int maybepushedback = getc(fp); - const long currentpos = ftell(fp); int ispyc = 0; - rewind(fp); - ispyc = fread(buf, 1, 2, fp) == 2 && - ((unsigned int)buf[1]<<8 | buf[0]) == halfmagic; - fseek(fp, currentpos, SEEK_SET); - ungetc(maybepushedback, fp); + if (ftell(fp) == 0) { + if (fread(buf, 1, 2, fp) == 2 && + ((unsigned int)buf[1]<<8 | buf[0]) == halfmagic) + ispyc = 1; + rewind(fp); + } return ispyc; } return 0;