mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 05:31:20 +00:00 
			
		
		
		
	Issue #28439: Remove redundant checks in PyUnicode_EncodeLocale and
PyUnicode_DecodeLocaleAndSize. Patch by Xiang Zhang.
This commit is contained in:
		
							parent
							
								
									d3ff784f2d
								
							
						
					
					
						commit
						2fbc019c8c
					
				
					 1 changed files with 19 additions and 26 deletions
				
			
		|  | @ -3400,11 +3400,9 @@ PyUnicode_EncodeLocale(PyObject *unicode, const char *errors) | ||||||
| { | { | ||||||
|     Py_ssize_t wlen, wlen2; |     Py_ssize_t wlen, wlen2; | ||||||
|     wchar_t *wstr; |     wchar_t *wstr; | ||||||
|     PyObject *bytes = NULL; |  | ||||||
|     char *errmsg; |     char *errmsg; | ||||||
|     PyObject *reason = NULL; |     PyObject *bytes, *reason, *exc; | ||||||
|     PyObject *exc; |     size_t error_pos, errlen; | ||||||
|     size_t error_pos; |  | ||||||
|     int surrogateescape; |     int surrogateescape; | ||||||
| 
 | 
 | ||||||
|     if (locale_error_handler(errors, &surrogateescape) < 0) |     if (locale_error_handler(errors, &surrogateescape) < 0) | ||||||
|  | @ -3459,6 +3457,7 @@ PyUnicode_EncodeLocale(PyObject *unicode, const char *errors) | ||||||
| 
 | 
 | ||||||
|         len2 = wcstombs(PyBytes_AS_STRING(bytes), wstr, len+1); |         len2 = wcstombs(PyBytes_AS_STRING(bytes), wstr, len+1); | ||||||
|         if (len2 == (size_t)-1 || len2 > len) { |         if (len2 == (size_t)-1 || len2 > len) { | ||||||
|  |             Py_DECREF(bytes); | ||||||
|             error_pos = (size_t)-1; |             error_pos = (size_t)-1; | ||||||
|             goto encode_error; |             goto encode_error; | ||||||
|         } |         } | ||||||
|  | @ -3474,17 +3473,15 @@ PyUnicode_EncodeLocale(PyObject *unicode, const char *errors) | ||||||
|         error_pos = wcstombs_errorpos(wstr); |         error_pos = wcstombs_errorpos(wstr); | ||||||
| 
 | 
 | ||||||
|     PyMem_Free(wstr); |     PyMem_Free(wstr); | ||||||
|     Py_XDECREF(bytes); |  | ||||||
| 
 | 
 | ||||||
|     if (errmsg != NULL) { |     wstr = Py_DecodeLocale(errmsg, &errlen); | ||||||
|         size_t errlen; |     if (wstr != NULL) { | ||||||
|         wstr = Py_DecodeLocale(errmsg, &errlen); |         reason = PyUnicode_FromWideChar(wstr, errlen); | ||||||
|         if (wstr != NULL) { |         PyMem_RawFree(wstr); | ||||||
|             reason = PyUnicode_FromWideChar(wstr, errlen); |     } else { | ||||||
|             PyMem_RawFree(wstr); |         errmsg = NULL; | ||||||
|         } else |  | ||||||
|             errmsg = NULL; |  | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|     if (errmsg == NULL) |     if (errmsg == NULL) | ||||||
|         reason = PyUnicode_FromString( |         reason = PyUnicode_FromString( | ||||||
|             "wcstombs() encountered an unencodable " |             "wcstombs() encountered an unencodable " | ||||||
|  | @ -3500,7 +3497,7 @@ PyUnicode_EncodeLocale(PyObject *unicode, const char *errors) | ||||||
|     Py_DECREF(reason); |     Py_DECREF(reason); | ||||||
|     if (exc != NULL) { |     if (exc != NULL) { | ||||||
|         PyCodec_StrictErrors(exc); |         PyCodec_StrictErrors(exc); | ||||||
|         Py_XDECREF(exc); |         Py_DECREF(exc); | ||||||
|     } |     } | ||||||
|     return NULL; |     return NULL; | ||||||
| } | } | ||||||
|  | @ -3702,10 +3699,9 @@ PyUnicode_DecodeLocaleAndSize(const char *str, Py_ssize_t len, | ||||||
|     size_t wlen, wlen2; |     size_t wlen, wlen2; | ||||||
|     PyObject *unicode; |     PyObject *unicode; | ||||||
|     int surrogateescape; |     int surrogateescape; | ||||||
|     size_t error_pos; |     size_t error_pos, errlen; | ||||||
|     char *errmsg; |     char *errmsg; | ||||||
|     PyObject *reason = NULL;   /* initialize to prevent gcc warning */ |     PyObject *exc, *reason = NULL;   /* initialize to prevent gcc warning */ | ||||||
|     PyObject *exc; |  | ||||||
| 
 | 
 | ||||||
|     if (locale_error_handler(errors, &surrogateescape) < 0) |     if (locale_error_handler(errors, &surrogateescape) < 0) | ||||||
|         return NULL; |         return NULL; | ||||||
|  | @ -3763,19 +3759,16 @@ PyUnicode_DecodeLocaleAndSize(const char *str, Py_ssize_t len, | ||||||
|     return unicode; |     return unicode; | ||||||
| 
 | 
 | ||||||
| decode_error: | decode_error: | ||||||
|     reason = NULL; |  | ||||||
|     errmsg = strerror(errno); |     errmsg = strerror(errno); | ||||||
|     assert(errmsg != NULL); |     assert(errmsg != NULL); | ||||||
| 
 | 
 | ||||||
|     error_pos = mbstowcs_errorpos(str, len); |     error_pos = mbstowcs_errorpos(str, len); | ||||||
|     if (errmsg != NULL) { |     wstr = Py_DecodeLocale(errmsg, &errlen); | ||||||
|         size_t errlen; |     if (wstr != NULL) { | ||||||
|         wstr = Py_DecodeLocale(errmsg, &errlen); |         reason = PyUnicode_FromWideChar(wstr, errlen); | ||||||
|         if (wstr != NULL) { |         PyMem_RawFree(wstr); | ||||||
|             reason = PyUnicode_FromWideChar(wstr, errlen); |  | ||||||
|             PyMem_RawFree(wstr); |  | ||||||
|         } |  | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|     if (reason == NULL) |     if (reason == NULL) | ||||||
|         reason = PyUnicode_FromString( |         reason = PyUnicode_FromString( | ||||||
|             "mbstowcs() encountered an invalid multibyte sequence"); |             "mbstowcs() encountered an invalid multibyte sequence"); | ||||||
|  | @ -3790,7 +3783,7 @@ PyUnicode_DecodeLocaleAndSize(const char *str, Py_ssize_t len, | ||||||
|     Py_DECREF(reason); |     Py_DECREF(reason); | ||||||
|     if (exc != NULL) { |     if (exc != NULL) { | ||||||
|         PyCodec_StrictErrors(exc); |         PyCodec_StrictErrors(exc); | ||||||
|         Py_XDECREF(exc); |         Py_DECREF(exc); | ||||||
|     } |     } | ||||||
|     return NULL; |     return NULL; | ||||||
| } | } | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Serhiy Storchaka
						Serhiy Storchaka