commit 7b3e353331662b2af1d29a84fe5c1d60b7fdfe88 from: Stefan Sperling date: Wed Apr 16 10:04:41 2025 UTC make writes in fcgi_forward_response() time out to avoid gotwebd getting stuck commit - f8b1e9c78bbea3a865bd20b4d3061bc7af5d0d7d commit + 7b3e353331662b2af1d29a84fe5c1d60b7fdfe88 blob - dd4fa760f7b0417c9999ae7ae64b0f98d3e23059 blob + c510422805e87a2ddd752543c5af9ea57a75e059 --- gotwebd/fcgi.c +++ gotwebd/fcgi.c @@ -201,7 +201,7 @@ fcgi_forward_response(int fd, short event, void *arg) if (r == -1) { log_warn("read response"); } else { - err = got_poll_write_full(c->fd, outbuf, r); + err = got_poll_write_full_timeout(c->fd, outbuf, r, 1); if (err) { log_warnx("forward response: %s", err->msg); fcgi_cleanup_request(c); blob - 7f3896a299ca2c51b65a3d3e6c5fafe1452500d2 blob + 5c8b51f1715ca57bc53491048364e8af84bb472f --- lib/got_lib_poll.h +++ lib/got_lib_poll.h @@ -20,3 +20,5 @@ const struct got_error *got_poll_read_full_timeout(int const struct got_error *got_poll_read_full(int, size_t *, void *, size_t, size_t); const struct got_error *got_poll_write_full(int, const void *, off_t); +const struct got_error *got_poll_write_full_timeout(int, const void *, off_t, + int); blob - f98dea71e976cc360e1d5c6bc803c2c26f6ffff3 blob + b5377d90fae3d989f5d3aee45517f65385aaa33f --- lib/pollfd.c +++ lib/pollfd.c @@ -100,13 +100,19 @@ got_poll_read_full(int fd, size_t *len, void *buf, siz const struct got_error * got_poll_write_full(int fd, const void *buf, off_t len) { + return got_poll_write_full_timeout(fd, buf, len, INFTIM); +} + +const struct got_error * +got_poll_write_full_timeout(int fd, const void *buf, off_t len, int timeout) +{ const struct got_error *err = NULL; off_t wlen = 0; ssize_t w = 0; while (wlen != len) { if (wlen > 0) { - err = got_poll_fd(fd, POLLOUT, INFTIM); + err = got_poll_fd(fd, POLLOUT, timeout); if (err) return err; }