Skip to content

Commit 38f8e7d

Browse files
committed
gh-101703: use snprintf instead of sprintf
1 parent 244d4cd commit 38f8e7d

16 files changed

+66
-46
lines changed

Modules/_ctypes/_ctypes.c

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -392,9 +392,9 @@ _ctypes_alloc_format_string_with_shape(int ndim, const Py_ssize_t *shape,
392392
strcat(new_prefix, "(");
393393
for (k = 0; k < ndim; ++k) {
394394
if (k < ndim-1) {
395-
sprintf(buf, "%zd,", shape[k]);
395+
snprintf(buf, sizeof(buf), "%zd,", shape[k]);
396396
} else {
397-
sprintf(buf, "%zd)", shape[k]);
397+
snprintf(buf, sizeof(buf), "%zd)", shape[k]);
398398
}
399399
strcat(new_prefix, buf);
400400
}
@@ -2639,7 +2639,8 @@ unique_key(CDataObject *target, Py_ssize_t index)
26392639
size_t bytes_left;
26402640

26412641
Py_BUILD_ASSERT(sizeof(string) - 1 > sizeof(Py_ssize_t) * 2);
2642-
cp += sprintf(cp, "%x", Py_SAFE_DOWNCAST(index, Py_ssize_t, int));
2642+
cp += snprintf(cp, sizeof(cp), "%x",
2643+
Py_SAFE_DOWNCAST(index, Py_ssize_t, int));
26432644
while (target->b_base) {
26442645
bytes_left = sizeof(string) - (cp - string) - 1;
26452646
/* Hex format needs 2 characters per byte */
@@ -2648,7 +2649,8 @@ unique_key(CDataObject *target, Py_ssize_t index)
26482649
"ctypes object structure too deep");
26492650
return NULL;
26502651
}
2651-
cp += sprintf(cp, ":%x", Py_SAFE_DOWNCAST(target->b_index, Py_ssize_t, int));
2652+
cp += snprintf(cp, sizeof(cp), ":%x",
2653+
Py_SAFE_DOWNCAST(target->b_index, Py_ssize_t, int));
26522654
target = target->b_base;
26532655
}
26542656
return PyUnicode_FromStringAndSize(string, cp-string);
@@ -3364,7 +3366,7 @@ static PPROC FindAddress(void *handle, const char *name, PyObject *type)
33643366
if (!mangled_name)
33653367
return NULL;
33663368
for (i = 0; i < 32; ++i) {
3367-
sprintf(mangled_name, "_%s@%d", name, i*4);
3369+
snprintf(mangled_name, sizeof(mangled_name), "_%s@%d", name, i*4);
33683370
Py_BEGIN_ALLOW_THREADS
33693371
address = (PPROC)GetProcAddress(handle, mangled_name);
33703372
Py_END_ALLOW_THREADS
@@ -4851,10 +4853,10 @@ PyCArrayType_from_ctype(PyObject *itemtype, Py_ssize_t length)
48514853
return NULL;
48524854
}
48534855
#ifdef MS_WIN64
4854-
sprintf(name, "%.200s_Array_%Id",
4856+
snprintf(name, sizeof(name), "%.200s_Array_%Id",
48554857
((PyTypeObject *)itemtype)->tp_name, length);
48564858
#else
4857-
sprintf(name, "%.200s_Array_%ld",
4859+
snprintf(name, sizeof(name), "%.200s_Array_%ld",
48584860
((PyTypeObject *)itemtype)->tp_name, (long)length);
48594861
#endif
48604862

Modules/_ctypes/stgdict.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -612,7 +612,7 @@ PyCStructUnionType_update_stgdict(PyObject *type, PyObject *fields, int isStruct
612612
PyErr_NoMemory();
613613
return -1;
614614
}
615-
sprintf(buf, "%s:%s:", fieldfmt, fieldname);
615+
snprintf(buf, sizeof(buf), "%s:%s:", fieldfmt, fieldname);
616616

617617
ptr = stgdict->format;
618618
if (dict->shape != NULL) {

Modules/_datetimemodule.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1559,11 +1559,13 @@ make_freplacement(PyObject *object)
15591559
{
15601560
char freplacement[64];
15611561
if (PyTime_Check(object))
1562-
sprintf(freplacement, "%06d", TIME_GET_MICROSECOND(object));
1562+
snprintf(freplacement, sizeof(freplacement),
1563+
"%06d", TIME_GET_MICROSECOND(object));
15631564
else if (PyDateTime_Check(object))
1564-
sprintf(freplacement, "%06d", DATE_GET_MICROSECOND(object));
1565+
snprintf(freplacement, sizeof(freplacement),
1566+
"%06d", DATE_GET_MICROSECOND(object));
15651567
else
1566-
sprintf(freplacement, "%06d", 0);
1568+
snprintf(freplacement, sizeof(freplacement), "%06d", 0);
15671569

15681570
return PyBytes_FromStringAndSize(freplacement, strlen(freplacement));
15691571
}

Modules/_pickle.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2098,7 +2098,7 @@ save_long(PicklerObject *self, PyObject *obj)
20982098
}
20992099
}
21002100
else {
2101-
sprintf(pdata, "%c%ld\n", INT, val);
2101+
snprintf(pdata, sizeof(pdata), "%c%ld\n", INT, val);
21022102
len = strlen(pdata);
21032103
}
21042104
if (_Pickler_Write(self, pdata, len) < 0)

Modules/_ssl.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1324,8 +1324,9 @@ _get_peer_alt_names (_sslmodulestate *state, X509 *certificate) {
13241324
} else if (name->d.ip->length == 16) {
13251325
/* PyUnicode_FromFormat() does not support %X */
13261326
unsigned char *p = name->d.ip->data;
1327-
len = sprintf(
1327+
len = snprintf(
13281328
buf,
1329+
sizeof(buf),
13291330
"%X:%X:%X:%X:%X:%X:%X:%X",
13301331
p[0] << 8 | p[1],
13311332
p[2] << 8 | p[3],

Modules/_testcapimodule.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1097,7 +1097,8 @@ test_capsule(PyObject *self, PyObject *Py_UNUSED(ignored))
10971097
#undef FAIL
10981098
#define FAIL(x) \
10991099
{ \
1100-
sprintf(buffer, "%s module: \"%s\" attribute: \"%s\"", \
1100+
snprintf(buffer, sizeof(buffer), \
1101+
"%s module: \"%s\" attribute: \"%s\"", \
11011102
x, known->module, known->attribute); \
11021103
error = buffer; \
11031104
goto exit; \

Modules/getnameinfo.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ getnameinfo(sa, salen, host, hostlen, serv, servlen, flags)
139139
if (serv == NULL || servlen == 0) {
140140
/* what we should do? */
141141
} else if (flags & NI_NUMERICSERV) {
142-
sprintf(numserv, "%d", ntohs(port));
142+
snprintf(numserv, sizeof(numserv), "%d", ntohs(port));
143143
if (strlen(numserv) > servlen)
144144
return ENI_MEMORY;
145145
strcpy(serv, numserv);

Modules/socketmodule.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1302,11 +1302,11 @@ makebdaddr(bdaddr_t *bdaddr)
13021302
octets[i] = ((*bdaddr) >> (8 * i)) & 0xFF;
13031303
}
13041304

1305-
sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
1305+
snprintf(buf, sizeof(buf), "%02X:%02X:%02X:%02X:%02X:%02X",
13061306
octets[5], octets[4], octets[3],
13071307
octets[2], octets[1], octets[0]);
13081308
#else
1309-
sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",
1309+
snprintf(buf, sizeof(buf), "%02X:%02X:%02X:%02X:%02X:%02X",
13101310
bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],
13111311
bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);
13121312
#endif

Modules/unicodedata.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1108,7 +1108,7 @@ _getucname(PyObject *self,
11081108
if (buflen < 28)
11091109
/* Worst case: CJK UNIFIED IDEOGRAPH-20000 */
11101110
return 0;
1111-
sprintf(buffer, "CJK UNIFIED IDEOGRAPH-%X", code);
1111+
snprintf(buffer, sizeof(buffer), "CJK UNIFIED IDEOGRAPH-%X", code);
11121112
return 1;
11131113
}
11141114

Objects/bytesobject.c

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -270,40 +270,43 @@ PyBytes_FromFormatV(const char *format, va_list vargs)
270270

271271
case 'd':
272272
if (longflag) {
273-
sprintf(buffer, "%ld", va_arg(vargs, long));
273+
snprintf(buffer, sizeof(buffer), "%ld", va_arg(vargs, long));
274274
}
275275
else if (size_tflag) {
276-
sprintf(buffer, "%zd", va_arg(vargs, Py_ssize_t));
276+
snprintf(buffer, sizeof(buffer),
277+
"%zd", va_arg(vargs, Py_ssize_t));
277278
}
278279
else {
279-
sprintf(buffer, "%d", va_arg(vargs, int));
280+
snprintf(buffer, sizeof(buffer), "%d", va_arg(vargs, int));
280281
}
281282
assert(strlen(buffer) < sizeof(buffer));
282283
WRITE_BYTES(buffer);
283284
break;
284285

285286
case 'u':
286287
if (longflag) {
287-
sprintf(buffer, "%lu", va_arg(vargs, unsigned long));
288+
snprintf(buffer, sizeof(buffer),
289+
"%lu", va_arg(vargs, unsigned long));
288290
}
289291
else if (size_tflag) {
290-
sprintf(buffer, "%zu", va_arg(vargs, size_t));
292+
snprintf(buffer, sizeof(buffer), "%zu", va_arg(vargs, size_t));
291293
}
292294
else {
293-
sprintf(buffer, "%u", va_arg(vargs, unsigned int));
295+
snprintf(buffer, sizeof(buffer),
296+
"%u", va_arg(vargs, unsigned int));
294297
}
295298
assert(strlen(buffer) < sizeof(buffer));
296299
WRITE_BYTES(buffer);
297300
break;
298301

299302
case 'i':
300-
sprintf(buffer, "%i", va_arg(vargs, int));
303+
snprintf(buffer, sizeof(buffer), "%i", va_arg(vargs, int));
301304
assert(strlen(buffer) < sizeof(buffer));
302305
WRITE_BYTES(buffer);
303306
break;
304307

305308
case 'x':
306-
sprintf(buffer, "%x", va_arg(vargs, int));
309+
snprintf(buffer, sizeof(buffer), "%x", va_arg(vargs, int));
307310
assert(strlen(buffer) < sizeof(buffer));
308311
WRITE_BYTES(buffer);
309312
break;
@@ -329,7 +332,7 @@ PyBytes_FromFormatV(const char *format, va_list vargs)
329332
}
330333

331334
case 'p':
332-
sprintf(buffer, "%p", va_arg(vargs, void*));
335+
snprintf(buffer, sizeof(buffer), "%p", va_arg(vargs, void*));
333336
assert(strlen(buffer) < sizeof(buffer));
334337
/* %p is ill-defined: ensure leading 0x. */
335338
if (buffer[1] == 'X')

0 commit comments

Comments
 (0)