Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 6ab8e82

Browse files
author
Victor Stinner
committed
Issue #8992: convertsimple() doesn't need to fill msgbuf if an error occurred
Return msgbug on error is enough.
1 parent a093d0d commit 6ab8e82

1 file changed

Lines changed: 41 additions & 38 deletions

File tree

Python/getargs.c

Lines changed: 41 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -611,6 +611,7 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
611611
*q=s; \
612612
}
613613
#define BUFFER_LEN ((flags & FLAG_SIZE_T) ? *q2:*q)
614+
#define RETURN_ERR_OCCURRED return msgbuf
614615

615616
const char *format = *p_format;
616617
char c = *format++;
@@ -622,19 +623,19 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
622623
char *p = va_arg(*p_va, char *);
623624
long ival;
624625
if (float_argument_error(arg))
625-
return converterr("integer<b>", arg, msgbuf, bufsize);
626+
RETURN_ERR_OCCURRED;
626627
ival = PyLong_AsLong(arg);
627628
if (ival == -1 && PyErr_Occurred())
628-
return converterr("integer<b>", arg, msgbuf, bufsize);
629+
RETURN_ERR_OCCURRED;
629630
else if (ival < 0) {
630631
PyErr_SetString(PyExc_OverflowError,
631-
"unsigned byte integer is less than minimum");
632-
return converterr("integer<b>", arg, msgbuf, bufsize);
632+
"unsigned byte integer is less than minimum");
633+
RETURN_ERR_OCCURRED;
633634
}
634635
else if (ival > UCHAR_MAX) {
635636
PyErr_SetString(PyExc_OverflowError,
636-
"unsigned byte integer is greater than maximum");
637-
return converterr("integer<b>", arg, msgbuf, bufsize);
637+
"unsigned byte integer is greater than maximum");
638+
RETURN_ERR_OCCURRED;
638639
}
639640
else
640641
*p = (unsigned char) ival;
@@ -646,10 +647,10 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
646647
char *p = va_arg(*p_va, char *);
647648
long ival;
648649
if (float_argument_error(arg))
649-
return converterr("integer<B>", arg, msgbuf, bufsize);
650+
RETURN_ERR_OCCURRED;
650651
ival = PyLong_AsUnsignedLongMask(arg);
651652
if (ival == -1 && PyErr_Occurred())
652-
return converterr("integer<B>", arg, msgbuf, bufsize);
653+
RETURN_ERR_OCCURRED;
653654
else
654655
*p = (unsigned char) ival;
655656
break;
@@ -659,19 +660,19 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
659660
short *p = va_arg(*p_va, short *);
660661
long ival;
661662
if (float_argument_error(arg))
662-
return converterr("integer<h>", arg, msgbuf, bufsize);
663+
RETURN_ERR_OCCURRED;
663664
ival = PyLong_AsLong(arg);
664665
if (ival == -1 && PyErr_Occurred())
665-
return converterr("integer<h>", arg, msgbuf, bufsize);
666+
RETURN_ERR_OCCURRED;
666667
else if (ival < SHRT_MIN) {
667668
PyErr_SetString(PyExc_OverflowError,
668-
"signed short integer is less than minimum");
669-
return converterr("integer<h>", arg, msgbuf, bufsize);
669+
"signed short integer is less than minimum");
670+
RETURN_ERR_OCCURRED;
670671
}
671672
else if (ival > SHRT_MAX) {
672673
PyErr_SetString(PyExc_OverflowError,
673-
"signed short integer is greater than maximum");
674-
return converterr("integer<h>", arg, msgbuf, bufsize);
674+
"signed short integer is greater than maximum");
675+
RETURN_ERR_OCCURRED;
675676
}
676677
else
677678
*p = (short) ival;
@@ -683,10 +684,10 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
683684
unsigned short *p = va_arg(*p_va, unsigned short *);
684685
long ival;
685686
if (float_argument_error(arg))
686-
return converterr("integer<H>", arg, msgbuf, bufsize);
687+
RETURN_ERR_OCCURRED;
687688
ival = PyLong_AsUnsignedLongMask(arg);
688689
if (ival == -1 && PyErr_Occurred())
689-
return converterr("integer<H>", arg, msgbuf, bufsize);
690+
RETURN_ERR_OCCURRED;
690691
else
691692
*p = (unsigned short) ival;
692693
break;
@@ -696,19 +697,19 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
696697
int *p = va_arg(*p_va, int *);
697698
long ival;
698699
if (float_argument_error(arg))
699-
return converterr("integer<i>", arg, msgbuf, bufsize);
700+
RETURN_ERR_OCCURRED;
700701
ival = PyLong_AsLong(arg);
701702
if (ival == -1 && PyErr_Occurred())
702-
return converterr("integer<i>", arg, msgbuf, bufsize);
703+
RETURN_ERR_OCCURRED;
703704
else if (ival > INT_MAX) {
704705
PyErr_SetString(PyExc_OverflowError,
705-
"signed integer is greater than maximum");
706-
return converterr("integer<i>", arg, msgbuf, bufsize);
706+
"signed integer is greater than maximum");
707+
RETURN_ERR_OCCURRED;
707708
}
708709
else if (ival < INT_MIN) {
709710
PyErr_SetString(PyExc_OverflowError,
710-
"signed integer is less than minimum");
711-
return converterr("integer<i>", arg, msgbuf, bufsize);
711+
"signed integer is less than minimum");
712+
RETURN_ERR_OCCURRED;
712713
}
713714
else
714715
*p = ival;
@@ -720,10 +721,10 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
720721
unsigned int *p = va_arg(*p_va, unsigned int *);
721722
unsigned int ival;
722723
if (float_argument_error(arg))
723-
return converterr("integer<I>", arg, msgbuf, bufsize);
724+
RETURN_ERR_OCCURRED;
724725
ival = (unsigned int)PyLong_AsUnsignedLongMask(arg);
725726
if (ival == (unsigned int)-1 && PyErr_Occurred())
726-
return converterr("integer<I>", arg, msgbuf, bufsize);
727+
RETURN_ERR_OCCURRED;
727728
else
728729
*p = ival;
729730
break;
@@ -735,25 +736,25 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
735736
Py_ssize_t *p = va_arg(*p_va, Py_ssize_t *);
736737
Py_ssize_t ival = -1;
737738
if (float_argument_error(arg))
738-
return converterr("integer<n>", arg, msgbuf, bufsize);
739+
RETURN_ERR_OCCURRED;
739740
iobj = PyNumber_Index(arg);
740741
if (iobj != NULL) {
741742
ival = PyLong_AsSsize_t(iobj);
742743
Py_DECREF(iobj);
743744
}
744745
if (ival == -1 && PyErr_Occurred())
745-
return converterr("integer<n>", arg, msgbuf, bufsize);
746+
RETURN_ERR_OCCURRED;
746747
*p = ival;
747748
break;
748749
}
749750
case 'l': {/* long int */
750751
long *p = va_arg(*p_va, long *);
751752
long ival;
752753
if (float_argument_error(arg))
753-
return converterr("integer<l>", arg, msgbuf, bufsize);
754+
RETURN_ERR_OCCURRED;
754755
ival = PyLong_AsLong(arg);
755756
if (ival == -1 && PyErr_Occurred())
756-
return converterr("integer<l>", arg, msgbuf, bufsize);
757+
RETURN_ERR_OCCURRED;
757758
else
758759
*p = ival;
759760
break;
@@ -775,10 +776,10 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
775776
PY_LONG_LONG *p = va_arg( *p_va, PY_LONG_LONG * );
776777
PY_LONG_LONG ival;
777778
if (float_argument_error(arg))
778-
return converterr("long<L>", arg, msgbuf, bufsize);
779+
RETURN_ERR_OCCURRED;
779780
ival = PyLong_AsLongLong(arg);
780781
if (ival == (PY_LONG_LONG)-1 && PyErr_Occurred())
781-
return converterr("long<L>", arg, msgbuf, bufsize);
782+
RETURN_ERR_OCCURRED;
782783
else
783784
*p = ival;
784785
break;
@@ -800,7 +801,7 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
800801
float *p = va_arg(*p_va, float *);
801802
double dval = PyFloat_AsDouble(arg);
802803
if (PyErr_Occurred())
803-
return converterr("float<f>", arg, msgbuf, bufsize);
804+
RETURN_ERR_OCCURRED;
804805
else
805806
*p = (float) dval;
806807
break;
@@ -810,7 +811,7 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
810811
double *p = va_arg(*p_va, double *);
811812
double dval = PyFloat_AsDouble(arg);
812813
if (PyErr_Occurred())
813-
return converterr("float<d>", arg, msgbuf, bufsize);
814+
RETURN_ERR_OCCURRED;
814815
else
815816
*p = dval;
816817
break;
@@ -821,7 +822,7 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
821822
Py_complex cval;
822823
cval = PyComplex_AsCComplex(arg);
823824
if (PyErr_Occurred())
824-
return converterr("complex<D>", arg, msgbuf, bufsize);
825+
RETURN_ERR_OCCURRED;
825826
else
826827
*p = cval;
827828
break;
@@ -1107,9 +1108,7 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
11071108
if (*buffer == NULL) {
11081109
Py_DECREF(s);
11091110
PyErr_NoMemory();
1110-
return converterr(
1111-
"(memory error)",
1112-
arg, msgbuf, bufsize);
1111+
RETURN_ERR_OCCURRED;
11131112
}
11141113
if (addcleanup(*buffer, freelist, 0)) {
11151114
Py_DECREF(s);
@@ -1151,8 +1150,7 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
11511150
if (*buffer == NULL) {
11521151
Py_DECREF(s);
11531152
PyErr_NoMemory();
1154-
return converterr("(memory error)",
1155-
arg, msgbuf, bufsize);
1153+
RETURN_ERR_OCCURRED;
11561154
}
11571155
if (addcleanup(*buffer, freelist, 0)) {
11581156
Py_DECREF(s);
@@ -1261,6 +1259,11 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
12611259

12621260
*p_format = format;
12631261
return NULL;
1262+
1263+
#undef FETCH_SIZE
1264+
#undef STORE_SIZE
1265+
#undef BUFFER_LEN
1266+
#undef RETURN_ERR_OCCURRED
12641267
}
12651268

12661269
static Py_ssize_t

0 commit comments

Comments
 (0)