Use PyOS_vsnprintf() and check its return value.
If it returns -1 (which indicates overflow on old Linux platforms and perhaps on Windows) or size greater than buffer, write a message indicating that the previous message was truncated.
This commit is contained in:
parent
4b4ab20f2c
commit
5d3d134d56
|
@ -1023,12 +1023,19 @@ mywrite(char *name, FILE *fp, const char *format, va_list va)
|
||||||
vfprintf(fp, format, va);
|
vfprintf(fp, format, va);
|
||||||
else {
|
else {
|
||||||
char buffer[1001];
|
char buffer[1001];
|
||||||
if (vsprintf(buffer, format, va) >= sizeof(buffer))
|
int written = PyOS_vsnprintf(buffer, sizeof(buffer),
|
||||||
Py_FatalError("PySys_WriteStdout/err: buffer overrun");
|
format, va);
|
||||||
if (PyFile_WriteString(buffer, file) != 0) {
|
if (PyFile_WriteString(buffer, file) != 0) {
|
||||||
PyErr_Clear();
|
PyErr_Clear();
|
||||||
fputs(buffer, fp);
|
fputs(buffer, fp);
|
||||||
}
|
}
|
||||||
|
if (written == -1 || written > sizeof(buffer)) {
|
||||||
|
const char *truncated = "... truncated";
|
||||||
|
if (PyFile_WriteString(truncated, file) != 0) {
|
||||||
|
PyErr_Clear();
|
||||||
|
fputs(truncated, fp);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
PyErr_Restore(error_type, error_value, error_traceback);
|
PyErr_Restore(error_type, error_value, error_traceback);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue