Kaydet (Commit) f79e084e authored tarafından Neal Norwitz's avatar Neal Norwitz

Fix SF #561858 Assertion with very long lists

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.
üst 6ad0a79c
...@@ -19,6 +19,9 @@ ...@@ -19,6 +19,9 @@
#include <fcntl.h> #include <fcntl.h>
#endif #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 *); extern time_t PyOS_GetLastModificationTime(char *, FILE *);
/* In getmtime.c */ /* In getmtime.c */
...@@ -687,6 +690,18 @@ write_compiled_module(PyCodeObject *co, char *cpathname, long mtime) ...@@ -687,6 +690,18 @@ write_compiled_module(PyCodeObject *co, char *cpathname, long mtime)
{ {
FILE *fp; 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); fp = open_exclusive(cpathname);
if (fp == NULL) { if (fp == NULL) {
if (Py_VerboseFlag) if (Py_VerboseFlag)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment