From f79e084e38264e93b78a59df444b1a3dd2b2cf4c Mon Sep 17 00:00:00 2001 From: Neal Norwitz Date: Sat, 1 Jun 2002 18:26:22 +0000 Subject: [PATCH] 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. --- Python/import.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) 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) -- 2.47.3