mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Return msgbug on error is enough.
This commit is contained in:
		
							parent
							
								
									a093d0d6a9
								
							
						
					
					
						commit
						6ab8e8298e
					
				
					 1 changed files with 41 additions and 38 deletions
				
			
		|  | @ -611,6 +611,7 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, | ||||||
|         *q=s; \ |         *q=s; \ | ||||||
|     } |     } | ||||||
| #define BUFFER_LEN      ((flags & FLAG_SIZE_T) ? *q2:*q) | #define BUFFER_LEN      ((flags & FLAG_SIZE_T) ? *q2:*q) | ||||||
|  | #define RETURN_ERR_OCCURRED return msgbuf | ||||||
| 
 | 
 | ||||||
|     const char *format = *p_format; |     const char *format = *p_format; | ||||||
|     char c = *format++; |     char c = *format++; | ||||||
|  | @ -622,19 +623,19 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, | ||||||
|         char *p = va_arg(*p_va, char *); |         char *p = va_arg(*p_va, char *); | ||||||
|         long ival; |         long ival; | ||||||
|         if (float_argument_error(arg)) |         if (float_argument_error(arg)) | ||||||
|             return converterr("integer<b>", arg, msgbuf, bufsize); |             RETURN_ERR_OCCURRED; | ||||||
|         ival = PyLong_AsLong(arg); |         ival = PyLong_AsLong(arg); | ||||||
|         if (ival == -1 && PyErr_Occurred()) |         if (ival == -1 && PyErr_Occurred()) | ||||||
|             return converterr("integer<b>", arg, msgbuf, bufsize); |             RETURN_ERR_OCCURRED; | ||||||
|         else if (ival < 0) { |         else if (ival < 0) { | ||||||
|             PyErr_SetString(PyExc_OverflowError, |             PyErr_SetString(PyExc_OverflowError, | ||||||
|                             "unsigned byte integer is less than minimum"); |                             "unsigned byte integer is less than minimum"); | ||||||
|             return converterr("integer<b>", arg, msgbuf, bufsize); |             RETURN_ERR_OCCURRED; | ||||||
|         } |         } | ||||||
|         else if (ival > UCHAR_MAX) { |         else if (ival > UCHAR_MAX) { | ||||||
|             PyErr_SetString(PyExc_OverflowError, |             PyErr_SetString(PyExc_OverflowError, | ||||||
|                             "unsigned byte integer is greater than maximum"); |                             "unsigned byte integer is greater than maximum"); | ||||||
|             return converterr("integer<b>", arg, msgbuf, bufsize); |             RETURN_ERR_OCCURRED; | ||||||
|         } |         } | ||||||
|         else |         else | ||||||
|             *p = (unsigned char) ival; |             *p = (unsigned char) ival; | ||||||
|  | @ -646,10 +647,10 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, | ||||||
|         char *p = va_arg(*p_va, char *); |         char *p = va_arg(*p_va, char *); | ||||||
|         long ival; |         long ival; | ||||||
|         if (float_argument_error(arg)) |         if (float_argument_error(arg)) | ||||||
|             return converterr("integer<B>", arg, msgbuf, bufsize); |             RETURN_ERR_OCCURRED; | ||||||
|         ival = PyLong_AsUnsignedLongMask(arg); |         ival = PyLong_AsUnsignedLongMask(arg); | ||||||
|         if (ival == -1 && PyErr_Occurred()) |         if (ival == -1 && PyErr_Occurred()) | ||||||
|             return converterr("integer<B>", arg, msgbuf, bufsize); |             RETURN_ERR_OCCURRED; | ||||||
|         else |         else | ||||||
|             *p = (unsigned char) ival; |             *p = (unsigned char) ival; | ||||||
|         break; |         break; | ||||||
|  | @ -659,19 +660,19 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, | ||||||
|         short *p = va_arg(*p_va, short *); |         short *p = va_arg(*p_va, short *); | ||||||
|         long ival; |         long ival; | ||||||
|         if (float_argument_error(arg)) |         if (float_argument_error(arg)) | ||||||
|             return converterr("integer<h>", arg, msgbuf, bufsize); |             RETURN_ERR_OCCURRED; | ||||||
|         ival = PyLong_AsLong(arg); |         ival = PyLong_AsLong(arg); | ||||||
|         if (ival == -1 && PyErr_Occurred()) |         if (ival == -1 && PyErr_Occurred()) | ||||||
|             return converterr("integer<h>", arg, msgbuf, bufsize); |             RETURN_ERR_OCCURRED; | ||||||
|         else if (ival < SHRT_MIN) { |         else if (ival < SHRT_MIN) { | ||||||
|             PyErr_SetString(PyExc_OverflowError, |             PyErr_SetString(PyExc_OverflowError, | ||||||
|                             "signed short integer is less than minimum"); |                             "signed short integer is less than minimum"); | ||||||
|             return converterr("integer<h>", arg, msgbuf, bufsize); |             RETURN_ERR_OCCURRED; | ||||||
|         } |         } | ||||||
|         else if (ival > SHRT_MAX) { |         else if (ival > SHRT_MAX) { | ||||||
|             PyErr_SetString(PyExc_OverflowError, |             PyErr_SetString(PyExc_OverflowError, | ||||||
|                             "signed short integer is greater than maximum"); |                             "signed short integer is greater than maximum"); | ||||||
|             return converterr("integer<h>", arg, msgbuf, bufsize); |             RETURN_ERR_OCCURRED; | ||||||
|         } |         } | ||||||
|         else |         else | ||||||
|             *p = (short) ival; |             *p = (short) ival; | ||||||
|  | @ -683,10 +684,10 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, | ||||||
|         unsigned short *p = va_arg(*p_va, unsigned short *); |         unsigned short *p = va_arg(*p_va, unsigned short *); | ||||||
|         long ival; |         long ival; | ||||||
|         if (float_argument_error(arg)) |         if (float_argument_error(arg)) | ||||||
|             return converterr("integer<H>", arg, msgbuf, bufsize); |             RETURN_ERR_OCCURRED; | ||||||
|         ival = PyLong_AsUnsignedLongMask(arg); |         ival = PyLong_AsUnsignedLongMask(arg); | ||||||
|         if (ival == -1 && PyErr_Occurred()) |         if (ival == -1 && PyErr_Occurred()) | ||||||
|             return converterr("integer<H>", arg, msgbuf, bufsize); |             RETURN_ERR_OCCURRED; | ||||||
|         else |         else | ||||||
|             *p = (unsigned short) ival; |             *p = (unsigned short) ival; | ||||||
|         break; |         break; | ||||||
|  | @ -696,19 +697,19 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, | ||||||
|         int *p = va_arg(*p_va, int *); |         int *p = va_arg(*p_va, int *); | ||||||
|         long ival; |         long ival; | ||||||
|         if (float_argument_error(arg)) |         if (float_argument_error(arg)) | ||||||
|             return converterr("integer<i>", arg, msgbuf, bufsize); |             RETURN_ERR_OCCURRED; | ||||||
|         ival = PyLong_AsLong(arg); |         ival = PyLong_AsLong(arg); | ||||||
|         if (ival == -1 && PyErr_Occurred()) |         if (ival == -1 && PyErr_Occurred()) | ||||||
|             return converterr("integer<i>", arg, msgbuf, bufsize); |             RETURN_ERR_OCCURRED; | ||||||
|         else if (ival > INT_MAX) { |         else if (ival > INT_MAX) { | ||||||
|             PyErr_SetString(PyExc_OverflowError, |             PyErr_SetString(PyExc_OverflowError, | ||||||
|                             "signed integer is greater than maximum"); |                             "signed integer is greater than maximum"); | ||||||
|             return converterr("integer<i>", arg, msgbuf, bufsize); |             RETURN_ERR_OCCURRED; | ||||||
|         } |         } | ||||||
|         else if (ival < INT_MIN) { |         else if (ival < INT_MIN) { | ||||||
|             PyErr_SetString(PyExc_OverflowError, |             PyErr_SetString(PyExc_OverflowError, | ||||||
|                             "signed integer is less than minimum"); |                             "signed integer is less than minimum"); | ||||||
|             return converterr("integer<i>", arg, msgbuf, bufsize); |             RETURN_ERR_OCCURRED; | ||||||
|         } |         } | ||||||
|         else |         else | ||||||
|             *p = ival; |             *p = ival; | ||||||
|  | @ -720,10 +721,10 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, | ||||||
|         unsigned int *p = va_arg(*p_va, unsigned int *); |         unsigned int *p = va_arg(*p_va, unsigned int *); | ||||||
|         unsigned int ival; |         unsigned int ival; | ||||||
|         if (float_argument_error(arg)) |         if (float_argument_error(arg)) | ||||||
|             return converterr("integer<I>", arg, msgbuf, bufsize); |             RETURN_ERR_OCCURRED; | ||||||
|         ival = (unsigned int)PyLong_AsUnsignedLongMask(arg); |         ival = (unsigned int)PyLong_AsUnsignedLongMask(arg); | ||||||
|         if (ival == (unsigned int)-1 && PyErr_Occurred()) |         if (ival == (unsigned int)-1 && PyErr_Occurred()) | ||||||
|             return converterr("integer<I>", arg, msgbuf, bufsize); |             RETURN_ERR_OCCURRED; | ||||||
|         else |         else | ||||||
|             *p = ival; |             *p = ival; | ||||||
|         break; |         break; | ||||||
|  | @ -735,14 +736,14 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, | ||||||
|         Py_ssize_t *p = va_arg(*p_va, Py_ssize_t *); |         Py_ssize_t *p = va_arg(*p_va, Py_ssize_t *); | ||||||
|         Py_ssize_t ival = -1; |         Py_ssize_t ival = -1; | ||||||
|         if (float_argument_error(arg)) |         if (float_argument_error(arg)) | ||||||
|             return converterr("integer<n>", arg, msgbuf, bufsize); |             RETURN_ERR_OCCURRED; | ||||||
|         iobj = PyNumber_Index(arg); |         iobj = PyNumber_Index(arg); | ||||||
|         if (iobj != NULL) { |         if (iobj != NULL) { | ||||||
|             ival = PyLong_AsSsize_t(iobj); |             ival = PyLong_AsSsize_t(iobj); | ||||||
|             Py_DECREF(iobj); |             Py_DECREF(iobj); | ||||||
|         } |         } | ||||||
|         if (ival == -1 && PyErr_Occurred()) |         if (ival == -1 && PyErr_Occurred()) | ||||||
|             return converterr("integer<n>", arg, msgbuf, bufsize); |             RETURN_ERR_OCCURRED; | ||||||
|         *p = ival; |         *p = ival; | ||||||
|         break; |         break; | ||||||
|     } |     } | ||||||
|  | @ -750,10 +751,10 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, | ||||||
|         long *p = va_arg(*p_va, long *); |         long *p = va_arg(*p_va, long *); | ||||||
|         long ival; |         long ival; | ||||||
|         if (float_argument_error(arg)) |         if (float_argument_error(arg)) | ||||||
|             return converterr("integer<l>", arg, msgbuf, bufsize); |             RETURN_ERR_OCCURRED; | ||||||
|         ival = PyLong_AsLong(arg); |         ival = PyLong_AsLong(arg); | ||||||
|         if (ival == -1 && PyErr_Occurred()) |         if (ival == -1 && PyErr_Occurred()) | ||||||
|             return converterr("integer<l>", arg, msgbuf, bufsize); |             RETURN_ERR_OCCURRED; | ||||||
|         else |         else | ||||||
|             *p = ival; |             *p = ival; | ||||||
|         break; |         break; | ||||||
|  | @ -775,10 +776,10 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, | ||||||
|         PY_LONG_LONG *p = va_arg( *p_va, PY_LONG_LONG * ); |         PY_LONG_LONG *p = va_arg( *p_va, PY_LONG_LONG * ); | ||||||
|         PY_LONG_LONG ival; |         PY_LONG_LONG ival; | ||||||
|         if (float_argument_error(arg)) |         if (float_argument_error(arg)) | ||||||
|             return converterr("long<L>", arg, msgbuf, bufsize); |             RETURN_ERR_OCCURRED; | ||||||
|         ival = PyLong_AsLongLong(arg); |         ival = PyLong_AsLongLong(arg); | ||||||
|         if (ival == (PY_LONG_LONG)-1 && PyErr_Occurred()) |         if (ival == (PY_LONG_LONG)-1 && PyErr_Occurred()) | ||||||
|             return converterr("long<L>", arg, msgbuf, bufsize); |             RETURN_ERR_OCCURRED; | ||||||
|         else |         else | ||||||
|             *p = ival; |             *p = ival; | ||||||
|         break; |         break; | ||||||
|  | @ -800,7 +801,7 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, | ||||||
|         float *p = va_arg(*p_va, float *); |         float *p = va_arg(*p_va, float *); | ||||||
|         double dval = PyFloat_AsDouble(arg); |         double dval = PyFloat_AsDouble(arg); | ||||||
|         if (PyErr_Occurred()) |         if (PyErr_Occurred()) | ||||||
|             return converterr("float<f>", arg, msgbuf, bufsize); |             RETURN_ERR_OCCURRED; | ||||||
|         else |         else | ||||||
|             *p = (float) dval; |             *p = (float) dval; | ||||||
|         break; |         break; | ||||||
|  | @ -810,7 +811,7 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, | ||||||
|         double *p = va_arg(*p_va, double *); |         double *p = va_arg(*p_va, double *); | ||||||
|         double dval = PyFloat_AsDouble(arg); |         double dval = PyFloat_AsDouble(arg); | ||||||
|         if (PyErr_Occurred()) |         if (PyErr_Occurred()) | ||||||
|             return converterr("float<d>", arg, msgbuf, bufsize); |             RETURN_ERR_OCCURRED; | ||||||
|         else |         else | ||||||
|             *p = dval; |             *p = dval; | ||||||
|         break; |         break; | ||||||
|  | @ -821,7 +822,7 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, | ||||||
|         Py_complex cval; |         Py_complex cval; | ||||||
|         cval = PyComplex_AsCComplex(arg); |         cval = PyComplex_AsCComplex(arg); | ||||||
|         if (PyErr_Occurred()) |         if (PyErr_Occurred()) | ||||||
|             return converterr("complex<D>", arg, msgbuf, bufsize); |             RETURN_ERR_OCCURRED; | ||||||
|         else |         else | ||||||
|             *p = cval; |             *p = cval; | ||||||
|         break; |         break; | ||||||
|  | @ -1107,9 +1108,7 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, | ||||||
|                 if (*buffer == NULL) { |                 if (*buffer == NULL) { | ||||||
|                     Py_DECREF(s); |                     Py_DECREF(s); | ||||||
|                     PyErr_NoMemory(); |                     PyErr_NoMemory(); | ||||||
|                     return converterr( |                     RETURN_ERR_OCCURRED; | ||||||
|                         "(memory error)", |  | ||||||
|                         arg, msgbuf, bufsize); |  | ||||||
|                 } |                 } | ||||||
|                 if (addcleanup(*buffer, freelist, 0)) { |                 if (addcleanup(*buffer, freelist, 0)) { | ||||||
|                     Py_DECREF(s); |                     Py_DECREF(s); | ||||||
|  | @ -1151,8 +1150,7 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, | ||||||
|             if (*buffer == NULL) { |             if (*buffer == NULL) { | ||||||
|                 Py_DECREF(s); |                 Py_DECREF(s); | ||||||
|                 PyErr_NoMemory(); |                 PyErr_NoMemory(); | ||||||
|                 return converterr("(memory error)", |                 RETURN_ERR_OCCURRED; | ||||||
|                                   arg, msgbuf, bufsize); |  | ||||||
|             } |             } | ||||||
|             if (addcleanup(*buffer, freelist, 0)) { |             if (addcleanup(*buffer, freelist, 0)) { | ||||||
|                 Py_DECREF(s); |                 Py_DECREF(s); | ||||||
|  | @ -1261,6 +1259,11 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, | ||||||
| 
 | 
 | ||||||
|     *p_format = format; |     *p_format = format; | ||||||
|     return NULL; |     return NULL; | ||||||
|  | 
 | ||||||
|  | #undef FETCH_SIZE | ||||||
|  | #undef STORE_SIZE | ||||||
|  | #undef BUFFER_LEN | ||||||
|  | #undef RETURN_ERR_OCCURRED | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static Py_ssize_t | static Py_ssize_t | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Victor Stinner
						Victor Stinner