to (null) or crash when printing the error message. Patch by Matthias
Andree.
* NextStep and OpenStep port patch from Eric Sunshine.
+* Block signals during SockConnect() so we don't get a socket descriptor
+ leak if we're hit by an alarm signal during connect(2).
fetchmail-5.9.4 (Wed Oct 3 07:47:45 EDT 2001), 21104 lines:
#else
#include <varargs.h>
#endif
+#include <signal.h>
#include "socket.h"
#include "fetchmail.h"
#include "i18n.h"
int UnixOpen(const char *path)
{
- int sock = -1;
+#ifdef HAVE_SIGPROCMASK
+ sigset_t allsigs;
+#endif /* HAVE_SIGPROCMASK */
+
+ int stat, sock = -1;
struct sockaddr_un ad;
memset(&ad, 0, sizeof(ad));
ad.sun_family = AF_UNIX;
h_errno = 0;
return -1;
}
+
+#ifdef HAVE_SIGPROCMASK
+ /* avoid socket leak on alarm signal during connect(2) */
+ sigfillset(&allsigs);
+ sigprocmask(SIG_BLOCK, &allsigs, NULL);
+#endif /* HAVE_SIGPROCMASK */
+
if (connect(sock, (struct sockaddr *) &ad, sizeof(ad)) < 0)
{
int olderr = errno;
fm_close(sock); /* don't use SockClose, no traffic yet */
h_errno = 0;
errno = olderr;
- return -1;
+ sock = -1;
}
+
+#ifdef HAVE_SIGPROCMASK
+ sigprocmask(SIG_UNBLOCK, &allsigs, NULL);
+#endif /* HAVE_SIGPROCMASK */
+
return sock;
}
int SockOpen(const char *host, const char *service, const char *options,
const char *plugin)
{
+#ifdef HAVE_SIGPROCMASK
+ sigset_t allsigs;
+#endif /* HAVE_SIGPROCMASK */
+
struct addrinfo *ai, *ai0, req;
int i;
#if NET_SECURITY
if (i >= 0)
break;
#else
+
+#ifdef HAVE_SIGPROCMASK
+ /* avoid socket leak on alarm signal during connect(2) */
+ sigfillset(&allsigs);
+ sigprocmask(SIG_BLOCK, &allsigs, NULL);
+#endif /* HAVE_SIGPROCMASK */
+
i = -1;
for (ai = ai0; ai; ai = ai->ai_next) {
i = socket(ai->ai_family, ai->ai_socktype, 0);
}
break;
}
+
+#ifdef HAVE_SIGPROCMASK
+ sigprocmask(SIG_UNBLOCK, &allsigs, NULL);
+#endif /* HAVE_SIGPROCMASK */
+
#endif
#endif /* NET_SECURITY */