Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

gh-126119: fix some crashes in code objects ifco_stacksize is absurdly large#126122

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to ourterms of service andprivacy statement. We’ll occasionally send you account related emails.

Already on GitHub?Sign in to your account

Open
picnixz wants to merge27 commits intopython:main
base:main
Choose a base branch
Loading
frompicnixz:fix/overflow-in-frame-sizeof-126119
Open
Show file tree
Hide file tree
Changes fromall commits
Commits
Show all changes
27 commits
Select commitHold shift + click to select a range
dbf3d61
fix overflow in frame's stacksizes
picnixzOct 29, 2024
a566469
blurb
picnixzOct 29, 2024
222de28
blurb v2
picnixzOct 29, 2024
303109b
fix more cases
picnixzOct 29, 2024
d743a3d
improve test coverage!
picnixzOct 29, 2024
6b34c22
improve test coverage!
picnixzOct 29, 2024
044d1a5
fix logic
picnixzOct 31, 2024
d6f3bc4
remove un-necessary assertion
picnixzOct 31, 2024
31f36de
skip a test on free-threaded builds to avoid crash
picnixzOct 31, 2024
b26dd72
fix tests on 32-bit platforms
picnixzOct 31, 2024
fe0b04e
fix casts
picnixzOct 31, 2024
1fe8e28
fix boundary conditions
picnixzOct 31, 2024
40d8b91
Merge remote-tracking branch 'upstream/main' into fix/overflow-in-fra…
picnixzOct 31, 2024
8c7ce9c
Update Lib/test/test_frame.py
picnixzNov 7, 2024
f8a0eef
Update Misc/NEWS.d/next/Core_and_Builtins/2024-10-29-11-47-19.gh-issu…
picnixzNov 7, 2024
3130f94
change co_stacksize upper limit
picnixzNov 8, 2024
91f95de
remove test that cannot overflow now
picnixzNov 8, 2024
c5d7596
fix tests
picnixzNov 8, 2024
a0b85d4
remove unused imports
picnixzNov 8, 2024
04abc46
update comment
picnixzNov 9, 2024
0187b72
remove assertions from `gen_sizeof` and `frame_sizeof`
picnixzNov 9, 2024
c9969a4
update test
picnixzNov 9, 2024
6c0e1a6
update test
picnixzNov 9, 2024
a498df9
Merge branch 'main' into fix/overflow-in-frame-sizeof-126119
picnixzFeb 23, 2025
6284de6
Merge branch 'main' into fix/overflow-in-frame-sizeof-126119
picnixzMay 11, 2025
fdb2e89
address review
picnixzMay 15, 2025
990a69c
Merge remote-tracking branch 'upstream/main' into fix/code/overflow-1…
picnixzJun 2, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 25 additions & 0 deletionsLib/test/test_code.py
View file
Open in desktop
Original file line numberDiff line numberDiff line change
Expand Up@@ -208,6 +208,12 @@
import ctypes
except ImportError:
ctypes = None

try:
import _testcapi
except ImportError:
_testcapi = None

from test.support import (cpython_only,
check_impl_detail, requires_debug_ranges,
gc_collect, Py_GIL_DISABLED)
Expand DownExpand Up@@ -1159,6 +1165,25 @@ def test_stateless(self):
with self.assertRaises(Exception):
_testinternalcapi.verify_stateless_code(func)

@unittest.skipUnless(ctypes, "requires ctypes")
@unittest.skipUnless(_testcapi, "requires _testcapi")
def test_co_framesize_overflow(self):
# See: https://github.com/python/cpython/issues/126119.

def foo(a, b):
x = a * b
return x

c = foo.__code__

# The exact limit depends on co_nlocalsplus, so we do not hardcode it.
too_large_stacksize = _testcapi.INT_MAX // 16
ok_stacksize = too_large_stacksize // 2

with self.assertRaisesRegex(OverflowError, "stack size is too large"):
c.__replace__(co_stacksize=too_large_stacksize)
c.__replace__(co_stacksize=ok_stacksize)


def isinterned(s):
return s is sys.intern(('_' + s + '_')[1:-1])
Expand Down
View file
Open in desktop
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
Fix a crash in DEBUG builds due to a lack of overflow checks when setting
the :attr:`co_stacksize <codeobject.co_stacksize>` field of a :ref:`code
object <code-objects>` via :meth:`~object.__replace__`.
Reported by Valery Fedorenko. Patch by Bénédikt Tran.
17 changes: 16 additions & 1 deletionObjects/codeobject.c
View file
Open in desktop
Original file line numberDiff line numberDiff line change
Expand Up@@ -495,7 +495,22 @@ _PyCode_Validate(struct _PyCodeConstructor *con)
PyErr_SetString(PyExc_ValueError, "code: co_varnames is too small");
return -1;
}

/*
* Since framesize = stacksize + nlocalsplus + FRAME_SPECIALS_SIZE is used
* as framesize * sizeof(PyObject *) and assumed to be < INT_MAX in many
* other places, we need to limit stacksize + nlocalsplus in order to
* avoid overflows.
*
* See https://github.com/python/cpython/issues/126119 for details
* and corresponding PR for the rationale on the upper limit value.
*/
Py_ssize_t limit = (Py_ssize_t)(INT_MAX / 16);
Py_ssize_t nlocalsplus = PyTuple_GET_SIZE(con->localsplusnames);
if (nlocalsplus >= limit || con->stacksize >= limit - nlocalsplus) {
PyErr_SetString(PyExc_OverflowError,
"code: locals + stack size is too large");
return -1;
}
return 0;
}

Expand Down
Loading

[8]ページ先頭

©2009-2025 Movatter.jp