mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	gh-140517: fix leak in map_next in strict mode (#140543)
				
					
				
			This commit is contained in:
		
							parent
							
								
									95e5d59630
								
							
						
					
					
						commit
						be5af997f3
					
				
					 2 changed files with 41 additions and 19 deletions
				
			
		|  | @ -1501,34 +1501,27 @@ map_next(PyObject *self) | |||
|     } | ||||
| 
 | ||||
|     Py_ssize_t nargs = 0; | ||||
|     for (i=0; i < niters; i++) { | ||||
|     for (i = 0; i < niters; i++) { | ||||
|         PyObject *it = PyTuple_GET_ITEM(lz->iters, i); | ||||
|         PyObject *val = Py_TYPE(it)->tp_iternext(it); | ||||
|         if (val == NULL) { | ||||
|             if (lz->strict) { | ||||
|                 goto check; | ||||
|             } | ||||
|             goto exit; | ||||
|             goto exit_no_result; | ||||
|         } | ||||
|         stack[i] = val; | ||||
|         nargs++; | ||||
|     } | ||||
| 
 | ||||
|     result = _PyObject_VectorcallTstate(tstate, lz->func, stack, nargs, NULL); | ||||
|     goto exit; | ||||
| 
 | ||||
| exit: | ||||
|     for (i=0; i < nargs; i++) { | ||||
|         Py_DECREF(stack[i]); | ||||
|     } | ||||
|     if (stack != small_stack) { | ||||
|         PyMem_Free(stack); | ||||
|     } | ||||
|     return result; | ||||
| check: | ||||
|     if (PyErr_Occurred()) { | ||||
|         if (!PyErr_ExceptionMatches(PyExc_StopIteration)) { | ||||
|             // next() on argument i raised an exception (not StopIteration)
 | ||||
|             return NULL; | ||||
|             goto exit_no_result; | ||||
|         } | ||||
|         PyErr_Clear(); | ||||
|     } | ||||
|  | @ -1536,9 +1529,10 @@ map_next(PyObject *self) | |||
|         // ValueError: map() argument 2 is shorter than argument 1
 | ||||
|         // ValueError: map() argument 3 is shorter than arguments 1-2
 | ||||
|         const char* plural = i == 1 ? " " : "s 1-"; | ||||
|         return PyErr_Format(PyExc_ValueError, | ||||
|                             "map() argument %d is shorter than argument%s%d", | ||||
|                             i + 1, plural, i); | ||||
|         PyErr_Format(PyExc_ValueError, | ||||
|                      "map() argument %d is shorter than argument%s%d", | ||||
|                      i + 1, plural, i); | ||||
|         goto exit_no_result; | ||||
|     } | ||||
|     for (i = 1; i < niters; i++) { | ||||
|         PyObject *it = PyTuple_GET_ITEM(lz->iters, i); | ||||
|  | @ -1546,21 +1540,33 @@ map_next(PyObject *self) | |||
|         if (val) { | ||||
|             Py_DECREF(val); | ||||
|             const char* plural = i == 1 ? " " : "s 1-"; | ||||
|             return PyErr_Format(PyExc_ValueError, | ||||
|                                 "map() argument %d is longer than argument%s%d", | ||||
|                                 i + 1, plural, i); | ||||
|             PyErr_Format(PyExc_ValueError, | ||||
|                          "map() argument %d is longer than argument%s%d", | ||||
|                          i + 1, plural, i); | ||||
|             goto exit_no_result; | ||||
|         } | ||||
|         if (PyErr_Occurred()) { | ||||
|             if (!PyErr_ExceptionMatches(PyExc_StopIteration)) { | ||||
|                 // next() on argument i raised an exception (not StopIteration)
 | ||||
|                 return NULL; | ||||
|                 goto exit_no_result; | ||||
|             } | ||||
|             PyErr_Clear(); | ||||
|         } | ||||
|         // Argument i is exhausted. So far so good...
 | ||||
|     } | ||||
|     // All arguments are exhausted. Success!
 | ||||
|     goto exit; | ||||
| 
 | ||||
| exit_no_result: | ||||
|     assert(result == NULL); | ||||
| 
 | ||||
| exit: | ||||
|     for (i = 0; i < nargs; i++) { | ||||
|         Py_DECREF(stack[i]); | ||||
|     } | ||||
|     if (stack != small_stack) { | ||||
|         PyMem_Free(stack); | ||||
|     } | ||||
|     return result; | ||||
| } | ||||
| 
 | ||||
| static PyObject * | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Mikhail Efimov
						Mikhail Efimov