Issue #10833: Use PyUnicode_FromFormat() and PyErr_Format() instead of

PyOS_snprintf().
This commit is contained in:
Victor Stinner 2011-03-21 13:26:24 +01:00
parent bfc7bf06a6
commit 499dfcf29d
6 changed files with 54 additions and 68 deletions

View File

@ -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;

View File

@ -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;
} }

View File

@ -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

View File

@ -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)

View File

@ -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 *

View File

@ -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);
} }