Issue #10833: Use PyUnicode_FromFormat() and PyErr_Format() instead of
PyOS_snprintf().
This commit is contained in:
parent
bfc7bf06a6
commit
499dfcf29d
|
@ -2138,13 +2138,15 @@ makeuniversal(XMLParserObject* self, const char* string)
|
||||||
static void
|
static void
|
||||||
expat_set_error(const char* message, int line, int column)
|
expat_set_error(const char* message, int line, int column)
|
||||||
{
|
{
|
||||||
PyObject *error;
|
PyObject *errmsg, *error, *position;
|
||||||
PyObject *position;
|
|
||||||
char buffer[256];
|
|
||||||
|
|
||||||
sprintf(buffer, "%.100s: line %d, column %d", message, line, column);
|
errmsg = PyUnicode_FromFormat("%s: line %d, column %d",
|
||||||
|
message, line, column);
|
||||||
|
if (errmsg == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
error = PyObject_CallFunction(elementtree_parseerror_obj, "s", buffer);
|
error = PyObject_CallFunction(elementtree_parseerror_obj, "O", errmsg);
|
||||||
|
Py_DECREF(errmsg);
|
||||||
if (!error)
|
if (!error)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
|
@ -43,11 +43,9 @@ static PyObject*
|
||||||
sizeof_error(const char* fatname, const char* typname,
|
sizeof_error(const char* fatname, const char* typname,
|
||||||
int expected, int got)
|
int expected, int got)
|
||||||
{
|
{
|
||||||
char buf[1024];
|
PyErr_Format(TestError,
|
||||||
PyOS_snprintf(buf, sizeof(buf),
|
"%s #define == %d but sizeof(%s) == %d",
|
||||||
"%.200s #define == %d but sizeof(%.200s) == %d",
|
|
||||||
fatname, expected, typname, got);
|
fatname, expected, typname, got);
|
||||||
PyErr_SetString(TestError, buf);
|
|
||||||
return (PyObject*)NULL;
|
return (PyObject*)NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -680,8 +680,8 @@ handle_weakrefs(PyGC_Head *unreachable, PyGC_Head *old)
|
||||||
static void
|
static void
|
||||||
debug_cycle(char *msg, PyObject *op)
|
debug_cycle(char *msg, PyObject *op)
|
||||||
{
|
{
|
||||||
PySys_WriteStderr("gc: %.100s <%.100s %p>\n",
|
PySys_FormatStderr("gc: %s <%s %p>\n",
|
||||||
msg, Py_TYPE(op)->tp_name, op);
|
msg, Py_TYPE(op)->tp_name, op);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Handle uncollectable garbage (cycles with finalizers, and stuff reachable
|
/* Handle uncollectable garbage (cycles with finalizers, and stuff reachable
|
||||||
|
|
|
@ -100,16 +100,17 @@ static PyObject *
|
||||||
set_error(xmlparseobject *self, enum XML_Error code)
|
set_error(xmlparseobject *self, enum XML_Error code)
|
||||||
{
|
{
|
||||||
PyObject *err;
|
PyObject *err;
|
||||||
char buffer[256];
|
PyObject *buffer;
|
||||||
XML_Parser parser = self->itself;
|
XML_Parser parser = self->itself;
|
||||||
int lineno = XML_GetErrorLineNumber(parser);
|
int lineno = XML_GetErrorLineNumber(parser);
|
||||||
int column = XML_GetErrorColumnNumber(parser);
|
int column = XML_GetErrorColumnNumber(parser);
|
||||||
|
|
||||||
/* There is no risk of overflowing this buffer, since
|
buffer = PyUnicode_FromFormat("%s: line %i, column %i",
|
||||||
even for 64-bit integers, there is sufficient space. */
|
XML_ErrorString(code), lineno, column);
|
||||||
sprintf(buffer, "%.200s: line %i, column %i",
|
if (buffer == NULL)
|
||||||
XML_ErrorString(code), lineno, column);
|
return NULL;
|
||||||
err = PyObject_CallFunction(ErrorObject, "s", buffer);
|
err = PyObject_CallFunction(ErrorObject, "O", buffer);
|
||||||
|
Py_DECREF(buffer);
|
||||||
if ( err != NULL
|
if ( err != NULL
|
||||||
&& set_error_attr(err, "code", code)
|
&& set_error_attr(err, "code", code)
|
||||||
&& set_error_attr(err, "offset", column)
|
&& set_error_attr(err, "offset", column)
|
||||||
|
|
|
@ -601,31 +601,20 @@ _asctime(struct tm *timeptr)
|
||||||
{
|
{
|
||||||
/* Inspired by Open Group reference implementation available at
|
/* Inspired by Open Group reference implementation available at
|
||||||
* http://pubs.opengroup.org/onlinepubs/009695399/functions/asctime.html */
|
* http://pubs.opengroup.org/onlinepubs/009695399/functions/asctime.html */
|
||||||
static char wday_name[7][3] = {
|
static char wday_name[7][4] = {
|
||||||
"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
|
"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
|
||||||
};
|
};
|
||||||
static char mon_name[12][3] = {
|
static char mon_name[12][4] = {
|
||||||
"Jan", "Feb", "Mar", "Apr", "May", "Jun",
|
"Jan", "Feb", "Mar", "Apr", "May", "Jun",
|
||||||
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
|
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
|
||||||
};
|
};
|
||||||
char buf[20]; /* 'Sun Sep 16 01:03:52\0' */
|
return PyUnicode_FromFormat(
|
||||||
int n;
|
"%s %s%3d %.2d:%.2d:%.2d %d",
|
||||||
|
wday_name[timeptr->tm_wday],
|
||||||
n = PyOS_snprintf(buf, sizeof(buf), "%.3s %.3s%3d %.2d:%.2d:%.2d",
|
mon_name[timeptr->tm_mon],
|
||||||
wday_name[timeptr->tm_wday],
|
timeptr->tm_mday, timeptr->tm_hour,
|
||||||
mon_name[timeptr->tm_mon],
|
timeptr->tm_min, timeptr->tm_sec,
|
||||||
timeptr->tm_mday, timeptr->tm_hour,
|
1900 + timeptr->tm_year);
|
||||||
timeptr->tm_min, timeptr->tm_sec);
|
|
||||||
/* XXX: since the fields used by snprintf above are validated in checktm,
|
|
||||||
* the following condition should never trigger. We keep the check because
|
|
||||||
* historically fixed size buffer used in asctime was the source of
|
|
||||||
* crashes. */
|
|
||||||
if (n + 1 != sizeof(buf)) {
|
|
||||||
PyErr_SetString(PyExc_ValueError, "unconvertible time");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return PyUnicode_FromFormat("%s %d", buf, 1900 + timeptr->tm_year);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
|
|
|
@ -157,34 +157,31 @@ static PyObject *
|
||||||
weakref_repr(PyWeakReference *self)
|
weakref_repr(PyWeakReference *self)
|
||||||
{
|
{
|
||||||
char buffer[256];
|
char buffer[256];
|
||||||
if (PyWeakref_GET_OBJECT(self) == Py_None) {
|
PyObject *name, *repr;
|
||||||
PyOS_snprintf(buffer, sizeof(buffer), "<weakref at %p; dead>", self);
|
|
||||||
|
if (PyWeakref_GET_OBJECT(self) == Py_None)
|
||||||
|
return PyUnicode_FromFormat("<weakref at %p; dead>", self);
|
||||||
|
|
||||||
|
name = PyObject_GetAttrString(PyWeakref_GET_OBJECT(self), "__name__");
|
||||||
|
if (name == NULL || !PyUnicode_Check(name)) {
|
||||||
|
if (name == NULL)
|
||||||
|
PyErr_Clear();
|
||||||
|
repr = PyUnicode_FromFormat(
|
||||||
|
"<weakref at %p; to '%s' at %p>",
|
||||||
|
self,
|
||||||
|
Py_TYPE(PyWeakref_GET_OBJECT(self))->tp_name,
|
||||||
|
PyWeakref_GET_OBJECT(self));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
char *name = NULL;
|
repr = PyUnicode_FromFormat(
|
||||||
PyObject *nameobj = PyObject_GetAttrString(PyWeakref_GET_OBJECT(self),
|
"<weakref at %p; to '%s' at %p (%U)>",
|
||||||
"__name__");
|
self,
|
||||||
if (nameobj == NULL)
|
Py_TYPE(PyWeakref_GET_OBJECT(self))->tp_name,
|
||||||
PyErr_Clear();
|
PyWeakref_GET_OBJECT(self),
|
||||||
else if (PyUnicode_Check(nameobj))
|
name);
|
||||||
name = _PyUnicode_AsString(nameobj);
|
|
||||||
if (name)
|
|
||||||
PyOS_snprintf(buffer, sizeof(buffer),
|
|
||||||
"<weakref at %p; to '%.50s' at %p (%s)>",
|
|
||||||
self,
|
|
||||||
Py_TYPE(PyWeakref_GET_OBJECT(self))->tp_name,
|
|
||||||
PyWeakref_GET_OBJECT(self),
|
|
||||||
name);
|
|
||||||
else
|
|
||||||
PyOS_snprintf(buffer, sizeof(buffer),
|
|
||||||
"<weakref at %p; to '%.50s' at %p>",
|
|
||||||
self,
|
|
||||||
Py_TYPE(PyWeakref_GET_OBJECT(self))->tp_name,
|
|
||||||
PyWeakref_GET_OBJECT(self));
|
|
||||||
|
|
||||||
Py_XDECREF(nameobj);
|
|
||||||
}
|
}
|
||||||
return PyUnicode_FromString(buffer);
|
Py_XDECREF(name);
|
||||||
|
return repr;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Weak references only support equality, not ordering. Two weak references
|
/* Weak references only support equality, not ordering. Two weak references
|
||||||
|
@ -459,12 +456,11 @@ WRAP_TERNARY(proxy_call, PyEval_CallObjectWithKeywords)
|
||||||
static PyObject *
|
static PyObject *
|
||||||
proxy_repr(PyWeakReference *proxy)
|
proxy_repr(PyWeakReference *proxy)
|
||||||
{
|
{
|
||||||
char buf[160];
|
return PyUnicode_FromFormat(
|
||||||
PyOS_snprintf(buf, sizeof(buf),
|
"<weakproxy at %p to %s at %p>",
|
||||||
"<weakproxy at %p to %.100s at %p>", proxy,
|
proxy,
|
||||||
Py_TYPE(PyWeakref_GET_OBJECT(proxy))->tp_name,
|
Py_TYPE(PyWeakref_GET_OBJECT(proxy))->tp_name,
|
||||||
PyWeakref_GET_OBJECT(proxy));
|
PyWeakref_GET_OBJECT(proxy));
|
||||||
return PyUnicode_FromString(buf);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue