From 3e876565a3913427fc64b57553cb6986f1f7512b Mon Sep 17 00:00:00 2001 From: Tim Peters Date: Sun, 11 Feb 2001 04:35:39 +0000 Subject: Ugly fix for SF bug 131239 (-x flag busted). Bug was introduced by tricks played to make .pyc files executable via cmdline arg. Then again, -x worked via a trick to begin with. If anyone can think of a portable way to test -x, be my guest! --- Python/pythonrun.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/Python/pythonrun.c b/Python/pythonrun.c index 5e0377d..a26781e 100644 --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -578,10 +578,21 @@ maybe_pyc_file(FILE *fp, char* filename, char* ext, int closeit) be read as they are on disk. */ unsigned int halfmagic = PyImport_GetMagicNumber() & 0xFFFF; unsigned char buf[2]; - if (fread(buf, 1, 2, fp) == 2 - && ((unsigned int)buf[1]<<8 | buf[0]) == halfmagic) - return 1; - fseek(fp, 0, SEEK_SET); + /* 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. + */ + 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); + return ispyc; } return 0; } -- cgit v0.12