mirror of
https://github.com/python/cpython.git
synced 2025-08-04 00:48:58 +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