]> granicus.if.org Git - python/commitdiff
Use PyOS_vsnprintf() and check its return value.
authorJeremy Hylton <jeremy@alum.mit.edu>
Wed, 28 Nov 2001 21:44:53 +0000 (21:44 +0000)
committerJeremy Hylton <jeremy@alum.mit.edu>
Wed, 28 Nov 2001 21:44:53 +0000 (21:44 +0000)
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.

Python/sysmodule.c

index 1ca69b4da7e93b97d937dcc2842e31ebb150b1d8..8b27b37b76b79fb14dbb0c671895d162f71338f5 100644 (file)
@@ -1023,12 +1023,19 @@ mywrite(char *name, FILE *fp, const char *format, va_list va)
                vfprintf(fp, format, va);
        else {
                char buffer[1001];
-               if (vsprintf(buffer, format, va) >= sizeof(buffer))
-                   Py_FatalError("PySys_WriteStdout/err: buffer overrun");
+               int written = PyOS_vsnprintf(buffer, sizeof(buffer), 
+                                            format, va);
                if (PyFile_WriteString(buffer, file) != 0) {
                        PyErr_Clear();
                        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);
 }