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

Skip to content

Commit ba87347

Browse files
committed
delta_str(): Purged last uses of sprintf (in favor of PyOS_snprintf).
1 parent 72a6ddb commit ba87347

1 file changed

Lines changed: 25 additions & 10 deletions

File tree

Modules/datetimemodule.c

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1805,27 +1805,42 @@ delta_str(PyDateTime_Delta *self)
18051805
int us = GET_TD_MICROSECONDS(self);
18061806
int hours;
18071807
int minutes;
1808-
char buf[500];
1809-
int i = 0;
1808+
char buf[100];
1809+
char *pbuf = buf;
1810+
size_t buflen = sizeof(buf);
1811+
int n;
18101812

18111813
minutes = divmod(seconds, 60, &seconds);
18121814
hours = divmod(minutes, 60, &minutes);
18131815

18141816
if (days) {
1815-
i += sprintf(buf + i, "%d day%s, ", days,
1816-
(days == 1 || days == -1) ? "" : "s");
1817-
assert(i < sizeof(buf));
1817+
n = PyOS_snprintf(pbuf, buflen, "%d day%s, ", days,
1818+
(days == 1 || days == -1) ? "" : "s");
1819+
if (n < 0 || (size_t)n >= buflen)
1820+
goto Fail;
1821+
pbuf += n;
1822+
buflen -= (size_t)n;
18181823
}
18191824

1820-
i += sprintf(buf + i, "%d:%02d:%02d", hours, minutes, seconds);
1821-
assert(i < sizeof(buf));
1825+
n = PyOS_snprintf(pbuf, buflen, "%d:%02d:%02d",
1826+
hours, minutes, seconds);
1827+
if (n < 0 || (size_t)n >= buflen)
1828+
goto Fail;
1829+
pbuf += n;
1830+
buflen -= (size_t)n;
18221831

18231832
if (us) {
1824-
i += sprintf(buf + i, ".%06d", us);
1825-
assert(i < sizeof(buf));
1833+
n = PyOS_snprintf(pbuf, buflen, ".%06d", us);
1834+
if (n < 0 || (size_t)n >= buflen)
1835+
goto Fail;
1836+
pbuf += n;
18261837
}
18271838

1828-
return PyString_FromStringAndSize(buf, i);
1839+
return PyString_FromStringAndSize(buf, pbuf - buf);
1840+
1841+
Fail:
1842+
PyErr_SetString(PyExc_SystemError, "goofy result from PyOS_snprintf");
1843+
return NULL;
18291844
}
18301845

18311846
/* Pickle support. Quite a maze! While __getstate__/__setstate__ sufficed

0 commit comments

Comments
 (0)