mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	Prevent expandtabs() on string and unicode objects from causing a segfault when
a large width is passed on 32-bit platforms. Found by Google. It would be good for people to review this especially carefully and verify I don't have an off by one error and there is no other way to cause overflow.
This commit is contained in:
		
							parent
							
								
									ea7f88e3d9
								
							
						
					
					
						commit
						7dbd2a3720
					
				
					 5 changed files with 49 additions and 8 deletions
				
			
		|  | @ -5690,7 +5690,7 @@ unicode_expandtabs(PyUnicodeObject *self, PyObject *args) | |||
|     Py_UNICODE *e; | ||||
|     Py_UNICODE *p; | ||||
|     Py_UNICODE *q; | ||||
|     Py_ssize_t i, j; | ||||
|     Py_ssize_t i, j, old_j; | ||||
|     PyUnicodeObject *u; | ||||
|     int tabsize = 8; | ||||
| 
 | ||||
|  | @ -5698,12 +5698,18 @@ unicode_expandtabs(PyUnicodeObject *self, PyObject *args) | |||
| 	return NULL; | ||||
| 
 | ||||
|     /* First pass: determine size of output string */ | ||||
|     i = j = 0; | ||||
|     i = j = old_j = 0; | ||||
|     e = self->str + self->length; | ||||
|     for (p = self->str; p < e; p++) | ||||
|         if (*p == '\t') { | ||||
| 	    if (tabsize > 0) | ||||
| 	    if (tabsize > 0) { | ||||
| 		j += tabsize - (j % tabsize); | ||||
| 		if (old_j > j) { | ||||
| 		    PyErr_SetString(PyExc_OverflowError, "new string is too long"); | ||||
| 		    return NULL; | ||||
| 		} | ||||
| 		old_j = j; | ||||
| 	    } | ||||
| 	} | ||||
|         else { | ||||
|             j++; | ||||
|  | @ -5713,6 +5719,11 @@ unicode_expandtabs(PyUnicodeObject *self, PyObject *args) | |||
|             } | ||||
|         } | ||||
| 
 | ||||
|     if ((i + j) < 0) { | ||||
|         PyErr_SetString(PyExc_OverflowError, "new string is too long"); | ||||
|         return NULL; | ||||
|     } | ||||
| 
 | ||||
|     /* Second pass: create output string and fill it */ | ||||
|     u = _PyUnicode_New(i + j); | ||||
|     if (!u) | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Neal Norwitz
						Neal Norwitz