mirror of
https://github.com/python/cpython.git
synced 2025-07-15 23:35:23 +00:00
Two screwups fixed for sizeof(char *) instead of sizeof(char []).
Also change all the helper functions to pass along the size of the msgbuf and use PyOS_snprintf() when writing into the buffer.
This commit is contained in:
parent
c1bbcb87aa
commit
b048b26db0
1 changed files with 82 additions and 77 deletions
159
Python/getargs.c
159
Python/getargs.c
|
@ -16,10 +16,11 @@ int PyArg_ParseTupleAndKeywords(PyObject *, PyObject *,
|
||||||
/* Forward */
|
/* Forward */
|
||||||
static int vgetargs1(PyObject *, char *, va_list *, int);
|
static int vgetargs1(PyObject *, char *, va_list *, int);
|
||||||
static void seterror(int, char *, int *, char *, char *);
|
static void seterror(int, char *, int *, char *, char *);
|
||||||
static char *convertitem(PyObject *, char **, va_list *, int *, char *);
|
static char *convertitem(PyObject *, char **, va_list *, int *, char *,
|
||||||
|
size_t);
|
||||||
static char *converttuple(PyObject *, char **, va_list *,
|
static char *converttuple(PyObject *, char **, va_list *,
|
||||||
int *, char *, int);
|
int *, char *, size_t, int);
|
||||||
static char *convertsimple(PyObject *, char **, va_list *, char *);
|
static char *convertsimple(PyObject *, char **, va_list *, char *, size_t);
|
||||||
static int convertbuffer(PyObject *, void **p, char **);
|
static int convertbuffer(PyObject *, void **p, char **);
|
||||||
|
|
||||||
static int vgetargskeywords(PyObject *, PyObject *,
|
static int vgetargskeywords(PyObject *, PyObject *,
|
||||||
|
@ -151,7 +152,8 @@ vgetargs1(PyObject *args, char *format, va_list *p_va, int compat)
|
||||||
PyErr_SetString(PyExc_TypeError, msgbuf);
|
PyErr_SetString(PyExc_TypeError, msgbuf);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
msg = convertitem(args, &format, p_va, levels, msgbuf);
|
msg = convertitem(args, &format, p_va, levels, msgbuf,
|
||||||
|
sizeof(msgbuf));
|
||||||
if (msg == NULL)
|
if (msg == NULL)
|
||||||
return 1;
|
return 1;
|
||||||
seterror(levels[0], msg, levels+1, fname, message);
|
seterror(levels[0], msg, levels+1, fname, message);
|
||||||
|
@ -194,7 +196,7 @@ vgetargs1(PyObject *args, char *format, va_list *p_va, int compat)
|
||||||
if (*format == '|')
|
if (*format == '|')
|
||||||
format++;
|
format++;
|
||||||
msg = convertitem(PyTuple_GET_ITEM(args, i), &format, p_va,
|
msg = convertitem(PyTuple_GET_ITEM(args, i), &format, p_va,
|
||||||
levels, msgbuf);
|
levels, msgbuf, sizeof(msgbuf));
|
||||||
if (msg) {
|
if (msg) {
|
||||||
seterror(i+1, msg, levels, fname, message);
|
seterror(i+1, msg, levels, fname, message);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -271,7 +273,7 @@ seterror(int iarg, char *msg, int *levels, char *fname, char *message)
|
||||||
|
|
||||||
static char *
|
static char *
|
||||||
converttuple(PyObject *arg, char **p_format, va_list *p_va, int *levels,
|
converttuple(PyObject *arg, char **p_format, va_list *p_va, int *levels,
|
||||||
char *msgbuf, int toplevel)
|
char *msgbuf, size_t bufsize, int toplevel)
|
||||||
{
|
{
|
||||||
int level = 0;
|
int level = 0;
|
||||||
int n = 0;
|
int n = 0;
|
||||||
|
@ -298,7 +300,7 @@ converttuple(PyObject *arg, char **p_format, va_list *p_va, int *levels,
|
||||||
|
|
||||||
if (!PySequence_Check(arg) || PyString_Check(arg)) {
|
if (!PySequence_Check(arg) || PyString_Check(arg)) {
|
||||||
levels[0] = 0;
|
levels[0] = 0;
|
||||||
PyOS_snprintf(msgbuf, sizeof(msgbuf),
|
PyOS_snprintf(msgbuf, bufsize,
|
||||||
toplevel ? "expected %d arguments, not %.50s" :
|
toplevel ? "expected %d arguments, not %.50s" :
|
||||||
"must be %d-item sequence, not %.50s",
|
"must be %d-item sequence, not %.50s",
|
||||||
n,
|
n,
|
||||||
|
@ -308,7 +310,7 @@ converttuple(PyObject *arg, char **p_format, va_list *p_va, int *levels,
|
||||||
|
|
||||||
if ((i = PySequence_Size(arg)) != n) {
|
if ((i = PySequence_Size(arg)) != n) {
|
||||||
levels[0] = 0;
|
levels[0] = 0;
|
||||||
PyOS_snprintf(msgbuf, sizeof(msgbuf),
|
PyOS_snprintf(msgbuf, bufsize,
|
||||||
toplevel ? "expected %d arguments, not %d" :
|
toplevel ? "expected %d arguments, not %d" :
|
||||||
"must be sequence of length %d, not %d",
|
"must be sequence of length %d, not %d",
|
||||||
n, i);
|
n, i);
|
||||||
|
@ -320,7 +322,8 @@ converttuple(PyObject *arg, char **p_format, va_list *p_va, int *levels,
|
||||||
char *msg;
|
char *msg;
|
||||||
PyObject *item;
|
PyObject *item;
|
||||||
item = PySequence_GetItem(arg, i);
|
item = PySequence_GetItem(arg, i);
|
||||||
msg = convertitem(item, &format, p_va, levels+1, msgbuf);
|
msg = convertitem(item, &format, p_va, levels+1, msgbuf,
|
||||||
|
bufsize);
|
||||||
/* PySequence_GetItem calls tp->sq_item, which INCREFs */
|
/* PySequence_GetItem calls tp->sq_item, which INCREFs */
|
||||||
Py_XDECREF(item);
|
Py_XDECREF(item);
|
||||||
if (msg != NULL) {
|
if (msg != NULL) {
|
||||||
|
@ -338,19 +341,20 @@ converttuple(PyObject *arg, char **p_format, va_list *p_va, int *levels,
|
||||||
|
|
||||||
static char *
|
static char *
|
||||||
convertitem(PyObject *arg, char **p_format, va_list *p_va, int *levels,
|
convertitem(PyObject *arg, char **p_format, va_list *p_va, int *levels,
|
||||||
char *msgbuf)
|
char *msgbuf, size_t bufsize)
|
||||||
{
|
{
|
||||||
char *msg;
|
char *msg;
|
||||||
char *format = *p_format;
|
char *format = *p_format;
|
||||||
|
|
||||||
if (*format == '(' /* ')' */) {
|
if (*format == '(' /* ')' */) {
|
||||||
format++;
|
format++;
|
||||||
msg = converttuple(arg, &format, p_va, levels, msgbuf, 0);
|
msg = converttuple(arg, &format, p_va, levels, msgbuf,
|
||||||
|
bufsize, 0);
|
||||||
if (msg == NULL)
|
if (msg == NULL)
|
||||||
format++;
|
format++;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
msg = convertsimple(arg, &format, p_va, msgbuf);
|
msg = convertsimple(arg, &format, p_va, msgbuf, bufsize);
|
||||||
if (msg != NULL)
|
if (msg != NULL)
|
||||||
levels[0] = 0;
|
levels[0] = 0;
|
||||||
}
|
}
|
||||||
|
@ -367,14 +371,13 @@ convertitem(PyObject *arg, char **p_format, va_list *p_va, int *levels,
|
||||||
/* Format an error message generated by convertsimple(). */
|
/* Format an error message generated by convertsimple(). */
|
||||||
|
|
||||||
static char *
|
static char *
|
||||||
converterr(char *expected, PyObject *arg, char *msgbuf)
|
converterr(char *expected, PyObject *arg, char *msgbuf, size_t bufsize)
|
||||||
{
|
{
|
||||||
assert(expected != NULL);
|
assert(expected != NULL);
|
||||||
assert(arg != NULL);
|
assert(arg != NULL);
|
||||||
/* XXX use snprintf? */
|
PyOS_snprintf(msgbuf, bufsize,
|
||||||
sprintf(msgbuf,
|
"must be %.50s, not %.50s", expected,
|
||||||
"must be %.50s, not %.50s", expected,
|
arg == Py_None ? "None" : arg->ob_type->tp_name);
|
||||||
arg == Py_None ? "None" : arg->ob_type->tp_name);
|
|
||||||
return msgbuf;
|
return msgbuf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -388,7 +391,8 @@ converterr(char *expected, PyObject *arg, char *msgbuf)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static char *
|
static char *
|
||||||
convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf)
|
convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf,
|
||||||
|
size_t bufsize)
|
||||||
{
|
{
|
||||||
char *format = *p_format;
|
char *format = *p_format;
|
||||||
char c = *format++;
|
char c = *format++;
|
||||||
|
@ -400,16 +404,16 @@ convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf)
|
||||||
char *p = va_arg(*p_va, char *);
|
char *p = va_arg(*p_va, char *);
|
||||||
long ival = PyInt_AsLong(arg);
|
long ival = PyInt_AsLong(arg);
|
||||||
if (ival == -1 && PyErr_Occurred())
|
if (ival == -1 && PyErr_Occurred())
|
||||||
return converterr("integer<b>", arg, msgbuf);
|
return converterr("integer<b>", arg, msgbuf, bufsize);
|
||||||
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);
|
return converterr("integer<b>", arg, msgbuf, bufsize);
|
||||||
}
|
}
|
||||||
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);
|
return converterr("integer<b>", arg, msgbuf, bufsize);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
*p = (unsigned char) ival;
|
*p = (unsigned char) ival;
|
||||||
|
@ -421,16 +425,16 @@ convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf)
|
||||||
char *p = va_arg(*p_va, char *);
|
char *p = va_arg(*p_va, char *);
|
||||||
long ival = PyInt_AsLong(arg);
|
long ival = PyInt_AsLong(arg);
|
||||||
if (ival == -1 && PyErr_Occurred())
|
if (ival == -1 && PyErr_Occurred())
|
||||||
return converterr("integer<b>", arg, msgbuf);
|
return converterr("integer<b>", arg, msgbuf, bufsize);
|
||||||
else if (ival < SCHAR_MIN) {
|
else if (ival < SCHAR_MIN) {
|
||||||
PyErr_SetString(PyExc_OverflowError,
|
PyErr_SetString(PyExc_OverflowError,
|
||||||
"byte-sized integer bitfield is less than minimum");
|
"byte-sized integer bitfield is less than minimum");
|
||||||
return converterr("integer<B>", arg, msgbuf);
|
return converterr("integer<B>", arg, msgbuf, bufsize);
|
||||||
}
|
}
|
||||||
else if (ival > (int)UCHAR_MAX) {
|
else if (ival > (int)UCHAR_MAX) {
|
||||||
PyErr_SetString(PyExc_OverflowError,
|
PyErr_SetString(PyExc_OverflowError,
|
||||||
"byte-sized integer bitfield is greater than maximum");
|
"byte-sized integer bitfield is greater than maximum");
|
||||||
return converterr("integer<B>", arg, msgbuf);
|
return converterr("integer<B>", arg, msgbuf, bufsize);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
*p = (unsigned char) ival;
|
*p = (unsigned char) ival;
|
||||||
|
@ -441,16 +445,16 @@ convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf)
|
||||||
short *p = va_arg(*p_va, short *);
|
short *p = va_arg(*p_va, short *);
|
||||||
long ival = PyInt_AsLong(arg);
|
long ival = PyInt_AsLong(arg);
|
||||||
if (ival == -1 && PyErr_Occurred())
|
if (ival == -1 && PyErr_Occurred())
|
||||||
return converterr("integer<h>", arg, msgbuf);
|
return converterr("integer<h>", arg, msgbuf, bufsize);
|
||||||
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);
|
return converterr("integer<h>", arg, msgbuf, bufsize);
|
||||||
}
|
}
|
||||||
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);
|
return converterr("integer<h>", arg, msgbuf, bufsize);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
*p = (short) ival;
|
*p = (short) ival;
|
||||||
|
@ -462,16 +466,16 @@ convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf)
|
||||||
unsigned short *p = va_arg(*p_va, unsigned short *);
|
unsigned short *p = va_arg(*p_va, unsigned short *);
|
||||||
long ival = PyInt_AsLong(arg);
|
long ival = PyInt_AsLong(arg);
|
||||||
if (ival == -1 && PyErr_Occurred())
|
if (ival == -1 && PyErr_Occurred())
|
||||||
return converterr("integer<H>", arg, msgbuf);
|
return converterr("integer<H>", arg, msgbuf, bufsize);
|
||||||
else if (ival < SHRT_MIN) {
|
else if (ival < SHRT_MIN) {
|
||||||
PyErr_SetString(PyExc_OverflowError,
|
PyErr_SetString(PyExc_OverflowError,
|
||||||
"short integer bitfield is less than minimum");
|
"short integer bitfield is less than minimum");
|
||||||
return converterr("integer<H>", arg, msgbuf);
|
return converterr("integer<H>", arg, msgbuf, bufsize);
|
||||||
}
|
}
|
||||||
else if (ival > USHRT_MAX) {
|
else if (ival > USHRT_MAX) {
|
||||||
PyErr_SetString(PyExc_OverflowError,
|
PyErr_SetString(PyExc_OverflowError,
|
||||||
"short integer bitfield is greater than maximum");
|
"short integer bitfield is greater than maximum");
|
||||||
return converterr("integer<H>", arg, msgbuf);
|
return converterr("integer<H>", arg, msgbuf, bufsize);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
*p = (unsigned short) ival;
|
*p = (unsigned short) ival;
|
||||||
|
@ -482,16 +486,16 @@ convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf)
|
||||||
int *p = va_arg(*p_va, int *);
|
int *p = va_arg(*p_va, int *);
|
||||||
long ival = PyInt_AsLong(arg);
|
long ival = PyInt_AsLong(arg);
|
||||||
if (ival == -1 && PyErr_Occurred())
|
if (ival == -1 && PyErr_Occurred())
|
||||||
return converterr("integer<i>", arg, msgbuf);
|
return converterr("integer<i>", arg, msgbuf, bufsize);
|
||||||
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);
|
return converterr("integer<i>", arg, msgbuf, bufsize);
|
||||||
}
|
}
|
||||||
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);
|
return converterr("integer<i>", arg, msgbuf, bufsize);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
*p = ival;
|
*p = ival;
|
||||||
|
@ -502,7 +506,7 @@ convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf)
|
||||||
long *p = va_arg(*p_va, long *);
|
long *p = va_arg(*p_va, long *);
|
||||||
long ival = PyInt_AsLong(arg);
|
long ival = PyInt_AsLong(arg);
|
||||||
if (ival == -1 && PyErr_Occurred())
|
if (ival == -1 && PyErr_Occurred())
|
||||||
return converterr("integer<l>", arg, msgbuf);
|
return converterr("integer<l>", arg, msgbuf, bufsize);
|
||||||
else
|
else
|
||||||
*p = ival;
|
*p = ival;
|
||||||
break;
|
break;
|
||||||
|
@ -513,7 +517,7 @@ convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf)
|
||||||
LONG_LONG *p = va_arg( *p_va, LONG_LONG * );
|
LONG_LONG *p = va_arg( *p_va, LONG_LONG * );
|
||||||
LONG_LONG ival = PyLong_AsLongLong( arg );
|
LONG_LONG ival = PyLong_AsLongLong( arg );
|
||||||
if( ival == (LONG_LONG)-1 && PyErr_Occurred() ) {
|
if( ival == (LONG_LONG)-1 && PyErr_Occurred() ) {
|
||||||
return converterr("long<L>", arg, msgbuf);
|
return converterr("long<L>", arg, msgbuf, bufsize);
|
||||||
} else {
|
} else {
|
||||||
*p = ival;
|
*p = ival;
|
||||||
}
|
}
|
||||||
|
@ -525,7 +529,7 @@ convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf)
|
||||||
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);
|
return converterr("float<f>", arg, msgbuf, bufsize);
|
||||||
else
|
else
|
||||||
*p = (float) dval;
|
*p = (float) dval;
|
||||||
break;
|
break;
|
||||||
|
@ -535,7 +539,7 @@ convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf)
|
||||||
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);
|
return converterr("float<d>", arg, msgbuf, bufsize);
|
||||||
else
|
else
|
||||||
*p = dval;
|
*p = dval;
|
||||||
break;
|
break;
|
||||||
|
@ -547,7 +551,7 @@ convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf)
|
||||||
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);
|
return converterr("complex<D>", arg, msgbuf, bufsize);
|
||||||
else
|
else
|
||||||
*p = cval;
|
*p = cval;
|
||||||
break;
|
break;
|
||||||
|
@ -559,7 +563,7 @@ convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf)
|
||||||
if (PyString_Check(arg) && PyString_Size(arg) == 1)
|
if (PyString_Check(arg) && PyString_Size(arg) == 1)
|
||||||
*p = PyString_AS_STRING(arg)[0];
|
*p = PyString_AS_STRING(arg)[0];
|
||||||
else
|
else
|
||||||
return converterr("char", arg, msgbuf);
|
return converterr("char", arg, msgbuf, bufsize);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -577,7 +581,7 @@ convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf)
|
||||||
uarg = UNICODE_DEFAULT_ENCODING(arg);
|
uarg = UNICODE_DEFAULT_ENCODING(arg);
|
||||||
if (uarg == NULL)
|
if (uarg == NULL)
|
||||||
return converterr(CONV_UNICODE,
|
return converterr(CONV_UNICODE,
|
||||||
arg, msgbuf);
|
arg, msgbuf, bufsize);
|
||||||
*p = PyString_AS_STRING(uarg);
|
*p = PyString_AS_STRING(uarg);
|
||||||
*q = PyString_GET_SIZE(uarg);
|
*q = PyString_GET_SIZE(uarg);
|
||||||
}
|
}
|
||||||
|
@ -586,7 +590,7 @@ convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf)
|
||||||
char *buf;
|
char *buf;
|
||||||
int count = convertbuffer(arg, p, &buf);
|
int count = convertbuffer(arg, p, &buf);
|
||||||
if (count < 0)
|
if (count < 0)
|
||||||
return converterr(buf, arg, msgbuf);
|
return converterr(buf, arg, msgbuf, bufsize);
|
||||||
*q = count;
|
*q = count;
|
||||||
}
|
}
|
||||||
format++;
|
format++;
|
||||||
|
@ -600,15 +604,15 @@ convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf)
|
||||||
uarg = UNICODE_DEFAULT_ENCODING(arg);
|
uarg = UNICODE_DEFAULT_ENCODING(arg);
|
||||||
if (uarg == NULL)
|
if (uarg == NULL)
|
||||||
return converterr(CONV_UNICODE,
|
return converterr(CONV_UNICODE,
|
||||||
arg, msgbuf);
|
arg, msgbuf, bufsize);
|
||||||
*p = PyString_AS_STRING(uarg);
|
*p = PyString_AS_STRING(uarg);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
else
|
else
|
||||||
return converterr("string", arg, msgbuf);
|
return converterr("string", arg, msgbuf, bufsize);
|
||||||
if ((int)strlen(*p) != PyString_Size(arg))
|
if ((int)strlen(*p) != PyString_Size(arg))
|
||||||
return converterr("string without null bytes",
|
return converterr("string without null bytes",
|
||||||
arg, msgbuf);
|
arg, msgbuf, bufsize);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -631,7 +635,7 @@ convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf)
|
||||||
uarg = UNICODE_DEFAULT_ENCODING(arg);
|
uarg = UNICODE_DEFAULT_ENCODING(arg);
|
||||||
if (uarg == NULL)
|
if (uarg == NULL)
|
||||||
return converterr(CONV_UNICODE,
|
return converterr(CONV_UNICODE,
|
||||||
arg, msgbuf);
|
arg, msgbuf, bufsize);
|
||||||
*p = PyString_AS_STRING(uarg);
|
*p = PyString_AS_STRING(uarg);
|
||||||
*q = PyString_GET_SIZE(uarg);
|
*q = PyString_GET_SIZE(uarg);
|
||||||
}
|
}
|
||||||
|
@ -640,7 +644,7 @@ convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf)
|
||||||
char *buf;
|
char *buf;
|
||||||
int count = convertbuffer(arg, p, &buf);
|
int count = convertbuffer(arg, p, &buf);
|
||||||
if (count < 0)
|
if (count < 0)
|
||||||
return converterr(buf, arg, msgbuf);
|
return converterr(buf, arg, msgbuf, bufsize);
|
||||||
*q = count;
|
*q = count;
|
||||||
}
|
}
|
||||||
format++;
|
format++;
|
||||||
|
@ -656,13 +660,13 @@ convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf)
|
||||||
uarg = UNICODE_DEFAULT_ENCODING(arg);
|
uarg = UNICODE_DEFAULT_ENCODING(arg);
|
||||||
if (uarg == NULL)
|
if (uarg == NULL)
|
||||||
return converterr(CONV_UNICODE,
|
return converterr(CONV_UNICODE,
|
||||||
arg, msgbuf);
|
arg, msgbuf, bufsize);
|
||||||
*p = PyString_AS_STRING(uarg);
|
*p = PyString_AS_STRING(uarg);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
else
|
else
|
||||||
return converterr("string or None",
|
return converterr("string or None",
|
||||||
arg, msgbuf);
|
arg, msgbuf, bufsize);
|
||||||
if (*format == '#') {
|
if (*format == '#') {
|
||||||
int *q = va_arg(*p_va, int *);
|
int *q = va_arg(*p_va, int *);
|
||||||
if (arg == Py_None)
|
if (arg == Py_None)
|
||||||
|
@ -675,7 +679,7 @@ convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf)
|
||||||
(int)strlen(*p) != PyString_Size(arg))
|
(int)strlen(*p) != PyString_Size(arg))
|
||||||
return converterr(
|
return converterr(
|
||||||
"string without null bytes or None",
|
"string without null bytes or None",
|
||||||
arg, msgbuf);
|
arg, msgbuf, bufsize);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -704,12 +708,12 @@ convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf)
|
||||||
else
|
else
|
||||||
return converterr(
|
return converterr(
|
||||||
"(unknown parser marker combination)",
|
"(unknown parser marker combination)",
|
||||||
arg, msgbuf);
|
arg, msgbuf, bufsize);
|
||||||
buffer = (char **)va_arg(*p_va, char **);
|
buffer = (char **)va_arg(*p_va, char **);
|
||||||
format++;
|
format++;
|
||||||
if (buffer == NULL)
|
if (buffer == NULL)
|
||||||
return converterr("(buffer is NULL)",
|
return converterr("(buffer is NULL)",
|
||||||
arg, msgbuf);
|
arg, msgbuf, bufsize);
|
||||||
|
|
||||||
/* Encode object */
|
/* Encode object */
|
||||||
if (!recode_strings && PyString_Check(arg)) {
|
if (!recode_strings && PyString_Check(arg)) {
|
||||||
|
@ -725,7 +729,7 @@ convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf)
|
||||||
if (u == NULL)
|
if (u == NULL)
|
||||||
return converterr(
|
return converterr(
|
||||||
"string or unicode or text buffer",
|
"string or unicode or text buffer",
|
||||||
arg, msgbuf);
|
arg, msgbuf, bufsize);
|
||||||
|
|
||||||
/* Encode object; use default error handling */
|
/* Encode object; use default error handling */
|
||||||
s = PyUnicode_AsEncodedString(u,
|
s = PyUnicode_AsEncodedString(u,
|
||||||
|
@ -734,15 +738,15 @@ convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf)
|
||||||
Py_DECREF(u);
|
Py_DECREF(u);
|
||||||
if (s == NULL)
|
if (s == NULL)
|
||||||
return converterr("(encoding failed)",
|
return converterr("(encoding failed)",
|
||||||
arg, msgbuf);
|
arg, msgbuf, bufsize);
|
||||||
if (!PyString_Check(s)) {
|
if (!PyString_Check(s)) {
|
||||||
Py_DECREF(s);
|
Py_DECREF(s);
|
||||||
return converterr(
|
return converterr(
|
||||||
"(encoder failed to return a string)",
|
"(encoder failed to return a string)",
|
||||||
arg, msgbuf);
|
arg, msgbuf, bufsize);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
return converterr("string<e>", arg, msgbuf);
|
return converterr("string<e>", arg, msgbuf, bufsize);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
size = PyString_GET_SIZE(s);
|
size = PyString_GET_SIZE(s);
|
||||||
|
@ -776,21 +780,21 @@ convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf)
|
||||||
if (buffer_len == NULL)
|
if (buffer_len == NULL)
|
||||||
return converterr(
|
return converterr(
|
||||||
"(buffer_len is NULL)",
|
"(buffer_len is NULL)",
|
||||||
arg, msgbuf);
|
arg, msgbuf, bufsize);
|
||||||
if (*buffer == NULL) {
|
if (*buffer == NULL) {
|
||||||
*buffer = PyMem_NEW(char, size + 1);
|
*buffer = PyMem_NEW(char, size + 1);
|
||||||
if (*buffer == NULL) {
|
if (*buffer == NULL) {
|
||||||
Py_DECREF(s);
|
Py_DECREF(s);
|
||||||
return converterr(
|
return converterr(
|
||||||
"(memory error)",
|
"(memory error)",
|
||||||
arg, msgbuf);
|
arg, msgbuf, bufsize);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (size + 1 > *buffer_len) {
|
if (size + 1 > *buffer_len) {
|
||||||
Py_DECREF(s);
|
Py_DECREF(s);
|
||||||
return converterr(
|
return converterr(
|
||||||
"(buffer overflow)",
|
"(buffer overflow)",
|
||||||
arg, msgbuf);
|
arg, msgbuf, bufsize);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
memcpy(*buffer,
|
memcpy(*buffer,
|
||||||
|
@ -814,12 +818,12 @@ convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf)
|
||||||
if ((int)strlen(PyString_AS_STRING(s)) != size)
|
if ((int)strlen(PyString_AS_STRING(s)) != size)
|
||||||
return converterr(
|
return converterr(
|
||||||
"(encoded string without NULL bytes)",
|
"(encoded string without NULL bytes)",
|
||||||
arg, msgbuf);
|
arg, msgbuf, bufsize);
|
||||||
*buffer = PyMem_NEW(char, size + 1);
|
*buffer = PyMem_NEW(char, size + 1);
|
||||||
if (*buffer == NULL) {
|
if (*buffer == NULL) {
|
||||||
Py_DECREF(s);
|
Py_DECREF(s);
|
||||||
return converterr("(memory error)",
|
return converterr("(memory error)",
|
||||||
arg, msgbuf);
|
arg, msgbuf, bufsize);
|
||||||
}
|
}
|
||||||
memcpy(*buffer,
|
memcpy(*buffer,
|
||||||
PyString_AS_STRING(s),
|
PyString_AS_STRING(s),
|
||||||
|
@ -838,7 +842,7 @@ convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf)
|
||||||
int count = convertbuffer(arg, p, &buf);
|
int count = convertbuffer(arg, p, &buf);
|
||||||
|
|
||||||
if (count < 0)
|
if (count < 0)
|
||||||
return converterr(buf, arg, msgbuf);
|
return converterr(buf, arg, msgbuf, bufsize);
|
||||||
*q = count/(sizeof(Py_UNICODE));
|
*q = count/(sizeof(Py_UNICODE));
|
||||||
format++;
|
format++;
|
||||||
} else {
|
} else {
|
||||||
|
@ -847,7 +851,7 @@ convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf)
|
||||||
if (PyUnicode_Check(arg))
|
if (PyUnicode_Check(arg))
|
||||||
*p = PyUnicode_AS_UNICODE(arg);
|
*p = PyUnicode_AS_UNICODE(arg);
|
||||||
else
|
else
|
||||||
return converterr("unicode", arg, msgbuf);
|
return converterr("unicode", arg, msgbuf, bufsize);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -858,7 +862,7 @@ convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf)
|
||||||
if (PyString_Check(arg))
|
if (PyString_Check(arg))
|
||||||
*p = arg;
|
*p = arg;
|
||||||
else
|
else
|
||||||
return converterr("string", arg, msgbuf);
|
return converterr("string", arg, msgbuf, bufsize);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -868,7 +872,7 @@ convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf)
|
||||||
if (PyUnicode_Check(arg))
|
if (PyUnicode_Check(arg))
|
||||||
*p = arg;
|
*p = arg;
|
||||||
else
|
else
|
||||||
return converterr("unicode", arg, msgbuf);
|
return converterr("unicode", arg, msgbuf, bufsize);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -883,7 +887,7 @@ convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf)
|
||||||
if (PyType_IsSubtype(arg->ob_type, type))
|
if (PyType_IsSubtype(arg->ob_type, type))
|
||||||
*p = arg;
|
*p = arg;
|
||||||
else
|
else
|
||||||
return converterr(type->tp_name, arg, msgbuf);
|
return converterr(type->tp_name, arg, msgbuf, bufsize);
|
||||||
|
|
||||||
}
|
}
|
||||||
else if (*format == '?') {
|
else if (*format == '?') {
|
||||||
|
@ -894,7 +898,7 @@ convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf)
|
||||||
*p = arg;
|
*p = arg;
|
||||||
else
|
else
|
||||||
return converterr("(unspecified)",
|
return converterr("(unspecified)",
|
||||||
arg, msgbuf);
|
arg, msgbuf, bufsize);
|
||||||
|
|
||||||
}
|
}
|
||||||
else if (*format == '&') {
|
else if (*format == '&') {
|
||||||
|
@ -904,7 +908,7 @@ convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf)
|
||||||
format++;
|
format++;
|
||||||
if (! (*convert)(arg, addr))
|
if (! (*convert)(arg, addr))
|
||||||
return converterr("(unspecified)",
|
return converterr("(unspecified)",
|
||||||
arg, msgbuf);
|
arg, msgbuf, bufsize);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
p = va_arg(*p_va, PyObject **);
|
p = va_arg(*p_va, PyObject **);
|
||||||
|
@ -922,12 +926,12 @@ convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf)
|
||||||
if (pb == NULL ||
|
if (pb == NULL ||
|
||||||
pb->bf_getwritebuffer == NULL ||
|
pb->bf_getwritebuffer == NULL ||
|
||||||
pb->bf_getsegcount == NULL)
|
pb->bf_getsegcount == NULL)
|
||||||
return converterr("read-write buffer", arg, msgbuf);
|
return converterr("read-write buffer", arg, msgbuf, bufsize);
|
||||||
if ((*pb->bf_getsegcount)(arg, NULL) != 1)
|
if ((*pb->bf_getsegcount)(arg, NULL) != 1)
|
||||||
return converterr("single-segment read-write buffer",
|
return converterr("single-segment read-write buffer",
|
||||||
arg, msgbuf);
|
arg, msgbuf, bufsize);
|
||||||
if ((count = pb->bf_getwritebuffer(arg, 0, p)) < 0)
|
if ((count = pb->bf_getwritebuffer(arg, 0, p)) < 0)
|
||||||
return converterr("(unspecified)", arg, msgbuf);
|
return converterr("(unspecified)", arg, msgbuf, bufsize);
|
||||||
if (*format == '#') {
|
if (*format == '#') {
|
||||||
int *q = va_arg(*p_va, int *);
|
int *q = va_arg(*p_va, int *);
|
||||||
|
|
||||||
|
@ -945,29 +949,29 @@ convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf)
|
||||||
if (*format++ != '#')
|
if (*format++ != '#')
|
||||||
return converterr(
|
return converterr(
|
||||||
"invalid use of 't' format character",
|
"invalid use of 't' format character",
|
||||||
arg, msgbuf);
|
arg, msgbuf, bufsize);
|
||||||
if (!PyType_HasFeature(arg->ob_type,
|
if (!PyType_HasFeature(arg->ob_type,
|
||||||
Py_TPFLAGS_HAVE_GETCHARBUFFER) ||
|
Py_TPFLAGS_HAVE_GETCHARBUFFER) ||
|
||||||
pb == NULL || pb->bf_getcharbuffer == NULL ||
|
pb == NULL || pb->bf_getcharbuffer == NULL ||
|
||||||
pb->bf_getsegcount == NULL)
|
pb->bf_getsegcount == NULL)
|
||||||
return converterr(
|
return converterr(
|
||||||
"string or read-only character buffer",
|
"string or read-only character buffer",
|
||||||
arg, msgbuf);
|
arg, msgbuf, bufsize);
|
||||||
|
|
||||||
if (pb->bf_getsegcount(arg, NULL) != 1)
|
if (pb->bf_getsegcount(arg, NULL) != 1)
|
||||||
return converterr(
|
return converterr(
|
||||||
"string or single-segment read-only buffer",
|
"string or single-segment read-only buffer",
|
||||||
arg, msgbuf);
|
arg, msgbuf, bufsize);
|
||||||
|
|
||||||
count = pb->bf_getcharbuffer(arg, 0, p);
|
count = pb->bf_getcharbuffer(arg, 0, p);
|
||||||
if (count < 0)
|
if (count < 0)
|
||||||
return converterr("(unspecified)", arg, msgbuf);
|
return converterr("(unspecified)", arg, msgbuf, bufsize);
|
||||||
*va_arg(*p_va, int *) = count;
|
*va_arg(*p_va, int *) = count;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return converterr("impossible<bad format char>", arg, msgbuf);
|
return converterr("impossible<bad format char>", arg, msgbuf, bufsize);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1157,7 +1161,7 @@ vgetargskeywords(PyObject *args, PyObject *keywords, char *format,
|
||||||
if (*format == '|')
|
if (*format == '|')
|
||||||
format++;
|
format++;
|
||||||
msg = convertitem(PyTuple_GET_ITEM(args, i), &format, p_va,
|
msg = convertitem(PyTuple_GET_ITEM(args, i), &format, p_va,
|
||||||
levels, msgbuf);
|
levels, msgbuf, sizeof(msgbuf));
|
||||||
if (msg) {
|
if (msg) {
|
||||||
seterror(i+1, msg, levels, fname, message);
|
seterror(i+1, msg, levels, fname, message);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1177,7 +1181,8 @@ vgetargskeywords(PyObject *args, PyObject *keywords, char *format,
|
||||||
item = PyDict_GetItemString(keywords, kwlist[i]);
|
item = PyDict_GetItemString(keywords, kwlist[i]);
|
||||||
if (item != NULL) {
|
if (item != NULL) {
|
||||||
Py_INCREF(item);
|
Py_INCREF(item);
|
||||||
msg = convertitem(item, &format, p_va, levels, msgbuf);
|
msg = convertitem(item, &format, p_va, levels, msgbuf,
|
||||||
|
sizeof(msgbuf));
|
||||||
Py_DECREF(item);
|
Py_DECREF(item);
|
||||||
if (msg) {
|
if (msg) {
|
||||||
seterror(i+1, msg, levels, fname, message);
|
seterror(i+1, msg, levels, fname, message);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue