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

Skip to content

Commit 499dfcf

Browse files
author
Victor Stinner
committed
Issue #10833: Use PyUnicode_FromFormat() and PyErr_Format() instead of
PyOS_snprintf().
1 parent bfc7bf0 commit 499dfcf

6 files changed

Lines changed: 54 additions & 68 deletions

File tree

Modules/_elementtree.c

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2138,13 +2138,15 @@ makeuniversal(XMLParserObject* self, const char* string)
21382138
static void
21392139
expat_set_error(const char* message, int line, int column)
21402140
{
2141-
PyObject *error;
2142-
PyObject *position;
2143-
char buffer[256];
2141+
PyObject *errmsg, *error, *position;
21442142

2145-
sprintf(buffer, "%.100s: line %d, column %d", message, line, column);
2143+
errmsg = PyUnicode_FromFormat("%s: line %d, column %d",
2144+
message, line, column);
2145+
if (errmsg == NULL)
2146+
return;
21462147

2147-
error = PyObject_CallFunction(elementtree_parseerror_obj, "s", buffer);
2148+
error = PyObject_CallFunction(elementtree_parseerror_obj, "O", errmsg);
2149+
Py_DECREF(errmsg);
21482150
if (!error)
21492151
return;
21502152

Modules/_testcapimodule.c

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,9 @@ static PyObject*
4343
sizeof_error(const char* fatname, const char* typname,
4444
int expected, int got)
4545
{
46-
char buf[1024];
47-
PyOS_snprintf(buf, sizeof(buf),
48-
"%.200s #define == %d but sizeof(%.200s) == %d",
46+
PyErr_Format(TestError,
47+
"%s #define == %d but sizeof(%s) == %d",
4948
fatname, expected, typname, got);
50-
PyErr_SetString(TestError, buf);
5149
return (PyObject*)NULL;
5250
}
5351

Modules/gcmodule.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -680,8 +680,8 @@ handle_weakrefs(PyGC_Head *unreachable, PyGC_Head *old)
680680
static void
681681
debug_cycle(char *msg, PyObject *op)
682682
{
683-
PySys_WriteStderr("gc: %.100s <%.100s %p>\n",
684-
msg, Py_TYPE(op)->tp_name, op);
683+
PySys_FormatStderr("gc: %s <%s %p>\n",
684+
msg, Py_TYPE(op)->tp_name, op);
685685
}
686686

687687
/* Handle uncollectable garbage (cycles with finalizers, and stuff reachable

Modules/pyexpat.c

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -100,16 +100,17 @@ static PyObject *
100100
set_error(xmlparseobject *self, enum XML_Error code)
101101
{
102102
PyObject *err;
103-
char buffer[256];
103+
PyObject *buffer;
104104
XML_Parser parser = self->itself;
105105
int lineno = XML_GetErrorLineNumber(parser);
106106
int column = XML_GetErrorColumnNumber(parser);
107107

108-
/* There is no risk of overflowing this buffer, since
109-
even for 64-bit integers, there is sufficient space. */
110-
sprintf(buffer, "%.200s: line %i, column %i",
111-
XML_ErrorString(code), lineno, column);
112-
err = PyObject_CallFunction(ErrorObject, "s", buffer);
108+
buffer = PyUnicode_FromFormat("%s: line %i, column %i",
109+
XML_ErrorString(code), lineno, column);
110+
if (buffer == NULL)
111+
return NULL;
112+
err = PyObject_CallFunction(ErrorObject, "O", buffer);
113+
Py_DECREF(buffer);
113114
if ( err != NULL
114115
&& set_error_attr(err, "code", code)
115116
&& set_error_attr(err, "offset", column)

Modules/timemodule.c

Lines changed: 9 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -601,31 +601,20 @@ _asctime(struct tm *timeptr)
601601
{
602602
/* Inspired by Open Group reference implementation available at
603603
* http://pubs.opengroup.org/onlinepubs/009695399/functions/asctime.html */
604-
static char wday_name[7][3] = {
604+
static char wday_name[7][4] = {
605605
"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
606606
};
607-
static char mon_name[12][3] = {
607+
static char mon_name[12][4] = {
608608
"Jan", "Feb", "Mar", "Apr", "May", "Jun",
609609
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
610610
};
611-
char buf[20]; /* 'Sun Sep 16 01:03:52\0' */
612-
int n;
613-
614-
n = PyOS_snprintf(buf, sizeof(buf), "%.3s %.3s%3d %.2d:%.2d:%.2d",
615-
wday_name[timeptr->tm_wday],
616-
mon_name[timeptr->tm_mon],
617-
timeptr->tm_mday, timeptr->tm_hour,
618-
timeptr->tm_min, timeptr->tm_sec);
619-
/* XXX: since the fields used by snprintf above are validated in checktm,
620-
* the following condition should never trigger. We keep the check because
621-
* historically fixed size buffer used in asctime was the source of
622-
* crashes. */
623-
if (n + 1 != sizeof(buf)) {
624-
PyErr_SetString(PyExc_ValueError, "unconvertible time");
625-
return NULL;
626-
}
627-
628-
return PyUnicode_FromFormat("%s %d", buf, 1900 + timeptr->tm_year);
611+
return PyUnicode_FromFormat(
612+
"%s %s%3d %.2d:%.2d:%.2d %d",
613+
wday_name[timeptr->tm_wday],
614+
mon_name[timeptr->tm_mon],
615+
timeptr->tm_mday, timeptr->tm_hour,
616+
timeptr->tm_min, timeptr->tm_sec,
617+
1900 + timeptr->tm_year);
629618
}
630619

631620
static PyObject *

Objects/weakrefobject.c

Lines changed: 27 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -157,34 +157,31 @@ static PyObject *
157157
weakref_repr(PyWeakReference *self)
158158
{
159159
char buffer[256];
160-
if (PyWeakref_GET_OBJECT(self) == Py_None) {
161-
PyOS_snprintf(buffer, sizeof(buffer), "<weakref at %p; dead>", self);
160+
PyObject *name, *repr;
161+
162+
if (PyWeakref_GET_OBJECT(self) == Py_None)
163+
return PyUnicode_FromFormat("<weakref at %p; dead>", self);
164+
165+
name = PyObject_GetAttrString(PyWeakref_GET_OBJECT(self), "__name__");
166+
if (name == NULL || !PyUnicode_Check(name)) {
167+
if (name == NULL)
168+
PyErr_Clear();
169+
repr = PyUnicode_FromFormat(
170+
"<weakref at %p; to '%s' at %p>",
171+
self,
172+
Py_TYPE(PyWeakref_GET_OBJECT(self))->tp_name,
173+
PyWeakref_GET_OBJECT(self));
162174
}
163175
else {
164-
char *name = NULL;
165-
PyObject *nameobj = PyObject_GetAttrString(PyWeakref_GET_OBJECT(self),
166-
"__name__");
167-
if (nameobj == NULL)
168-
PyErr_Clear();
169-
else if (PyUnicode_Check(nameobj))
170-
name = _PyUnicode_AsString(nameobj);
171-
if (name)
172-
PyOS_snprintf(buffer, sizeof(buffer),
173-
"<weakref at %p; to '%.50s' at %p (%s)>",
174-
self,
175-
Py_TYPE(PyWeakref_GET_OBJECT(self))->tp_name,
176-
PyWeakref_GET_OBJECT(self),
177-
name);
178-
else
179-
PyOS_snprintf(buffer, sizeof(buffer),
180-
"<weakref at %p; to '%.50s' at %p>",
181-
self,
182-
Py_TYPE(PyWeakref_GET_OBJECT(self))->tp_name,
183-
PyWeakref_GET_OBJECT(self));
184-
185-
Py_XDECREF(nameobj);
176+
repr = PyUnicode_FromFormat(
177+
"<weakref at %p; to '%s' at %p (%U)>",
178+
self,
179+
Py_TYPE(PyWeakref_GET_OBJECT(self))->tp_name,
180+
PyWeakref_GET_OBJECT(self),
181+
name);
186182
}
187-
return PyUnicode_FromString(buffer);
183+
Py_XDECREF(name);
184+
return repr;
188185
}
189186

190187
/* Weak references only support equality, not ordering. Two weak references
@@ -459,12 +456,11 @@ WRAP_TERNARY(proxy_call, PyEval_CallObjectWithKeywords)
459456
static PyObject *
460457
proxy_repr(PyWeakReference *proxy)
461458
{
462-
char buf[160];
463-
PyOS_snprintf(buf, sizeof(buf),
464-
"<weakproxy at %p to %.100s at %p>", proxy,
465-
Py_TYPE(PyWeakref_GET_OBJECT(proxy))->tp_name,
466-
PyWeakref_GET_OBJECT(proxy));
467-
return PyUnicode_FromString(buf);
459+
return PyUnicode_FromFormat(
460+
"<weakproxy at %p to %s at %p>",
461+
proxy,
462+
Py_TYPE(PyWeakref_GET_OBJECT(proxy))->tp_name,
463+
PyWeakref_GET_OBJECT(proxy));
468464
}
469465

470466

0 commit comments

Comments
 (0)