Kaydet (Commit) b9dbc7d6 authored tarafından Christian Heimes's avatar Christian Heimes

Issue #18328: Reorder ops in PyThreadState_Delete*() functions. Now the

tstate is first removed from TLS and then deallocated.
CID 1019639 (#1 of 1): Use after free (USE_AFTER_FREE)
 use_after_free: Using freed pointer tstate.
üst 21782488
...@@ -12,6 +12,9 @@ What's New in Python 3.3.3 release candidate 1? ...@@ -12,6 +12,9 @@ What's New in Python 3.3.3 release candidate 1?
Core and Builtins Core and Builtins
----------------- -----------------
- Issue #18328: Reorder ops in PyThreadState_Delete*() functions. Now the
tstate is first removed from TLS and then deallocated.
- Issue #18184: PyUnicode_FromFormat() and PyUnicode_FromFormatV() now raise - Issue #18184: PyUnicode_FromFormat() and PyUnicode_FromFormatV() now raise
OverflowError when an argument of %c format is out of range. OverflowError when an argument of %c format is out of range.
......
...@@ -388,11 +388,11 @@ PyThreadState_Delete(PyThreadState *tstate) ...@@ -388,11 +388,11 @@ PyThreadState_Delete(PyThreadState *tstate)
{ {
if (tstate == _Py_atomic_load_relaxed(&_PyThreadState_Current)) if (tstate == _Py_atomic_load_relaxed(&_PyThreadState_Current))
Py_FatalError("PyThreadState_Delete: tstate is still current"); Py_FatalError("PyThreadState_Delete: tstate is still current");
tstate_delete_common(tstate);
#ifdef WITH_THREAD #ifdef WITH_THREAD
if (autoInterpreterState && PyThread_get_key_value(autoTLSkey) == tstate) if (autoInterpreterState && PyThread_get_key_value(autoTLSkey) == tstate)
PyThread_delete_key_value(autoTLSkey); PyThread_delete_key_value(autoTLSkey);
#endif /* WITH_THREAD */ #endif /* WITH_THREAD */
tstate_delete_common(tstate);
} }
...@@ -406,9 +406,9 @@ PyThreadState_DeleteCurrent() ...@@ -406,9 +406,9 @@ PyThreadState_DeleteCurrent()
Py_FatalError( Py_FatalError(
"PyThreadState_DeleteCurrent: no current tstate"); "PyThreadState_DeleteCurrent: no current tstate");
_Py_atomic_store_relaxed(&_PyThreadState_Current, NULL); _Py_atomic_store_relaxed(&_PyThreadState_Current, NULL);
tstate_delete_common(tstate);
if (autoInterpreterState && PyThread_get_key_value(autoTLSkey) == tstate) if (autoInterpreterState && PyThread_get_key_value(autoTLSkey) == tstate)
PyThread_delete_key_value(autoTLSkey); PyThread_delete_key_value(autoTLSkey);
tstate_delete_common(tstate);
PyEval_ReleaseLock(); PyEval_ReleaseLock();
} }
#endif /* WITH_THREAD */ #endif /* WITH_THREAD */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment