From: Neal Norwitz Date: Sat, 1 Jun 2002 18:26:22 +0000 (+0000) Subject: Fix SF #561858 Assertion with very long lists X-Git-Tag: v2.2.2b1~347 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=f79e084e38264e93b78a59df444b1a3dd2b2cf4c;p=thirdparty%2FPython%2Fcpython.git 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. --- diff --git a/Python/import.c b/Python/import.c index ba7d5d50408a..2c2a3a14afcd 100644 --- a/Python/import.c +++ b/Python/import.c @@ -19,6 +19,9 @@ #include #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)