diff options
author | Jonathan Nieder <jrnieder@gmail.com> | 2011-03-15 16:03:47 +0800 |
---|---|---|
committer | Herbert Xu <herbert@gondor.apana.org.au> | 2011-03-15 16:03:47 +0800 |
commit | fd45f364a8387f7193f2b9be5d316ffb4361a5da (patch) | |
tree | c81bb63705ec933ccdfcaabd39bb8f74cbd1d42d /src | |
parent | [EXPAND] Free IFS state after here document expansion (diff) | |
download | dash-fd45f364a8387f7193f2b9be5d316ffb4361a5da.tar.gz dash-fd45f364a8387f7193f2b9be5d316ffb4361a5da.zip |
[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 <jrnieder@gmail.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'src')
-rw-r--r-- | src/error.c | 5 |
1 files changed, 4 insertions, 1 deletions
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())); |