From: Zaba <da...@us...> - 2009-12-30 12:46:07
|
via 964f798ab9503b70e423411b6576274f02ecf74a (commit) from dc6da664d1b8aebf9c7baf96dc26513863affadb (commit) ----------------------------------------------------------------------- commit 964f798ab9503b70e423411b6576274f02ecf74a Author: Vsevolod Kozlov <za...@th...> Date: Wed Dec 30 15:41:22 2009 +0300 vmake_stringf: Copy the va_list argument for the second vsnprintf call. It needs to be copied, otherwise the second call to vsnprintf will be passed a va_list that has been messed up by the first call, and weird segfaults will occur. (They did for me.) ----------------------------------------------------------------------- Summary of changes: crawl-ref/source/libutil.cc | 5 ++++- 1 files changed, 4 insertions(+), 1 deletions(-) diff --git a/crawl-ref/source/libutil.cc b/crawl-ref/source/libutil.cc index 26243f4..bd3440d 100644 --- a/crawl-ref/source/libutil.cc +++ b/crawl-ref/source/libutil.cc @@ -143,12 +143,15 @@ std::string strip_filename_unsafe_chars(const std::string &s) std::string vmake_stringf(const char* s, va_list args) { char buf1[400]; + va_list orig_args; + va_copy(orig_args, args); size_t len = vsnprintf(buf1, sizeof buf1, s, args); if (len < sizeof buf1) return (buf1); char *buf2 = (char*)malloc(len + 1); - vsnprintf(buf2, len + 1, s, args); + vsnprintf(buf2, len + 1, s, orig_args); + va_end(orig_args); std::string ret(buf2); free(buf2); -- Dungeon Crawl Stone Soup |