1
0
mirror of https://git.tartarus.org/simon/putty.git synced 2025-04-11 08:08:06 -05:00

uxproxy: close input pipes that have seen EOF on read.

Otherwise we loop round repeatedly with the event loop continuing to
report the same EOF condition on them over and over again, consuming
CPU pointlessly and probably causing other knock-on trouble too.
This commit is contained in:
Simon Tatham 2018-09-28 19:21:37 +01:00
parent 3085e74807
commit 7cd425abab

View File

@ -122,13 +122,17 @@ static void sk_localproxy_close (Socket s)
close(ps->to_cmd);
}
del234(localproxy_by_fromfd, ps);
uxsel_del(ps->from_cmd);
close(ps->from_cmd);
if (ps->from_cmd >= 0) {
del234(localproxy_by_fromfd, ps);
uxsel_del(ps->from_cmd);
close(ps->from_cmd);
}
del234(localproxy_by_errfd, ps);
uxsel_del(ps->cmd_err);
close(ps->cmd_err);
if (ps->cmd_err >= 0) {
del234(localproxy_by_errfd, ps);
uxsel_del(ps->cmd_err);
close(ps->cmd_err);
}
bufchain_clear(&ps->pending_input_data);
bufchain_clear(&ps->pending_output_data);
@ -238,6 +242,9 @@ static void sk_localproxy_set_frozen (Socket s, int is_frozen)
{
LocalProxySocket *ps = FROMFIELD(s, LocalProxySocket, sockvt);
if (ps->from_cmd < 0)
return;
if (is_frozen)
uxsel_del(ps->from_cmd);
else
@ -257,24 +264,36 @@ static void localproxy_select_result(int fd, int event)
int ret;
if (!(s = find234(localproxy_by_fromfd, &fd, localproxy_fromfd_find)) &&
!(s = find234(localproxy_by_fromfd, &fd, localproxy_errfd_find)) &&
!(s = find234(localproxy_by_errfd, &fd, localproxy_errfd_find)) &&
!(s = find234(localproxy_by_tofd, &fd, localproxy_tofd_find)) )
return; /* boggle */
if (event == 1) {
if (fd == s->cmd_err) {
ret = read(fd, buf, sizeof(buf));
if (ret > 0)
if (ret > 0) {
log_proxy_stderr(s->plug, &s->pending_error_data, buf, ret);
} else {
del234(localproxy_by_errfd, s);
uxsel_del(s->cmd_err);
close(s->cmd_err);
s->cmd_err = -1;
}
} else {
assert(fd == s->from_cmd);
ret = read(fd, buf, sizeof(buf));
if (ret < 0) {
plug_closing(s->plug, strerror(errno), errno, 0);
} else if (ret == 0) {
plug_closing(s->plug, NULL, 0, 0);
} else {
if (ret > 0) {
plug_receive(s->plug, 0, buf, ret);
} else {
if (ret < 0) {
plug_closing(s->plug, strerror(errno), errno, 0);
} else {
plug_closing(s->plug, NULL, 0, 0);
}
del234(localproxy_by_fromfd, s);
uxsel_del(s->from_cmd);
close(s->from_cmd);
s->from_cmd = -1;
}
}
} else if (event == 2) {