]> git.ipfire.org Git - thirdparty/git.git/blobdiff - usage.c
config.mak.uname: remove unused the NO_R_TO_GCC_LINKER flag
[thirdparty/git.git] / usage.c
diff --git a/usage.c b/usage.c
index 2fdb20086bd695eaad57ef7574ce4e02655e96c1..58fb5fff5f245c33898e27c85296a4a47325c34e 100644 (file)
--- a/usage.c
+++ b/usage.c
@@ -9,14 +9,26 @@
 void vreportf(const char *prefix, const char *err, va_list params)
 {
        char msg[4096];
-       char *p;
+       char *p, *pend = msg + sizeof(msg);
+       size_t prefix_len = strlen(prefix);
 
-       vsnprintf(msg, sizeof(msg), err, params);
-       for (p = msg; *p; p++) {
+       if (sizeof(msg) <= prefix_len) {
+               fprintf(stderr, "BUG!!! too long a prefix '%s'\n", prefix);
+               abort();
+       }
+       memcpy(msg, prefix, prefix_len);
+       p = msg + prefix_len;
+       if (vsnprintf(p, pend - p, err, params) < 0)
+               *p = '\0'; /* vsnprintf() failed, clip at prefix */
+
+       for (; p != pend - 1 && *p; p++) {
                if (iscntrl(*p) && *p != '\t' && *p != '\n')
                        *p = '?';
        }
-       fprintf(stderr, "%s%s\n", prefix, msg);
+
+       *(p++) = '\n'; /* we no longer need a NUL */
+       fflush(stderr);
+       write_in_full(2, msg, p - msg);
 }
 
 static NORETURN void usage_builtin(const char *err, va_list params)