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

+9-7
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

+1-1
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

+5-3
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

+1-1
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

+2-1
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

+2-1
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

+1-1
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

+2-2
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

+1-1
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

+12-9
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')

Objects/typeobject.c

+2-1
Original file line numberDiff line numberDiff line change
@@ -4730,7 +4730,8 @@ type_traverse(PyTypeObject *type, visitproc visit, void *arg)
47304730
for heaptypes. */
47314731
if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE)) {
47324732
char msg[200];
4733-
sprintf(msg, "type_traverse() called on non-heap type '%.100s'",
4733+
snprintf(msg, sizeof(msg),
4734+
"type_traverse() called on non-heap type '%.100s'",
47344735
type->tp_name);
47354736
_PyObject_ASSERT_FAILED_MSG((PyObject *)type, msg);
47364737
}

Objects/unicodeobject.c

+23-13
Original file line numberDiff line numberDiff line change
@@ -733,7 +733,8 @@ xmlcharrefreplace(_PyBytesWriter *writer, char *str,
733733

734734
/* generate replacement */
735735
for (i = collstart; i < collend; ++i) {
736-
size = sprintf(str, "&#%d;", PyUnicode_READ(kind, data, i));
736+
size = snprintf(str, sizeof(str),
737+
"&#%d;", PyUnicode_READ(kind, data, i));
737738
if (size < 0) {
738739
return NULL;
739740
}
@@ -2449,39 +2450,47 @@ unicode_fromformat_arg(_PyUnicodeWriter *writer,
24492450
case 'u':
24502451
case 'x':
24512452
{
2452-
/* used by sprintf */
2453+
/* used by snprintf */
24532454
char buffer[MAX_LONG_LONG_CHARS];
24542455
Py_ssize_t arglen;
24552456

24562457
if (*f == 'u') {
24572458
if (longflag) {
2458-
len = sprintf(buffer, "%lu", va_arg(*vargs, unsigned long));
2459+
len = snprintf(buffer, sizeof(buffer),
2460+
"%lu", va_arg(*vargs, unsigned long));
24592461
}
24602462
else if (longlongflag) {
2461-
len = sprintf(buffer, "%llu", va_arg(*vargs, unsigned long long));
2463+
len = snprintf(buffer, sizeof(buffer),
2464+
"%llu", va_arg(*vargs, unsigned long long));
24622465
}
24632466
else if (size_tflag) {
2464-
len = sprintf(buffer, "%zu", va_arg(*vargs, size_t));
2467+
len = snprintf(buffer, sizeof(buffer),
2468+
"%zu", va_arg(*vargs, size_t));
24652469
}
24662470
else {
2467-
len = sprintf(buffer, "%u", va_arg(*vargs, unsigned int));
2471+
len = snprintf(buffer, sizeof(buffer),
2472+
"%u", va_arg(*vargs, unsigned int));
24682473
}
24692474
}
24702475
else if (*f == 'x') {
2471-
len = sprintf(buffer, "%x", va_arg(*vargs, int));
2476+
len = snprintf(buffer, sizeof(buffer), "%x", va_arg(*vargs, int));
24722477
}
24732478
else {
24742479
if (longflag) {
2475-
len = sprintf(buffer, "%li", va_arg(*vargs, long));
2480+
len = snprintf(buffer, sizeof(buffer),
2481+
"%li", va_arg(*vargs, long));
24762482
}
24772483
else if (longlongflag) {
2478-
len = sprintf(buffer, "%lli", va_arg(*vargs, long long));
2484+
len = snprintf(buffer, sizeof(buffer),
2485+
"%lli", va_arg(*vargs, long long));
24792486
}
24802487
else if (size_tflag) {
2481-
len = sprintf(buffer, "%zi", va_arg(*vargs, Py_ssize_t));
2488+
len = snprintf(buffer, sizeof(buffer),
2489+
"%zi", va_arg(*vargs, Py_ssize_t));
24822490
}
24832491
else {
2484-
len = sprintf(buffer, "%i", va_arg(*vargs, int));
2492+
len = snprintf(buffer, sizeof(buffer),
2493+
"%i", va_arg(*vargs, int));
24852494
}
24862495
}
24872496
assert(len >= 0);
@@ -2530,7 +2539,7 @@ unicode_fromformat_arg(_PyUnicodeWriter *writer,
25302539
{
25312540
char number[MAX_LONG_LONG_CHARS];
25322541

2533-
len = sprintf(number, "%p", va_arg(*vargs, void*));
2542+
len = snprintf(number, sizeof(number), "%p", va_arg(*vargs, void*));
25342543
assert(len >= 0);
25352544

25362545
/* %p is ill-defined: ensure leading 0x. */
@@ -8104,7 +8113,8 @@ charmap_encoding_error(
81048113
for (collpos = collstartpos; collpos < collendpos; ++collpos) {
81058114
char buffer[2+29+1+1];
81068115
char *cp;
8107-
sprintf(buffer, "&#%d;", (int)PyUnicode_READ_CHAR(unicode, collpos));
8116+
snprintf(buffer, sizeof(buffer),
8117+
"&#%d;", (int)PyUnicode_READ_CHAR(unicode, collpos));
81088118
for (cp = buffer; *cp; ++cp) {
81098119
x = charmapencode_output(*cp, mapping, res, respos);
81108120
if (x==enc_EXCEPTION)

Parser/string_parser.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ decode_unicode_with_escapes(Parser *parser, const char *s, size_t len, Token *t)
118118
w_len = PyUnicode_GET_LENGTH(w);
119119
for (i = 0; i < w_len; i++) {
120120
Py_UCS4 chr = PyUnicode_READ(kind, data, i);
121-
sprintf(p, "\\U%08x", chr);
121+
snprintf(p, sizeof(p), "\\U%08x", chr);
122122
p += 10;
123123
}
124124
/* Should be impossible to overflow */

Programs/_freeze_module.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ static PyObject *
124124
compile_and_marshal(const char *name, const char *text)
125125
{
126126
char *filename = (char *) malloc(strlen(name) + 10);
127-
sprintf(filename, "<frozen %s>", name);
127+
snprintf(filename, sizeof(filename), "<frozen %s>", name);
128128
PyObject *code = Py_CompileStringExFlags(text, filename,
129129
Py_file_input, NULL, 0);
130130
free(filename);

Python/pystrtod.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -1239,7 +1239,7 @@ format_float_short(double d, char format_code,
12391239
/* Now that we've done zero padding, add an exponent if needed. */
12401240
if (use_exp) {
12411241
*p++ = float_strings[OFS_E][0];
1242-
exp_len = sprintf(p, "%+.02d", exp);
1242+
exp_len = snprintf(p, sizeof(p), "%+.02d", exp);
12431243
p += exp_len;
12441244
}
12451245
exit:

Python/specialize.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,7 @@ _Py_PrintSpecializationStats(int to_file)
232232
hex_name[40] = '\0';
233233
char buf[64];
234234
assert(strlen(dirname) + 40 + strlen(".txt") < 64);
235-
sprintf(buf, "%s%s.txt", dirname, hex_name);
235+
snprintf(buf, sizeof(buf), "%s%s.txt", dirname, hex_name);
236236
FILE *fout = fopen(buf, "w");
237237
if (fout) {
238238
out = fout;
@@ -1084,7 +1084,7 @@ PyObject *descr, DescriptorClassification kind)
10841084
if (dict) {
10851085
SPECIALIZATION_FAIL(LOAD_ATTR, SPEC_FAIL_ATTR_NOT_MANAGED_DICT);
10861086
return 0;
1087-
}
1087+
}
10881088
assert(owner_cls->tp_dictoffset > 0);
10891089
assert(owner_cls->tp_dictoffset <= INT16_MAX);
10901090
_py_set_opcode(instr, LOAD_ATTR_METHOD_LAZY_DICT);

0 commit comments

Comments
 (0)