mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	gh-111178: fix UBSan failures in Objects/codeobject.c (GH-128240)
				
					
				
			This commit is contained in:
		
							parent
							
								
									8dfc743a1d
								
							
						
					
					
						commit
						4533036e50
					
				
					 1 changed files with 22 additions and 18 deletions
				
			
		|  | @ -108,6 +108,8 @@ PyCode_ClearWatcher(int watcher_id) | ||||||
|  * generic helpers |  * generic helpers | ||||||
|  ******************/ |  ******************/ | ||||||
| 
 | 
 | ||||||
|  | #define _PyCodeObject_CAST(op)  (assert(PyCode_Check(op)), (PyCodeObject *)(op)) | ||||||
|  | 
 | ||||||
| static int | static int | ||||||
| should_intern_string(PyObject *o) | should_intern_string(PyObject *o) | ||||||
| { | { | ||||||
|  | @ -1865,11 +1867,12 @@ free_monitoring_data(_PyCoMonitoringData *data) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void | static void | ||||||
| code_dealloc(PyCodeObject *co) | code_dealloc(PyObject *self) | ||||||
| { | { | ||||||
|     _PyObject_ResurrectStart((PyObject *)co); |     PyCodeObject *co = _PyCodeObject_CAST(self); | ||||||
|  |     _PyObject_ResurrectStart(self); | ||||||
|     notify_code_watchers(PY_CODE_EVENT_DESTROY, co); |     notify_code_watchers(PY_CODE_EVENT_DESTROY, co); | ||||||
|     if (_PyObject_ResurrectEnd((PyObject *)co)) { |     if (_PyObject_ResurrectEnd(self)) { | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | @ -1918,7 +1921,7 @@ code_dealloc(PyCodeObject *co) | ||||||
|         PyMem_Free(co->_co_cached); |         PyMem_Free(co->_co_cached); | ||||||
|     } |     } | ||||||
|     if (co->co_weakreflist != NULL) { |     if (co->co_weakreflist != NULL) { | ||||||
|         PyObject_ClearWeakRefs((PyObject*)co); |         PyObject_ClearWeakRefs(self); | ||||||
|     } |     } | ||||||
|     free_monitoring_data(co->_co_monitoring); |     free_monitoring_data(co->_co_monitoring); | ||||||
| #ifdef Py_GIL_DISABLED | #ifdef Py_GIL_DISABLED | ||||||
|  | @ -1939,7 +1942,7 @@ code_dealloc(PyCodeObject *co) | ||||||
| static int | static int | ||||||
| code_traverse(PyObject *self, visitproc visit, void *arg) | code_traverse(PyObject *self, visitproc visit, void *arg) | ||||||
| { | { | ||||||
|     PyCodeObject *co = (PyCodeObject*)self; |     PyCodeObject *co = _PyCodeObject_CAST(self); | ||||||
|     Py_VISIT(co->co_consts); |     Py_VISIT(co->co_consts); | ||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  | @ -1948,7 +1951,7 @@ code_traverse(PyObject *self, visitproc visit, void *arg) | ||||||
| static PyObject * | static PyObject * | ||||||
| code_repr(PyObject *self) | code_repr(PyObject *self) | ||||||
| { | { | ||||||
|     PyCodeObject *co = (PyCodeObject*)self; |     PyCodeObject *co = _PyCodeObject_CAST(self); | ||||||
|     int lineno; |     int lineno; | ||||||
|     if (co->co_firstlineno != 0) |     if (co->co_firstlineno != 0) | ||||||
|         lineno = co->co_firstlineno; |         lineno = co->co_firstlineno; | ||||||
|  | @ -2057,7 +2060,7 @@ code_richcompare(PyObject *self, PyObject *other, int op) | ||||||
| static Py_hash_t | static Py_hash_t | ||||||
| code_hash(PyObject *self) | code_hash(PyObject *self) | ||||||
| { | { | ||||||
|     PyCodeObject *co = (PyCodeObject*)self; |     PyCodeObject *co = _PyCodeObject_CAST(self); | ||||||
|     Py_uhash_t uhash = 20221211; |     Py_uhash_t uhash = 20221211; | ||||||
|     #define SCRAMBLE_IN(H) do {       \ |     #define SCRAMBLE_IN(H) do {       \ | ||||||
|         uhash ^= (Py_uhash_t)(H);     \ |         uhash ^= (Py_uhash_t)(H);     \ | ||||||
|  | @ -2120,7 +2123,7 @@ static PyMemberDef code_memberlist[] = { | ||||||
| static PyObject * | static PyObject * | ||||||
| code_getlnotab(PyObject *self, void *closure) | code_getlnotab(PyObject *self, void *closure) | ||||||
| { | { | ||||||
|     PyCodeObject *code = (PyCodeObject*)self; |     PyCodeObject *code = _PyCodeObject_CAST(self); | ||||||
|     if (PyErr_WarnEx(PyExc_DeprecationWarning, |     if (PyErr_WarnEx(PyExc_DeprecationWarning, | ||||||
|                      "co_lnotab is deprecated, use co_lines instead.", |                      "co_lnotab is deprecated, use co_lines instead.", | ||||||
|                      1) < 0) { |                      1) < 0) { | ||||||
|  | @ -2132,28 +2135,28 @@ code_getlnotab(PyObject *self, void *closure) | ||||||
| static PyObject * | static PyObject * | ||||||
| code_getvarnames(PyObject *self, void *closure) | code_getvarnames(PyObject *self, void *closure) | ||||||
| { | { | ||||||
|     PyCodeObject *code = (PyCodeObject*)self; |     PyCodeObject *code = _PyCodeObject_CAST(self); | ||||||
|     return _PyCode_GetVarnames(code); |     return _PyCode_GetVarnames(code); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static PyObject * | static PyObject * | ||||||
| code_getcellvars(PyObject *self, void *closure) | code_getcellvars(PyObject *self, void *closure) | ||||||
| { | { | ||||||
|     PyCodeObject *code = (PyCodeObject*)self; |     PyCodeObject *code = _PyCodeObject_CAST(self); | ||||||
|     return _PyCode_GetCellvars(code); |     return _PyCode_GetCellvars(code); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static PyObject * | static PyObject * | ||||||
| code_getfreevars(PyObject *self, void *closure) | code_getfreevars(PyObject *self, void *closure) | ||||||
| { | { | ||||||
|     PyCodeObject *code = (PyCodeObject*)self; |     PyCodeObject *code = _PyCodeObject_CAST(self); | ||||||
|     return _PyCode_GetFreevars(code); |     return _PyCode_GetFreevars(code); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static PyObject * | static PyObject * | ||||||
| code_getcodeadaptive(PyObject *self, void *closure) | code_getcodeadaptive(PyObject *self, void *closure) | ||||||
| { | { | ||||||
|     PyCodeObject *code = (PyCodeObject*)self; |     PyCodeObject *code = _PyCodeObject_CAST(self); | ||||||
|     return PyBytes_FromStringAndSize(code->co_code_adaptive, |     return PyBytes_FromStringAndSize(code->co_code_adaptive, | ||||||
|                                      _PyCode_NBYTES(code)); |                                      _PyCode_NBYTES(code)); | ||||||
| } | } | ||||||
|  | @ -2161,7 +2164,7 @@ code_getcodeadaptive(PyObject *self, void *closure) | ||||||
| static PyObject * | static PyObject * | ||||||
| code_getcode(PyObject *self, void *closure) | code_getcode(PyObject *self, void *closure) | ||||||
| { | { | ||||||
|     PyCodeObject *code = (PyCodeObject*)self; |     PyCodeObject *code = _PyCodeObject_CAST(self); | ||||||
|     return _PyCode_GetCode(code); |     return _PyCode_GetCode(code); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -2180,7 +2183,7 @@ static PyGetSetDef code_getsetlist[] = { | ||||||
| static PyObject * | static PyObject * | ||||||
| code_sizeof(PyObject *self, PyObject *Py_UNUSED(args)) | code_sizeof(PyObject *self, PyObject *Py_UNUSED(args)) | ||||||
| { | { | ||||||
|     PyCodeObject *co = (PyCodeObject*)self; |     PyCodeObject *co = _PyCodeObject_CAST(self); | ||||||
|     size_t res = _PyObject_VAR_SIZE(Py_TYPE(co), Py_SIZE(co)); |     size_t res = _PyObject_VAR_SIZE(Py_TYPE(co), Py_SIZE(co)); | ||||||
|     _PyCodeObjectExtra *co_extra = (_PyCodeObjectExtra*) co->co_extra; |     _PyCodeObjectExtra *co_extra = (_PyCodeObjectExtra*) co->co_extra; | ||||||
|     if (co_extra != NULL) { |     if (co_extra != NULL) { | ||||||
|  | @ -2193,13 +2196,14 @@ code_sizeof(PyObject *self, PyObject *Py_UNUSED(args)) | ||||||
| static PyObject * | static PyObject * | ||||||
| code_linesiterator(PyObject *self, PyObject *Py_UNUSED(args)) | code_linesiterator(PyObject *self, PyObject *Py_UNUSED(args)) | ||||||
| { | { | ||||||
|     PyCodeObject *code = (PyCodeObject*)self; |     PyCodeObject *code = _PyCodeObject_CAST(self); | ||||||
|     return (PyObject *)new_linesiterator(code); |     return (PyObject *)new_linesiterator(code); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static PyObject * | static PyObject * | ||||||
| code_branchesiterator(PyCodeObject *code, PyObject *Py_UNUSED(args)) | code_branchesiterator(PyObject *self, PyObject *Py_UNUSED(args)) | ||||||
| { | { | ||||||
|  |     PyCodeObject *code = _PyCodeObject_CAST(self); | ||||||
|     return _PyInstrumentation_BranchesIterator(code); |     return _PyInstrumentation_BranchesIterator(code); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -2343,7 +2347,7 @@ code__varname_from_oparg_impl(PyCodeObject *self, int oparg) | ||||||
| static struct PyMethodDef code_methods[] = { | static struct PyMethodDef code_methods[] = { | ||||||
|     {"__sizeof__", code_sizeof, METH_NOARGS}, |     {"__sizeof__", code_sizeof, METH_NOARGS}, | ||||||
|     {"co_lines", code_linesiterator, METH_NOARGS}, |     {"co_lines", code_linesiterator, METH_NOARGS}, | ||||||
|     {"co_branches", (PyCFunction)code_branchesiterator, METH_NOARGS}, |     {"co_branches", code_branchesiterator, METH_NOARGS}, | ||||||
|     {"co_positions", code_positionsiterator, METH_NOARGS}, |     {"co_positions", code_positionsiterator, METH_NOARGS}, | ||||||
|     CODE_REPLACE_METHODDEF |     CODE_REPLACE_METHODDEF | ||||||
|     CODE__VARNAME_FROM_OPARG_METHODDEF |     CODE__VARNAME_FROM_OPARG_METHODDEF | ||||||
|  | @ -2358,7 +2362,7 @@ PyTypeObject PyCode_Type = { | ||||||
|     "code", |     "code", | ||||||
|     offsetof(PyCodeObject, co_code_adaptive), |     offsetof(PyCodeObject, co_code_adaptive), | ||||||
|     sizeof(_Py_CODEUNIT), |     sizeof(_Py_CODEUNIT), | ||||||
|     (destructor)code_dealloc,           /* tp_dealloc */ |     code_dealloc,                       /* tp_dealloc */ | ||||||
|     0,                                  /* tp_vectorcall_offset */ |     0,                                  /* tp_vectorcall_offset */ | ||||||
|     0,                                  /* tp_getattr */ |     0,                                  /* tp_getattr */ | ||||||
|     0,                                  /* tp_setattr */ |     0,                                  /* tp_setattr */ | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Bénédikt Tran
						Bénédikt Tran