]> granicus.if.org Git - python/commitdiff
Patches for mywrite() by Marc Lemburg: save/restore the error state
authorGuido van Rossum <guido@python.org>
Mon, 12 Oct 1998 18:22:10 +0000 (18:22 +0000)
committerGuido van Rossum <guido@python.org>
Mon, 12 Oct 1998 18:22:10 +0000 (18:22 +0000)
reliably; check return value of vsprintf().

Python/sysmodule.c

index 29e55eab9d6068db3b880c8c6dcec70fc08f4f74..6c834d0808c2a44a404ab5e094fb177774721c1f 100644 (file)
@@ -594,8 +594,7 @@ PySys_SetArgv(argc, argv)
 
       The first function writes to sys.stdout; the second to sys.stderr.  When
       there is a problem, they write to the real (C level) stdout or stderr;
-      no exceptions are raised (but a pending exception may be cleared when a
-      new exception is caught).
+      no exceptions are raised.
 
       Both take a printf-style format string as their first argument followed
       by a variable length argument list determined by the format string.
@@ -619,18 +618,22 @@ mywrite(name, fp, format, va)
        va_list va;
 {
        PyObject *file;
+       PyObject *error_type, *error_value, *error_traceback;
 
+       PyErr_Fetch(&error_type, &error_value, &error_traceback);
        file = PySys_GetObject(name);
        if (file == NULL || PyFile_AsFile(file) == fp)
                vfprintf(fp, format, va);
        else {
                char buffer[1001];
-               vsprintf(buffer, format, va);
+               if (vsprintf(buffer, format, va) >= sizeof(buffer))
+                   Py_FatalError("PySys_WriteStdout/err: buffer overrun");
                if (PyFile_WriteString(buffer, file) != 0) {
                        PyErr_Clear();
                        fputs(buffer, fp);
                }
        }
+       PyErr_Restore(error_type, error_value, error_traceback);
 }
 
 void