зеркало из https://github.com/microsoft/git.git
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>
This commit is contained in:
Родитель
b875036e5a
Коммит
f8b5a8e13c
18
usage.c
18
usage.c
|
@ -64,8 +64,24 @@ void die_errno(const char *fmt, ...)
|
|||
{
|
||||
va_list params;
|
||||
char fmt_with_err[1024];
|
||||
char str_error[256], *err;
|
||||
int i, j;
|
||||
|
||||
snprintf(fmt_with_err, sizeof(fmt_with_err), "%s: %s", fmt, strerror(errno));
|
||||
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);
|
||||
|
|
Загрузка…
Ссылка в новой задаче