summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIngo Klöcker <kloecker@kde.org>2008-10-05 12:30:43 +0000
committerMichele Calgaro <michele.calgaro@yahoo.it>2019-04-23 22:44:53 +0900
commitc80147f2213e3e0cac48bc80aaef7f426985720b (patch)
treeaecd67387668f24f55746ee8caa434546120425a
parent147bb5982f8f760c470566370b988dfc06ce7d31 (diff)
downloadtdepim-c80147f2213e3e0cac48bc80aaef7f426985720b.tar.gz
tdepim-c80147f2213e3e0cac48bc80aaef7f426985720b.zip
A signal handler that calls for example waitpid has to save errno before and
restore it afterwards. Cherry-picked from: 70b4927d847f52c865e0c6c91323eeb3295a99eb Signed-off-by: Luke Dashjr <luke-jr+git@utopios.org>
-rw-r--r--tdeioslave/imap4/imap4.cc9
1 files changed, 8 insertions, 1 deletions
diff --git a/tdeioslave/imap4/imap4.cc b/tdeioslave/imap4/imap4.cc
index 8ce20769..87a6b9c4 100644
--- a/tdeioslave/imap4/imap4.cc
+++ b/tdeioslave/imap4/imap4.cc
@@ -71,6 +71,7 @@ imap://server/folder/
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>
+#include <errno.h>
#ifdef HAVE_LIBSASL2
extern "C" {
@@ -147,6 +148,10 @@ kdemain (int argc, char **argv)
void
sigchld_handler (int signo)
{
+ // A signal handler that calls for example waitpid has to save errno
+ // before and restore it afterwards.
+ // (cf. https://www.securecoding.cert.org/confluence/display/cplusplus/ERR32-CPP.+Do+not+rely+on+indeterminate+values+of+errno)
+ const int save_errno = errno;
int pid, status;
while (signo == SIGCHLD)
@@ -158,9 +163,11 @@ sigchld_handler (int signo)
// the signal occurred ( BSD handles it different, but it should do
// no harm ).
signal (SIGCHLD, sigchld_handler);
- return;
+ break;
}
}
+
+ errno = save_errno;
}
IMAP4Protocol::IMAP4Protocol (const TQCString & pool, const TQCString & app, bool isSSL):TCPSlaveBase ((isSSL ? 993 : 143),