From 354816b2ff6361a8286a547c0c130e0de170f0a7 Mon Sep 17 00:00:00 2001 From: Robert Vollmert Date: Thu, 17 Dec 2009 15:51:51 +0100 Subject: Fix bad varargs handling. You can't pass a va_list to a variadic function. --- crawl-ref/source/format.cc | 2 +- crawl-ref/source/hiscores.cc | 2 +- crawl-ref/source/libutil.cc | 18 ++++++++++++------ crawl-ref/source/libutil.h | 1 + 4 files changed, 15 insertions(+), 8 deletions(-) (limited to 'crawl-ref/source') diff --git a/crawl-ref/source/format.cc b/crawl-ref/source/format.cc index 59fc8152bf..94c6b3cdfa 100644 --- a/crawl-ref/source/format.cc +++ b/crawl-ref/source/format.cc @@ -516,7 +516,7 @@ void formatted_string::cprintf(const char *s, ...) { va_list args; va_start(args, s); - cprintf(make_stringf(s, args)); + cprintf(vmake_stringf(s, args)); va_end(args); } diff --git a/crawl-ref/source/hiscores.cc b/crawl-ref/source/hiscores.cc index cbbd3b518c..4fa9d16826 100644 --- a/crawl-ref/source/hiscores.cc +++ b/crawl-ref/source/hiscores.cc @@ -2123,7 +2123,7 @@ void xlog_fields::add_field(const std::string &key, { va_list args; va_start(args, format); - std::string buf = make_stringf(format, args); + std::string buf = vmake_stringf(format, args); va_end(args); fields.push_back( std::pair( key, buf ) ); diff --git a/crawl-ref/source/libutil.cc b/crawl-ref/source/libutil.cc index 0243452e77..ce7fcbb429 100644 --- a/crawl-ref/source/libutil.cc +++ b/crawl-ref/source/libutil.cc @@ -136,24 +136,30 @@ std::string strip_filename_unsafe_chars(const std::string &s) return replace_all_of(s, " .&`\"\'|;{}()[]<>*%$#@!~?", ""); } -std::string make_stringf(const char *s, ...) +std::string vmake_stringf(const char* s, va_list args) { - va_list args; - va_start(args, s); char buf1[400]; size_t len = vsnprintf(buf1, sizeof buf1, s, args); - va_end(args); if (len < sizeof buf1) return (buf1); + char *buf2 = (char*)malloc(len + 1); - va_start(args, s); vsnprintf(buf2, len + 1, s, args); std::string ret(buf2); free(buf2); - va_end(args); + return (ret); } +std::string make_stringf(const char *s, ...) +{ + va_list args; + va_start(args, s); + std::string ret = vmake_stringf(s, args); + va_end(args); + return ret; +} + std::string &escape_path_spaces(std::string &s) { std::string result; diff --git a/crawl-ref/source/libutil.h b/crawl-ref/source/libutil.h index 66cb9bb693..51bd4520b0 100644 --- a/crawl-ref/source/libutil.h +++ b/crawl-ref/source/libutil.h @@ -65,6 +65,7 @@ int ends_with(const std::string &s, const char *suffixes[]); std::string strip_filename_unsafe_chars(const std::string &s); +std::string vmake_stringf(const char *format, va_list args); std::string make_stringf(const char *format, ...); std::string replace_all(std::string s, -- cgit v1.2.3-54-g00ecf