diff options
author | Jose <jose@zeroc.com> | 2018-08-13 18:42:15 +0200 |
---|---|---|
committer | Jose <jose@zeroc.com> | 2018-08-13 18:42:15 +0200 |
commit | 2ea71fccb3160f92c8bfdca5e49dbd14de65cd2f (patch) | |
tree | 46d80237be6b75378b32b7d248463e12b22e1e65 | |
parent | Whitespace cleanup (diff) | |
download | ice-2ea71fccb3160f92c8bfdca5e49dbd14de65cd2f.tar.bz2 ice-2ea71fccb3160f92c8bfdca5e49dbd14de65cd2f.tar.xz ice-2ea71fccb3160f92c8bfdca5e49dbd14de65cd2f.zip |
Fixes for strerror_r usage
-rw-r--r-- | cpp/src/IceGrid/Activator.cpp | 2 | ||||
-rw-r--r-- | cpp/src/IceUtil/StringUtil.cpp | 63 |
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 |