From fd45f364a8387f7193f2b9be5d316ffb4361a5da Mon Sep 17 00:00:00 2001 From: Jonathan Nieder Date: Tue, 15 Mar 2011 16:03:47 +0800 Subject: [DEBUG] Use va_copy when reusing a va_list When tracing (with the DEBUG compile-time option set to 1 or 2), exverror calls TRACEV to print its arguments before passing them on. So the arguments are consumed by the time exvwarning looks for them, resulting in a segfault: $ sh -c '"' sh: Syntax error: Unterminated quoted string $ sh -o debug -c '"' sh: Segmentation fault (core dumped) Make a copy with va_copy to avoid this. Signed-off-by: Jonathan Nieder Signed-off-by: Herbert Xu --- src/error.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'src/error.c') diff --git a/src/error.c b/src/error.c index 7ad73bc..9d31989 100644 --- a/src/error.c +++ b/src/error.c @@ -143,8 +143,11 @@ exverror(int cond, const char *msg, va_list ap) { #ifdef DEBUG if (msg) { + va_list aq; TRACE(("exverror(%d, \"", cond)); - TRACEV((msg, ap)); + va_copy(aq, ap); + TRACEV((msg, aq)); + va_end(aq); TRACE(("\") pid=%d\n", getpid())); } else TRACE(("exverror(%d, NULL) pid=%d\n", cond, getpid())); -- cgit 1.4.1