]> granicus.if.org Git - python/commitdiff
Ugly fix for SF bug 131239 (-x flag busted).
authorTim Peters <tim.peters@gmail.com>
Sun, 11 Feb 2001 04:35:39 +0000 (04:35 +0000)
committerTim Peters <tim.peters@gmail.com>
Sun, 11 Feb 2001 04:35:39 +0000 (04:35 +0000)
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

index 5e0377d6ac86290d7b06cf63f5b6cfd41e238728..a26781ec47115c0518481975753405d1b762e59d 100644 (file)
@@ -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;
 }