From fef7866a40c1afa8fc300ace07418a9a9d182f86 Mon Sep 17 00:00:00 2001 From: thunder2 Date: Sun, 29 Jul 2012 13:28:45 +0000 Subject: [PATCH] Fixed crash when using rs_sprintf/bd_sprintf or rs_sprintf_append/bd_sprintf_append with empty result (maybe only on Windows). git-svn-id: http://svn.code.sf.net/p/retroshare/code/trunk@5349 b45a01b8-16f6-495d-af2f-9b41ad6348cc --- src/util/bdstring.cc | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/src/util/bdstring.cc b/src/util/bdstring.cc index 3870b70..56c31ab 100644 --- a/src/util/bdstring.cc +++ b/src/util/bdstring.cc @@ -41,7 +41,7 @@ static int vasprintf(char **sptr, const char *fmt, va_list argv) return wanted; } -//int asprintf(char **sptr, const char *fmt, ...) +//static int asprintf(char **sptr, const char *fmt, ...) //{ // int retval; // va_list argv; @@ -54,15 +54,23 @@ static int vasprintf(char **sptr, const char *fmt, va_list argv) int bd_sprintf(std::string &str, const char *fmt, ...) { - char *buffer; + char *buffer = NULL; va_list ap; va_start(ap, fmt); int retval = vasprintf(&buffer, fmt, ap); va_end(ap); - str = buffer; - free(buffer); + if (retval >= 0) { + if (buffer) { + str = buffer; + free(buffer); + } else { + str.clear(); + } + } else { + str.clear(); + } return retval; } @@ -70,14 +78,18 @@ int bd_sprintf(std::string &str, const char *fmt, ...) int bd_sprintf_append(std::string &str, const char *fmt, ...) { va_list ap; - char *ret; + char *buffer = NULL; va_start(ap, fmt); - int retval = vasprintf(&ret, fmt, ap); + int retval = vasprintf(&buffer, fmt, ap); va_end(ap); - str.append(ret); - free(ret); + if (retval >= 0) { + if (buffer) { + str.append(buffer); + free(buffer); + } + } return retval; }