mirror of
				https://github.com/python/cpython.git
				synced 2025-10-25 18:54:53 +00:00 
			
		
		
		
	bpo-31393: Fix the use of PyUnicode_READY(). (#3451)
This commit is contained in:
		
							parent
							
								
									70c2dd306f
								
							
						
					
					
						commit
						e3b2b4b8d9
					
				
					 5 changed files with 30 additions and 14 deletions
				
			
		|  | @ -1467,7 +1467,10 @@ idna_converter(PyObject *obj, struct maybe_idna *data) | |||
|         len = PyByteArray_Size(obj); | ||||
|     } | ||||
|     else if (PyUnicode_Check(obj)) { | ||||
|         if (PyUnicode_READY(obj) == 0 && PyUnicode_IS_COMPACT_ASCII(obj)) { | ||||
|         if (PyUnicode_READY(obj) == -1) { | ||||
|             return 0; | ||||
|         } | ||||
|         if (PyUnicode_IS_COMPACT_ASCII(obj)) { | ||||
|             data->buf = PyUnicode_DATA(obj); | ||||
|             len = PyUnicode_GET_LENGTH(obj); | ||||
|         } | ||||
|  |  | |||
|  | @ -27,7 +27,7 @@ all_name_chars(PyObject *o) | |||
|     }; | ||||
|     const unsigned char *s, *e; | ||||
| 
 | ||||
|     if (PyUnicode_READY(o) == -1 || !PyUnicode_IS_ASCII(o)) | ||||
|     if (!PyUnicode_IS_ASCII(o)) | ||||
|         return 0; | ||||
| 
 | ||||
|     s = PyUnicode_1BYTE_DATA(o); | ||||
|  | @ -63,6 +63,10 @@ intern_string_constants(PyObject *tuple) | |||
|     for (i = PyTuple_GET_SIZE(tuple); --i >= 0; ) { | ||||
|         PyObject *v = PyTuple_GET_ITEM(tuple, i); | ||||
|         if (PyUnicode_CheckExact(v)) { | ||||
|             if (PyUnicode_READY(v) == -1) { | ||||
|                 PyErr_Clear(); | ||||
|                 continue; | ||||
|             } | ||||
|             if (all_name_chars(v)) { | ||||
|                 PyObject *w = v; | ||||
|                 PyUnicode_InternInPlace(&v); | ||||
|  |  | |||
|  | @ -32,7 +32,7 @@ class object "PyObject *" "&PyBaseObject_Type" | |||
|                     ((PyASCIIObject *)(name))->hash) | ||||
| #define MCACHE_CACHEABLE_NAME(name)                             \ | ||||
|         PyUnicode_CheckExact(name) &&                           \ | ||||
|         PyUnicode_READY(name) != -1 &&                      \ | ||||
|         PyUnicode_IS_READY(name) &&                             \ | ||||
|         PyUnicode_GET_LENGTH(name) <= MCACHE_MAX_ATTR_SIZE | ||||
| 
 | ||||
| struct method_cache_entry { | ||||
|  |  | |||
|  | @ -4185,10 +4185,13 @@ PyUnicode_ReadChar(PyObject *unicode, Py_ssize_t index) | |||
|     void *data; | ||||
|     int kind; | ||||
| 
 | ||||
|     if (!PyUnicode_Check(unicode) || PyUnicode_READY(unicode) == -1) { | ||||
|     if (!PyUnicode_Check(unicode)) { | ||||
|         PyErr_BadArgument(); | ||||
|         return (Py_UCS4)-1; | ||||
|     } | ||||
|     if (PyUnicode_READY(unicode) == -1) { | ||||
|         return (Py_UCS4)-1; | ||||
|     } | ||||
|     if (index < 0 || index >= PyUnicode_GET_LENGTH(unicode)) { | ||||
|         PyErr_SetString(PyExc_IndexError, "string index out of range"); | ||||
|         return (Py_UCS4)-1; | ||||
|  | @ -11668,10 +11671,13 @@ unicode_getitem(PyObject *self, Py_ssize_t index) | |||
|     enum PyUnicode_Kind kind; | ||||
|     Py_UCS4 ch; | ||||
| 
 | ||||
|     if (!PyUnicode_Check(self) || PyUnicode_READY(self) == -1) { | ||||
|     if (!PyUnicode_Check(self)) { | ||||
|         PyErr_BadArgument(); | ||||
|         return NULL; | ||||
|     } | ||||
|     if (PyUnicode_READY(self) == -1) { | ||||
|         return NULL; | ||||
|     } | ||||
|     if (index < 0 || index >= PyUnicode_GET_LENGTH(self)) { | ||||
|         PyErr_SetString(PyExc_IndexError, "string index out of range"); | ||||
|         return NULL; | ||||
|  |  | |||
|  | @ -5017,14 +5017,17 @@ import_all_from(PyObject *locals, PyObject *v) | |||
|                 PyErr_Clear(); | ||||
|             break; | ||||
|         } | ||||
|         if (skip_leading_underscores && | ||||
|             PyUnicode_Check(name) && | ||||
|             PyUnicode_READY(name) != -1 && | ||||
|             PyUnicode_READ_CHAR(name, 0) == '_') | ||||
|         { | ||||
|         if (skip_leading_underscores && PyUnicode_Check(name)) { | ||||
|             if (PyUnicode_READY(name) == -1) { | ||||
|                 Py_DECREF(name); | ||||
|                 err = -1; | ||||
|                 break; | ||||
|             } | ||||
|             if (PyUnicode_READ_CHAR(name, 0) == '_') { | ||||
|                 Py_DECREF(name); | ||||
|                 continue; | ||||
|             } | ||||
|         } | ||||
|         value = PyObject_GetAttr(v, name); | ||||
|         if (value == NULL) | ||||
|             err = -1; | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Serhiy Storchaka
						Serhiy Storchaka