[Python-checkins] r87836 - in python/branches/release31-maint: Misc/ACKS Misc/NEWS Objects/obmalloc.c
antoine.pitrou
python-checkins at python.org
Fri Jan 7 22:49:25 CET 2011
Author: antoine.pitrou
Date: Fri Jan 7 22:49:25 2011
New Revision: 87836
Log:
Merged revisions 87834 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/branches/py3k
........
r87834 | antoine.pitrou | 2011-01-07 22:43:59 +0100 (ven., 07 janv. 2011) | 5 lines
Issue #8020: Avoid a crash where the small objects allocator would read
non-Python managed memory while it is being modified by another thread.
Patch by Matt Bandy.
........
Modified:
python/branches/release31-maint/ (props changed)
python/branches/release31-maint/Misc/ACKS
python/branches/release31-maint/Misc/NEWS
python/branches/release31-maint/Objects/obmalloc.c
Modified: python/branches/release31-maint/Misc/ACKS
==============================================================================
--- python/branches/release31-maint/Misc/ACKS (original)
+++ python/branches/release31-maint/Misc/ACKS Fri Jan 7 22:49:25 2011
@@ -39,6 +39,7 @@
Greg Ball
Luigi Ballabio
Jeff Balogh
+Matt Bandy
Michael J. Barber
Chris Barker
Nick Barnes
Modified: python/branches/release31-maint/Misc/NEWS
==============================================================================
--- python/branches/release31-maint/Misc/NEWS (original)
+++ python/branches/release31-maint/Misc/NEWS Fri Jan 7 22:49:25 2011
@@ -10,6 +10,10 @@
Core and Builtins
-----------------
+- Issue #8020: Avoid a crash where the small objects allocator would read
+ non-Python managed memory while it is being modified by another thread.
+ Patch by Matt Bandy.
+
- Issue #8278: On Windows and with a NTFS filesystem, os.stat() and os.utime()
can now handle dates after 2038.
Modified: python/branches/release31-maint/Objects/obmalloc.c
==============================================================================
--- python/branches/release31-maint/Objects/obmalloc.c (original)
+++ python/branches/release31-maint/Objects/obmalloc.c Fri Jan 7 22:49:25 2011
@@ -667,11 +667,19 @@
obmalloc in a small constant time, independent of the number of arenas
obmalloc controls. Since this test is needed at every entry point, it's
extremely desirable that it be this fast.
+
+Since Py_ADDRESS_IN_RANGE may be reading from memory which was not allocated
+by Python, it is important that (POOL)->arenaindex is read only once, as
+another thread may be concurrently modifying the value without holding the
+GIL. To accomplish this, the arenaindex_temp variable is used to store
+(POOL)->arenaindex for the duration of the Py_ADDRESS_IN_RANGE macro's
+execution. The caller of the macro is responsible for declaring this
+variable.
*/
#define Py_ADDRESS_IN_RANGE(P, POOL) \
- ((POOL)->arenaindex < maxarenas && \
- (uptr)(P) - arenas[(POOL)->arenaindex].address < (uptr)ARENA_SIZE && \
- arenas[(POOL)->arenaindex].address != 0)
+ ((arenaindex_temp = (POOL)->arenaindex) < maxarenas && \
+ (uptr)(P) - arenas[arenaindex_temp].address < (uptr)ARENA_SIZE && \
+ arenas[arenaindex_temp].address != 0)
/* This is only useful when running memory debuggers such as
@@ -923,6 +931,9 @@
block *lastfree;
poolp next, prev;
uint size;
+#ifndef Py_USING_MEMORY_DEBUGGER
+ uint arenaindex_temp;
+#endif
if (p == NULL) /* free(NULL) has no effect */
return;
@@ -1137,6 +1148,9 @@
void *bp;
poolp pool;
size_t size;
+#ifndef Py_USING_MEMORY_DEBUGGER
+ uint arenaindex_temp;
+#endif
if (p == NULL)
return PyObject_Malloc(nbytes);
@@ -1758,8 +1772,10 @@
int
Py_ADDRESS_IN_RANGE(void *P, poolp pool)
{
- return pool->arenaindex < maxarenas &&
- (uptr)P - arenas[pool->arenaindex].address < (uptr)ARENA_SIZE &&
- arenas[pool->arenaindex].address != 0;
+ uint arenaindex_temp = pool->arenaindex;
+
+ return arenaindex_temp < maxarenas &&
+ (uptr)P - arenas[arenaindex_temp].address < (uptr)ARENA_SIZE &&
+ arenas[arenaindex_temp].address != 0;
}
#endif
More information about the Python-checkins
mailing list