summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2009-06-27 15:58:45 (GMT)
committerJunio C Hamano <gitster@pobox.com>2009-06-27 18:14:53 (GMT)
commitf8b5a8e13cb4d60c8b630f92a8f07590ef218ec5 (patch)
tree002d481db5b2de5530d0b69ae470a7ebe5f77892
parentb875036e5a2ab569a2123abe9ebfe25258227951 (diff)
downloadgit-f8b5a8e13cb4d60c8b630f92a8f07590ef218ec5.zip
git-f8b5a8e13cb4d60c8b630f92a8f07590ef218ec5.tar.gz
git-f8b5a8e13cb4d60c8b630f92a8f07590ef218ec5.tar.bz2
die_errno(): double % in strerror() output just in case
[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>
-rw-r--r--usage.c20
1 files changed, 18 insertions, 2 deletions
diff --git a/usage.c b/usage.c
index fd936a1..b6aea45 100644
--- 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);