]> granicus.if.org Git - python/commitdiff
mywrite(): The test for trouble in PyOS_vsnprintf was wrong on both
authorTim Peters <tim.peters@gmail.com>
Sun, 2 Dec 2001 08:29:16 +0000 (08:29 +0000)
committerTim Peters <tim.peters@gmail.com>
Sun, 2 Dec 2001 08:29:16 +0000 (08:29 +0000)
ends.  Also, when there is trouble, ensure the buffer has a traiing
0 byte.

Python/sysmodule.c

index 8b27b37b76b79fb14dbb0c671895d162f71338f5..faa63ab7a3d34f184a031c165ea19c22f7d36b38 100644 (file)
@@ -1023,13 +1023,20 @@ mywrite(char *name, FILE *fp, const char *format, va_list va)
                vfprintf(fp, format, va);
        else {
                char buffer[1001];
-               int written = PyOS_vsnprintf(buffer, sizeof(buffer), 
-                                            format, va);
+               const int written = PyOS_vsnprintf(buffer, sizeof(buffer),
+                                                  format, va);
+               const int trouble = written < 0 || written >= sizeof(buffer);
+               if (trouble) {
+                       /* Ensure there's a trailing null byte -- MS
+                          vsnprintf fills the buffer to the very end
+                          if it's not big enough. */
+                       buffer[sizeof(buffer) - 1] = '\0';
+               }
                if (PyFile_WriteString(buffer, file) != 0) {
                        PyErr_Clear();
                        fputs(buffer, fp);
                }
-               if (written == -1 || written > sizeof(buffer)) {
+               if (trouble) {
                        const char *truncated = "... truncated";
                        if (PyFile_WriteString(truncated, file) != 0) {
                                PyErr_Clear();