From 18e63fbe64dc0c8dfd2b04bae1687f68c8d780bb Mon Sep 17 00:00:00 2001 From: Antoine Pitrou Date: Wed, 21 Apr 2010 22:53:29 +0000 Subject: =?UTF-8?q?Issue=20#7332:=20Remove=20the=2016KB=20stack-based=20bu?= =?UTF-8?q?ffer=20in=20PyMarshal=5FReadLastObjectFromFile,=20which=20doesn?= =?UTF-8?q?'t=20bring=20any=20noticeable=20benefit=20compared=20to=20the?= =?UTF-8?q?=20dynamic=20memory=20allocation=20fallback.=20=20Patch=20by=20?= =?UTF-8?q?Charles-Fran=C3=A7ois=20Natali.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Misc/ACKS | 1 + Misc/NEWS | 5 +++++ Python/marshal.c | 20 ++++---------------- 3 files changed, 10 insertions(+), 16 deletions(-) diff --git a/Misc/ACKS b/Misc/ACKS index 9eeb9bb..cd74072 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -536,6 +536,7 @@ Piotr Meyer John Nagle Takahiro Nakayama Travers Naran +Charles-François Natali Fredrik Nehr Trent Nelson Tony Nelson diff --git a/Misc/NEWS b/Misc/NEWS index d956c93..329b053 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -12,6 +12,11 @@ What's New in Python 2.7 beta 2? Core and Builtins ----------------- +- Issue #7332: Remove the 16KB stack-based buffer in + PyMarshal_ReadLastObjectFromFile, which doesn't bring any noticeable + benefit compared to the dynamic memory allocation fallback. Patch by + Charles-François Natali. + - Issue #8417: Raise an OverflowError when an integer larger than sys.maxsize is passed to bytearray. diff --git a/Python/marshal.c b/Python/marshal.c index 9e4a692..14f7134 100644 --- a/Python/marshal.c +++ b/Python/marshal.c @@ -1126,23 +1126,13 @@ getfilesize(FILE *fp) PyObject * PyMarshal_ReadLastObjectFromFile(FILE *fp) { -/* 75% of 2.1's .pyc files can exploit SMALL_FILE_LIMIT. - * REASONABLE_FILE_LIMIT is by defn something big enough for Tkinter.pyc. - */ -#define SMALL_FILE_LIMIT (1L << 14) +/* REASONABLE_FILE_LIMIT is by defn something big enough for Tkinter.pyc. */ #define REASONABLE_FILE_LIMIT (1L << 18) #ifdef HAVE_FSTAT off_t filesize; -#endif -#ifdef HAVE_FSTAT filesize = getfilesize(fp); - if (filesize > 0) { - char buf[SMALL_FILE_LIMIT]; - char* pBuf = NULL; - if (filesize <= SMALL_FILE_LIMIT) - pBuf = buf; - else if (filesize <= REASONABLE_FILE_LIMIT) - pBuf = (char *)PyMem_MALLOC(filesize); + if (filesize > 0 && filesize <= REASONABLE_FILE_LIMIT) { + char* pBuf = (char *)PyMem_MALLOC(filesize); if (pBuf != NULL) { PyObject* v; size_t n; @@ -1150,8 +1140,7 @@ PyMarshal_ReadLastObjectFromFile(FILE *fp) is smaller than REASONABLE_FILE_LIMIT */ n = fread(pBuf, 1, (int)filesize, fp); v = PyMarshal_ReadObjectFromString(pBuf, n); - if (pBuf != buf) - PyMem_FREE(pBuf); + PyMem_FREE(pBuf); return v; } @@ -1162,7 +1151,6 @@ PyMarshal_ReadLastObjectFromFile(FILE *fp) */ return PyMarshal_ReadObjectFromFile(fp); -#undef SMALL_FILE_LIMIT #undef REASONABLE_FILE_LIMIT } -- cgit v0.12