mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +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)) | ||||
| 
 | ||||
|     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 * | ||||
| _new_long_object(_PyCrossInterpreterData *data) | ||||
| { | ||||
|     return PyLong_FromLongLong((intptr_t)(data->data)); | ||||
|     return PyLong_FromSsize_t((Py_ssize_t)(data->data)); | ||||
| } | ||||
| 
 | ||||
| static int | ||||
| _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 (PyErr_ExceptionMatches(PyExc_OverflowError)) { | ||||
|             PyErr_SetString(PyExc_OverflowError, "try sending as bytes"); | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Alexey Izbyshev
						Alexey Izbyshev