]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Fix SF #561858 Assertion with very long lists
authorNeal Norwitz <nnorwitz@gmail.com>
Sat, 1 Jun 2002 18:26:22 +0000 (18:26 +0000)
committerNeal Norwitz <nnorwitz@gmail.com>
Sat, 1 Jun 2002 18:26:22 +0000 (18:26 +0000)
if co_stacksize was > 32767 (the maximum value
which can be stored in 16 bits (signed)),
the PyCodeObject would be written wrong.
So on the second import (reading the .pyc)
would cause a crash.

Since we can't change the PYC magic, we
go on (silently), but don't write the file.
This means everything will work, but
a .pyc will not be written and the file will need
to be parsed on each import.

I will backport.

Python/import.c

index ba7d5d50408a1a67b5332cd98dc1fd3fd2adf36d..2c2a3a14afcd76f727b7ba3adb8cc0f926fd3a8f 100644 (file)
@@ -19,6 +19,9 @@
 #include <fcntl.h>
 #endif
 
+/* check if the int_value can't be written in 15 bits (signed) */
+#define CANT_WRITE(int_value)  (int_value > 32767)
+
 extern time_t PyOS_GetLastModificationTime(char *, FILE *);
                                                /* In getmtime.c */
 
@@ -687,6 +690,18 @@ write_compiled_module(PyCodeObject *co, char *cpathname, long mtime)
 {
        FILE *fp;
 
+       if (CANT_WRITE(co->co_argcount) ||
+           CANT_WRITE(co->co_nlocals) ||
+           CANT_WRITE(co->co_stacksize) ||
+           CANT_WRITE(co->co_flags) ||
+           CANT_WRITE(co->co_firstlineno)) {
+               if (Py_VerboseFlag)
+                       PySys_WriteStderr(
+                               "# code too large: can't write %s\n",
+                               cpathname);
+               return;
+       }
+
        fp = open_exclusive(cpathname);
        if (fp == NULL) {
                if (Py_VerboseFlag)