mirror of https://github.com/python/cpython
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.
This commit is contained in:
parent
8a96d209f0
commit
18e63fbe64
|
@ -536,6 +536,7 @@ Piotr Meyer
|
||||||
John Nagle
|
John Nagle
|
||||||
Takahiro Nakayama
|
Takahiro Nakayama
|
||||||
Travers Naran
|
Travers Naran
|
||||||
|
Charles-François Natali
|
||||||
Fredrik Nehr
|
Fredrik Nehr
|
||||||
Trent Nelson
|
Trent Nelson
|
||||||
Tony Nelson
|
Tony Nelson
|
||||||
|
|
|
@ -12,6 +12,11 @@ What's New in Python 2.7 beta 2?
|
||||||
Core and Builtins
|
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
|
- Issue #8417: Raise an OverflowError when an integer larger than sys.maxsize is
|
||||||
passed to bytearray.
|
passed to bytearray.
|
||||||
|
|
||||||
|
|
|
@ -1126,23 +1126,13 @@ getfilesize(FILE *fp)
|
||||||
PyObject *
|
PyObject *
|
||||||
PyMarshal_ReadLastObjectFromFile(FILE *fp)
|
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. */
|
||||||
* REASONABLE_FILE_LIMIT is by defn something big enough for Tkinter.pyc.
|
|
||||||
*/
|
|
||||||
#define SMALL_FILE_LIMIT (1L << 14)
|
|
||||||
#define REASONABLE_FILE_LIMIT (1L << 18)
|
#define REASONABLE_FILE_LIMIT (1L << 18)
|
||||||
#ifdef HAVE_FSTAT
|
#ifdef HAVE_FSTAT
|
||||||
off_t filesize;
|
off_t filesize;
|
||||||
#endif
|
|
||||||
#ifdef HAVE_FSTAT
|
|
||||||
filesize = getfilesize(fp);
|
filesize = getfilesize(fp);
|
||||||
if (filesize > 0) {
|
if (filesize > 0 && filesize <= REASONABLE_FILE_LIMIT) {
|
||||||
char buf[SMALL_FILE_LIMIT];
|
char* pBuf = (char *)PyMem_MALLOC(filesize);
|
||||||
char* pBuf = NULL;
|
|
||||||
if (filesize <= SMALL_FILE_LIMIT)
|
|
||||||
pBuf = buf;
|
|
||||||
else if (filesize <= REASONABLE_FILE_LIMIT)
|
|
||||||
pBuf = (char *)PyMem_MALLOC(filesize);
|
|
||||||
if (pBuf != NULL) {
|
if (pBuf != NULL) {
|
||||||
PyObject* v;
|
PyObject* v;
|
||||||
size_t n;
|
size_t n;
|
||||||
|
@ -1150,8 +1140,7 @@ PyMarshal_ReadLastObjectFromFile(FILE *fp)
|
||||||
is smaller than REASONABLE_FILE_LIMIT */
|
is smaller than REASONABLE_FILE_LIMIT */
|
||||||
n = fread(pBuf, 1, (int)filesize, fp);
|
n = fread(pBuf, 1, (int)filesize, fp);
|
||||||
v = PyMarshal_ReadObjectFromString(pBuf, n);
|
v = PyMarshal_ReadObjectFromString(pBuf, n);
|
||||||
if (pBuf != buf)
|
PyMem_FREE(pBuf);
|
||||||
PyMem_FREE(pBuf);
|
|
||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1162,7 +1151,6 @@ PyMarshal_ReadLastObjectFromFile(FILE *fp)
|
||||||
*/
|
*/
|
||||||
return PyMarshal_ReadObjectFromFile(fp);
|
return PyMarshal_ReadObjectFromFile(fp);
|
||||||
|
|
||||||
#undef SMALL_FILE_LIMIT
|
|
||||||
#undef REASONABLE_FILE_LIMIT
|
#undef REASONABLE_FILE_LIMIT
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue