mirror of
https://github.com/Llewellynvdm/conky.git
synced 2024-11-19 11:35:12 +00:00
Use portable version of strerror_r
There are 2 variants of strerror_r, GNU extension and a POSIX variant. Use the more portable POSIX variant. Also fix a potensial stack-use-after-return bug, instead of relying on undefined behavoir in GNU libc implementation. The strerror_r manpage says: > This may be either a pointer to a string that the function stores in > buf, or a pointer to some (immutable) static string (in which case buf > is unused). So it does not guarantee that it returns a pointer to some (immutable) static string. It might return a pointer to "buf", in which case we get a stack-use-after-return bug. We fix this by declaring a thread local static buffer which we always return.
This commit is contained in:
parent
98b063866f
commit
476f84cf59
@ -26,8 +26,14 @@
|
|||||||
#include "c++wrap.hh"
|
#include "c++wrap.hh"
|
||||||
|
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
|
/* force use of POSIX strerror_r instead of non-portable GNU specific */
|
||||||
|
#ifdef _GNU_SOURCE
|
||||||
|
#undef _GNU_SOURCE
|
||||||
|
#endif
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
|
||||||
#if !defined(HAVE_PIPE2) || !defined(HAVE_O_CLOEXEC)
|
#if !defined(HAVE_PIPE2) || !defined(HAVE_O_CLOEXEC)
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
|
|
||||||
@ -62,8 +68,10 @@ namespace {
|
|||||||
|
|
||||||
std::string strerror_r(int errnum)
|
std::string strerror_r(int errnum)
|
||||||
{
|
{
|
||||||
char buf[100];
|
static thread_local char buf[100];
|
||||||
return strerror_r(errnum, buf, sizeof buf);
|
if (strerror_r(errnum, buf, sizeof buf) != 0)
|
||||||
|
snprintf(buf, sizeof buf, "Unknown error %i", errnum);
|
||||||
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::pair<int, int> pipe2(int flags)
|
std::pair<int, int> pipe2(int flags)
|
||||||
|
Loading…
Reference in New Issue
Block a user