mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 21:51:50 +00:00 
			
		
		
		
	bpo-35972: _xxsubinterpreters: Fix potential integer truncation on 32-bit in channel_send() (gh-11822)
This commit is contained in:
		
							parent
							
								
									b01786c881
								
							
						
					
					
						commit
						16f842da3c
					
				
					 2 changed files with 19 additions and 3 deletions
				
			
		|  | @ -393,7 +393,19 @@ def test_bytes(self): | ||||||
|                             for i in range(-1, 258)) |                             for i in range(-1, 258)) | ||||||
| 
 | 
 | ||||||
|     def test_int(self): |     def test_int(self): | ||||||
|         self._assert_values(range(-1, 258)) |         self._assert_values(itertools.chain(range(-1, 258), | ||||||
|  |                                             [sys.maxsize, -sys.maxsize - 1])) | ||||||
|  | 
 | ||||||
|  |     def test_non_shareable_int(self): | ||||||
|  |         ints = [ | ||||||
|  |             sys.maxsize + 1, | ||||||
|  |             -sys.maxsize - 2, | ||||||
|  |             2**1000, | ||||||
|  |         ] | ||||||
|  |         for i in ints: | ||||||
|  |             with self.subTest(i): | ||||||
|  |                 with self.assertRaises(OverflowError): | ||||||
|  |                     interpreters.channel_send(self.cid, i) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| ################################## | ################################## | ||||||
|  |  | ||||||
|  | @ -1467,13 +1467,17 @@ _str_shared(PyObject *obj, _PyCrossInterpreterData *data) | ||||||
| static PyObject * | static PyObject * | ||||||
| _new_long_object(_PyCrossInterpreterData *data) | _new_long_object(_PyCrossInterpreterData *data) | ||||||
| { | { | ||||||
|     return PyLong_FromLongLong((intptr_t)(data->data)); |     return PyLong_FromSsize_t((Py_ssize_t)(data->data)); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static int | static int | ||||||
| _long_shared(PyObject *obj, _PyCrossInterpreterData *data) | _long_shared(PyObject *obj, _PyCrossInterpreterData *data) | ||||||
| { | { | ||||||
|     int64_t value = PyLong_AsLongLong(obj); |     /* Note that this means the size of shareable ints is bounded by
 | ||||||
|  |      * sys.maxsize.  Hence on 32-bit architectures that is half the | ||||||
|  |      * size of maximum shareable ints on 64-bit. | ||||||
|  |      */ | ||||||
|  |     Py_ssize_t value = PyLong_AsSsize_t(obj); | ||||||
|     if (value == -1 && PyErr_Occurred()) { |     if (value == -1 && PyErr_Occurred()) { | ||||||
|         if (PyErr_ExceptionMatches(PyExc_OverflowError)) { |         if (PyErr_ExceptionMatches(PyExc_OverflowError)) { | ||||||
|             PyErr_SetString(PyExc_OverflowError, "try sending as bytes"); |             PyErr_SetString(PyExc_OverflowError, "try sending as bytes"); | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Alexey Izbyshev
						Alexey Izbyshev