summaryrefslogtreecommitdiff
path: root/cpp
diff options
context:
space:
mode:
authorJose <jose@zeroc.com>2018-08-13 18:42:15 +0200
committerJose <jose@zeroc.com>2018-08-13 18:42:15 +0200
commit2ea71fccb3160f92c8bfdca5e49dbd14de65cd2f (patch)
tree46d80237be6b75378b32b7d248463e12b22e1e65 /cpp
parentWhitespace cleanup (diff)
downloadice-2ea71fccb3160f92c8bfdca5e49dbd14de65cd2f.tar.bz2
ice-2ea71fccb3160f92c8bfdca5e49dbd14de65cd2f.tar.xz
ice-2ea71fccb3160f92c8bfdca5e49dbd14de65cd2f.zip
Fixes for strerror_r usage
Diffstat (limited to 'cpp')
-rw-r--r--cpp/src/IceGrid/Activator.cpp2
-rw-r--r--cpp/src/IceUtil/StringUtil.cpp63
2 files changed, 35 insertions, 30 deletions
diff --git a/cpp/src/IceGrid/Activator.cpp b/cpp/src/IceGrid/Activator.cpp
index bd76a224546..70e46eaa86b 100644
--- a/cpp/src/IceGrid/Activator.cpp
+++ b/cpp/src/IceGrid/Activator.cpp
@@ -90,7 +90,7 @@ reportChildError(int err, int fd, const char* cannot, const char* name, const Tr
os << ": " << IceUtilInternal::errorToString(err) << endl;
}
const string msg = os.str();
- ssize_t sz = write(fd, msg.c_str(), msg.size() + 1);
+ ssize_t sz = write(fd, msg.c_str(), msg.size());
if(sz == -1)
{
Ice::Warning out(traceLevels->logger);
diff --git a/cpp/src/IceUtil/StringUtil.cpp b/cpp/src/IceUtil/StringUtil.cpp
index 3ecbe9ebd99..f8a2b143bee 100644
--- a/cpp/src/IceUtil/StringUtil.cpp
+++ b/cpp/src/IceUtil/StringUtil.cpp
@@ -1073,38 +1073,43 @@ IceUtilInternal::lastErrorToString()
string
IceUtilInternal::errorToString(int error)
{
- char buf[500];
-#if !defined(__GLIBC__) || defined(BSD) || ((_POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600) && !_GNU_SOURCE)
- //
- // Use the XSI-compliant version of strerror_r
- //
- if(strerror_r(error, &buf[0], 500) != 0)
+ vector<char> buffer(500);
+ while(true)
{
- ostringstream os;
- os << "Unknown error `" << error << "'";
- return os.str();
- }
- else
- {
- return string(buf);
- }
+#if !defined(__GLIBC__) || ((_POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600) && !_GNU_SOURCE)
+ //
+ // Use the XSI-compliant version of strerror_r
+ //
+ int err = strerror_r(error, &buffer[0], buffer.size());
+ if(err == 0)
+ {
+ return string(&buffer[0]);
+ }
#else
- //
- // Use the GNU-specific version of strerror_r
- //
- errno = 0;
- const char* msg = strerror_r(error, &buf[0], 500);
- if(errno != 0)
- {
- ostringstream os;
- os << "Unknown error `" << error << "'";
- return os.str();
- }
- else
- {
- return msg;
- }
+ //
+ // Use the GNU-specific version of strerror_r
+ //
+ int oerrno = errno;
+ errno = 0;
+ const char* msg = strerror_r(error, &buffer[0], buffer.size());
+ int err = errno;
+ errno = oerrno;
+ if(err == 0)
+ {
+ return msg;
+ }
#endif
+ if(err == ERANGE && buffer.size() < 1024 * 1024)
+ {
+ buffer.resize(buffer.size() * 2);
+ }
+ else
+ {
+ ostringstream os;
+ os << "Unknown error `" << error << "'";
+ return os.str();
+ }
+ }
}
string