die_errno(): double % in strerror() output just in case
authorJunio C Hamano <gitster@pobox.com>
Sat, 27 Jun 2009 15:58:45 +0000 (17:58 +0200)
committerJunio C Hamano <gitster@pobox.com>
Sat, 27 Jun 2009 18:14:53 +0000 (11:14 -0700)
[tr: handle border case where % is placed at end of buffer]

Signed-off-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Thomas Rast <trast@student.ethz.ch>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
usage.c

diff --git a/usage.c b/usage.c
index fd936a1aebd05df53ef49e79825286a804f4ccd2..b6aea45280bf2aa4c06a0130f912a61377165016 100644 (file)
--- a/usage.c
+++ b/usage.c
@@ -64,8 +64,24 @@ void die_errno(const char *fmt, ...)
 {
        va_list params;
        char fmt_with_err[1024];
-
-       snprintf(fmt_with_err, sizeof(fmt_with_err), "%s: %s", fmt, strerror(errno));
+       char str_error[256], *err;
+       int i, j;
+
+       err = strerror(errno);
+       for (i = j = 0; err[i] && j < sizeof(str_error) - 1; ) {
+               if ((str_error[j++] = err[i++]) != '%')
+                       continue;
+               if (j < sizeof(str_error) - 1) {
+                       str_error[j++] = '%';
+               } else {
+                       /* No room to double the '%', so we overwrite it with
+                        * '\0' below */
+                       j--;
+                       break;
+               }
+       }
+       str_error[j] = 0;
+       snprintf(fmt_with_err, sizeof(fmt_with_err), "%s: %s", fmt, str_error);
 
        va_start(params, fmt);
        die_routine(fmt_with_err, params);