git://git.exim.org
/
exim.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
In tls-proxy process take case to close unused pipe ends, select also for exception...
[exim.git]
/
src
/
src
/
transports
/
smtp.c
diff --git
a/src/src/transports/smtp.c
b/src/src/transports/smtp.c
index d6a52034bb4fe71c9bbf810974a42c476944c729..fc2c0ea4dcbb2471d2292c2258659b358056cae1 100644
(file)
--- a/
src/src/transports/smtp.c
+++ b/
src/src/transports/smtp.c
@@
-2568,14
+2568,14
@@
Arguments:
void
smtp_proxy_tls(uschar * buf, size_t bsize, int proxy_fd, int timeout)
{
void
smtp_proxy_tls(uschar * buf, size_t bsize, int proxy_fd, int timeout)
{
-fd_set fds;
+fd_set
rfds, e
fds;
int max_fd = MAX(proxy_fd, tls_out.active) + 1;
int rc, i, fd_bits, nbytes;
set_process_info("proxying TLS connection for continued transport");
int max_fd = MAX(proxy_fd, tls_out.active) + 1;
int rc, i, fd_bits, nbytes;
set_process_info("proxying TLS connection for continued transport");
-FD_ZERO(&fds);
-FD_SET(tls_out.active, &fds);
-FD_SET(proxy_fd, &fds);
+FD_ZERO(&
r
fds);
+FD_SET(tls_out.active, &
r
fds);
+FD_SET(proxy_fd, &
r
fds);
for (fd_bits = 3; fd_bits; )
{
for (fd_bits = 3; fd_bits; )
{
@@
-2583,11
+2583,13
@@
for (fd_bits = 3; fd_bits; )
time_t time_start = time(NULL);
/* wait for data */
time_t time_start = time(NULL);
/* wait for data */
+ efds = rfds;
do
{
struct timeval tv = { time_left, 0 };
do
{
struct timeval tv = { time_left, 0 };
- rc = select(max_fd, (SELECT_ARG2_TYPE *)&fds, NULL, NULL, &tv);
+ rc = select(max_fd,
+ (SELECT_ARG2_TYPE *)&rfds, NULL, (SELECT_ARG2_TYPE *)&efds, &tv);
if (rc < 0 && errno == EINTR)
if ((time_left -= time(NULL) - time_start) > 0) continue;
if (rc < 0 && errno == EINTR)
if ((time_left -= time(NULL) - time_start) > 0) continue;
@@
-2597,16
+2599,24
@@
for (fd_bits = 3; fd_bits; )
DEBUG(D_transport) if (rc == 0) debug_printf("%s: timed out\n", __FUNCTION__);
return;
}
DEBUG(D_transport) if (rc == 0) debug_printf("%s: timed out\n", __FUNCTION__);
return;
}
+
+ if (FD_ISSET(tls_out.active, &efds) || FD_ISSET(proxy_fd, &efds))
+ {
+ DEBUG(D_transport) debug_printf("select: exceptional cond on %s fd\n",
+ FD_ISSET(proxy_fd, &efds) ? "proxy" : "tls");
+ return;
+ }
}
}
- while (rc < 0 || !(FD_ISSET(tls_out.active, &
fds) || FD_ISSET(proxy_fd, &
fds)));
+ while (rc < 0 || !(FD_ISSET(tls_out.active, &
rfds) || FD_ISSET(proxy_fd, &r
fds)));
/* handle inbound data */
/* handle inbound data */
- if (FD_ISSET(tls_out.active, &fds))
+ if (FD_ISSET(tls_out.active, &
r
fds))
if ((rc = tls_read(FALSE, buf, bsize)) <= 0)
{
fd_bits &= ~1;
if ((rc = tls_read(FALSE, buf, bsize)) <= 0)
{
fd_bits &= ~1;
- FD_CLR(tls_out.active, &fds);
+ FD_CLR(tls_out.active, &
r
fds);
shutdown(proxy_fd, SHUT_WR);
shutdown(proxy_fd, SHUT_WR);
+ timeout = 5;
}
else
{
}
else
{
@@
-2614,15
+2624,14
@@
for (fd_bits = 3; fd_bits; )
if ((i = write(proxy_fd, buf + nbytes, rc - nbytes)) < 0) return;
}
else if (fd_bits & 1)
if ((i = write(proxy_fd, buf + nbytes, rc - nbytes)) < 0) return;
}
else if (fd_bits & 1)
- FD_SET(tls_out.active, &fds);
+ FD_SET(tls_out.active, &
r
fds);
/* handle outbound data */
/* handle outbound data */
- if (FD_ISSET(proxy_fd, &fds))
+ if (FD_ISSET(proxy_fd, &
r
fds))
if ((rc = read(proxy_fd, buf, bsize)) <= 0)
{
if ((rc = read(proxy_fd, buf, bsize)) <= 0)
{
- fd_bits &= ~2;
- FD_CLR(proxy_fd, &fds);
- shutdown(tls_out.active, SHUT_WR);
+ fd_bits = 0;
+ tls_close(FALSE, TRUE);
}
else
{
}
else
{
@@
-2631,7
+2640,7
@@
for (fd_bits = 3; fd_bits; )
return;
}
else if (fd_bits & 2)
return;
}
else if (fd_bits & 2)
- FD_SET(proxy_fd, &fds);
+ FD_SET(proxy_fd, &
r
fds);
}
}
#endif
}
}
#endif
@@
-3458,6
+3467,7
@@
propagate it from the initial
if (pid > 0) /* parent */
{
DEBUG(D_transport) debug_printf("proxy-proc inter-pid %d\n", pid);
if (pid > 0) /* parent */
{
DEBUG(D_transport) debug_printf("proxy-proc inter-pid %d\n", pid);
+ close(pfd[0]);
waitpid(pid, NULL, 0);
tls_close(FALSE, FALSE);
(void)close(sx.inblock.sock);
waitpid(pid, NULL, 0);
tls_close(FALSE, FALSE);
(void)close(sx.inblock.sock);
@@
-3467,6
+3477,7
@@
propagate it from the initial
}
else if (pid == 0) /* child; fork again to disconnect totally */
{
}
else if (pid == 0) /* child; fork again to disconnect totally */
{
+ close(pfd[1]);
if ((pid = fork()))
{
DEBUG(D_transport) debug_printf("proxy-prox final-pid %d\n", pid);
if ((pid = fork()))
{
DEBUG(D_transport) debug_printf("proxy-prox final-pid %d\n", pid);