summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Powell <petpow@saberuk.com>2018-01-01 23:56:35 +0000
committerPeter Powell <petpow@saberuk.com>2018-01-03 12:38:40 +0000
commit372bb6ec31e26908966ff553b782c9a24a07db6a (patch)
tree799f5496c4658a753af2c6b4d8e6ada2f3152ee5
parent5c6352dd9a642bdb1f5fa2727a41dea9197b4536 (diff)
Make InspIRCd::Format return std::string instead of const char*.
Using the latter is problematic as if you don't copy the return value before calling Format again your formatted message will be overwritten by something else. This bug was observed in m_callerid where InspIRCd::Format was being used for formatting two arguments the latter of which was being overwritten with the former. We could have preserved the return type and just copied the string but then callers would have had to deallocate the string once they have finished with it which is an undesirabable burden to put on callers.
-rw-r--r--include/inspircd.h4
-rw-r--r--include/inspstring.h2
-rw-r--r--include/modules/sql.h11
-rw-r--r--src/helperfuncs.cpp8
4 files changed, 12 insertions, 13 deletions
diff --git a/include/inspircd.h b/include/inspircd.h
index 40c368106..bdbcdb20d 100644
--- a/include/inspircd.h
+++ b/include/inspircd.h
@@ -407,8 +407,8 @@ class CoreExport InspIRCd
* @param ... A variable number of format arguments.
* @return The formatted string
*/
- static const char* Format(const char* formatString, ...) CUSTOM_PRINTF(1, 2);
- static const char* Format(va_list &vaList, const char* formatString) CUSTOM_PRINTF(2, 0);
+ static std::string Format(const char* formatString, ...) CUSTOM_PRINTF(1, 2);
+ static std::string Format(va_list& vaList, const char* formatString) CUSTOM_PRINTF(2, 0);
/** Determines whether a nickname is valid. */
TR1NS::function<bool(const std::string&)> IsNick;
diff --git a/include/inspstring.h b/include/inspstring.h
index ccc77da66..2501b76ce 100644
--- a/include/inspstring.h
+++ b/include/inspstring.h
@@ -29,7 +29,7 @@
do { \
va_list _vaList; \
va_start(_vaList, last); \
- ret = InspIRCd::Format(_vaList, format); \
+ ret.assign(InspIRCd::Format(_vaList, format)); \
va_end(_vaList); \
} while (false);
diff --git a/include/modules/sql.h b/include/modules/sql.h
index dd33fc676..01adbb42e 100644
--- a/include/modules/sql.h
+++ b/include/modules/sql.h
@@ -132,7 +132,7 @@ class SQL::Error
{
private:
/** The custom error message if one has been specified. */
- const char* message;
+ const std::string message;
public:
/** The code which represents this error. */
@@ -142,8 +142,7 @@ class SQL::Error
* @param c A code which represents this error.
*/
Error(ErrorCode c)
- : message(NULL)
- , code(c)
+ : code(c)
{
}
@@ -151,7 +150,7 @@ class SQL::Error
* @param c A code which represents this error.
* @param m A custom error message.
*/
- Error(ErrorCode c, const char* m)
+ Error(ErrorCode c, const std::string m)
: message(m)
, code(c)
{
@@ -160,8 +159,8 @@ class SQL::Error
/** Retrieves the error message. */
const char* ToString() const
{
- if (message)
- return message;
+ if (!message.empty())
+ return message.c_str();
switch (code)
{
diff --git a/src/helperfuncs.cpp b/src/helperfuncs.cpp
index c29e7d2cc..e331ba9dc 100644
--- a/src/helperfuncs.cpp
+++ b/src/helperfuncs.cpp
@@ -331,7 +331,7 @@ unsigned long InspIRCd::Duration(const std::string &str)
return total + subtotal;
}
-const char* InspIRCd::Format(va_list &vaList, const char* formatString)
+std::string InspIRCd::Format(va_list& vaList, const char* formatString)
{
static std::vector<char> formatBuffer(1024);
@@ -351,12 +351,12 @@ const char* InspIRCd::Format(va_list &vaList, const char* formatString)
formatBuffer.resize(formatBuffer.size() * 2);
}
- return &formatBuffer[0];
+ return std::string(&formatBuffer[0]);
}
-const char* InspIRCd::Format(const char* formatString, ...)
+std::string InspIRCd::Format(const char* formatString, ...)
{
- const char* ret;
+ std::string ret;
VAFORMAT(ret, formatString, formatString);
return ret;
}