mirror of
https://github.com/gabime/spdlog.git
synced 2025-01-24 06:32:06 +08:00
Properly handling SPDLOG_PREVENT_CHILD_FD
Using the SPDLOG_PREVENT_CHILD_FD option there where still a race when a other thread was using fork and exec in between the call to fopen and fcntl. Using open and O_CLOEXEC when possible prevents this race. I have no idea if this problem exists on Windows.
This commit is contained in:
parent
f3d99f41d4
commit
a9c3630d1b
@ -153,10 +153,26 @@ SPDLOG_INLINE bool fopen_s(FILE **fp, const filename_t &filename, const filename
|
|||||||
*fp = ::_fsopen((filename.c_str()), mode.c_str(), _SH_DENYNO);
|
*fp = ::_fsopen((filename.c_str()), mode.c_str(), _SH_DENYNO);
|
||||||
#endif
|
#endif
|
||||||
#else // unix
|
#else // unix
|
||||||
|
#if defined(SPDLOG_PREVENT_CHILD_FD) && (defined(_POSIX_VERSION) && _POSIX_VERSION >= 200809L)
|
||||||
|
// prevent child processes from inheriting log file descriptors direcly on open
|
||||||
|
// so there is no race with a possible fork and exec
|
||||||
|
const int mode_flag = mode == SPDLOG_FILENAME_T("ab") ? O_APPEND : O_TRUNC;
|
||||||
|
const int fd = ::open((filename.c_str()), O_CREAT | O_WRONLY | O_CLOEXEC | mode_flag, mode_t(0644));
|
||||||
|
if(fd == -1)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
*fp = ::fdopen(fd, mode.c_str());
|
||||||
|
if (*fp == nullptr)
|
||||||
|
{
|
||||||
|
::close(fd);
|
||||||
|
}
|
||||||
|
#else
|
||||||
*fp = ::fopen((filename.c_str()), mode.c_str());
|
*fp = ::fopen((filename.c_str()), mode.c_str());
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef SPDLOG_PREVENT_CHILD_FD
|
#if defined(SPDLOG_PREVENT_CHILD_FD) && !(defined(_POSIX_VERSION) && _POSIX_VERSION >= 200809L)
|
||||||
// prevent child processes from inheriting log file descriptors
|
// prevent child processes from inheriting log file descriptors
|
||||||
if (*fp != nullptr)
|
if (*fp != nullptr)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user