Add fail-safe string termination for snprintf.
authorWerner Koch <wk@gnupg.org>
Mon, 7 Nov 2016 07:37:11 +0000 (08:37 +0100)
committerWerner Koch <wk@gnupg.org>
Mon, 7 Nov 2016 07:37:11 +0000 (08:37 +0100)
* gtk+-2/pinentry-gtk-2.c (changed_text_handler): Make sure an
 snprintf buffer is always ternminated.
* pinentry/pinentry.c (my_strusage): Ditto.
(write_status_error): Ditto.
(cmd_getinfo): Ditto.
* w32/main.c (w32_strerror): Ditto.
--

This is to fix the surprising implementation of snprintf on Windows.
Note that we don't need this in GnuPG because there we use our own
snprintf.

Signed-off-by: Werner Koch <wk@gnupg.org>
gtk+-2/pinentry-gtk-2.c
pinentry/pinentry.c
w32/main.c

index a7ac91e..6037533 100644 (file)
@@ -398,12 +398,14 @@ changed_text_handler (GtkWidget *widget)
   else if (percent < 0)
     {
       snprintf (textbuf, sizeof textbuf, "(%d%%)", -percent);
+      textbuf[sizeof textbuf -1] = 0;
       color.red = 0xffff;
       percent = -percent;
     }
   else
     {
       snprintf (textbuf, sizeof textbuf, "%d%%", percent);
+      textbuf[sizeof textbuf -1] = 0;
       color.green = 0xffff;
     }
   gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (qualitybar),
index 0023ebe..46e6894 100644 (file)
@@ -604,8 +604,11 @@ my_strusage( int level )
             size_t n = 50 + strlen (this_pgmname);
             str = malloc (n);
             if (str)
-              snprintf (str, n, "Usage: %s [options] (-h for help)",
-                        this_pgmname);
+              {
+                snprintf (str, n, "Usage: %s [options] (-h for help)",
+                          this_pgmname);
+                str[n-1] = 0;
+              }
           }
         p = str;
       }
@@ -966,6 +969,7 @@ write_status_error (assuan_context_t ctx, pinentry_t pe)
             pe->specific_err_loc? pe->specific_err_loc : "?",
             pe->specific_err,
             pe->specific_err_info? pe->specific_err_info : "");
+  buf[sizeof buf -1] = 0;
   assuan_write_status (ctx, "ERROR", buf);
 }
 
@@ -1435,6 +1439,7 @@ cmd_getinfo (assuan_context_t ctx, char *line)
     {
 
       snprintf (buffer, sizeof buffer, "%lu", (unsigned long)getpid ());
+      buffer[sizeof buffer -1] = 0;
       rc = assuan_send_data (ctx, buffer, strlen (buffer));
     }
   else if (!strcmp (line, "flavor"))
@@ -1460,6 +1465,7 @@ cmd_getinfo (assuan_context_t ctx, char *line)
         flags = "";
 
       snprintf (buffer, sizeof buffer, "%s%s", s, flags);
+      buffer[sizeof buffer -1] = 0;
       rc = assuan_send_data (ctx, buffer, strlen (buffer));
     }
   else
index 8c19cb2..b35879d 100644 (file)
@@ -83,6 +83,7 @@ w32_strerror (int ec)
   /* There is only a wchar_t FormatMessage.  It does not make much
      sense to play the conversion game; we print only the code.  */
   snprintf (strerr, sizeof strerr, "ec=%d", ec);
+  strerr[sizeof strerr -1] = 0;
 #else
   FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM, NULL, ec,
                  MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT),