commit 520dc23bbf6da080a16df5b633445d3d625def64 from: Omar Polo via: Thomas Adam date: Thu Apr 25 14:57:44 2024 UTC got-notify-http: fix I/O with TLS tls_write() may return TLS_WANT_READ. In that case, we're stuck trying to read while we have the request still in the buffer. So, we have to retry bufio_write() regardless of the POLLIN/POLLOUT state. We'd need this only in the TLS case, but in practice it doesn't harm for the plaintext case too. In fact, we're either waiting to flush the request or we're only reading the server reply. ok stsp commit - 63bfde6efd083ce03a42abf45fb70cc685906368 commit + 520dc23bbf6da080a16df5b633445d3d625def64 blob - fc189ec58de815feecb3ddd1b48afa777e3270fe blob + 6e6ae09721ee923cf1a1ccdf2f923c827ddf6515 --- gotd/libexec/got-notify-http/got-notify-http.c +++ gotd/libexec/got-notify-http/got-notify-http.c @@ -972,58 +972,56 @@ main(int argc, char **argv) if (ret == 0 || timeout.tv_sec <= 0) fatalx("timeout"); - if (bio.wbuf.len > 0 && (pfd.revents & POLLOUT)) { + if (bio.wbuf.len > 0) { if (bufio_write(&bio) == -1 && errno != EAGAIN) fatalx("bufio_write: %s", bufio_io_err(&bio)); } - if (pfd.revents & POLLIN) { - r = bufio_read(&bio); - if (r == -1 && errno != EAGAIN) - fatalx("bufio_read: %s", bufio_io_err(&bio)); - if (r == 0) - fatalx("unexpected EOF"); - for (;;) { - line = buf_getdelim(&bio.rbuf, "\r\n", &len); - if (line == NULL) - break; - if (response_code && *line == '\0') { - /* - * end of headers, don't bother - * reading the body, if there is. - */ - done = 1; - break; - } - if (response_code) { - buf_drain(&bio.rbuf, len); - continue; - } - spc = strchr(line, ' '); - if (spc == NULL) - fatalx("bad HTTP response from server"); - *spc++ = '\0'; - if (strcasecmp(line, "HTTP/1.1") != 0) - log_warnx("unexpected protocol: %s", - line); - line = spc; - - spc = strchr(line, ' '); - if (spc == NULL) - fatalx("bad HTTP response from server"); - *spc++ = '\0'; - - response_code = strtonum(line, 100, 599, - &errstr); - if (errstr != NULL) - log_warnx("response code is %s: %s", - errstr, line); + r = bufio_read(&bio); + if (r == -1 && errno != EAGAIN) + fatalx("bufio_read: %s", bufio_io_err(&bio)); + if (r == 0) + fatalx("unexpected EOF"); + for (;;) { + line = buf_getdelim(&bio.rbuf, "\r\n", &len); + if (line == NULL) + break; + if (response_code && *line == '\0') { + /* + * end of headers, don't bother + * reading the body, if there is. + */ + done = 1; + break; + } + if (response_code) { buf_drain(&bio.rbuf, len); + continue; } - if (done) - break; + spc = strchr(line, ' '); + if (spc == NULL) + fatalx("bad HTTP response from server"); + *spc++ = '\0'; + if (strcasecmp(line, "HTTP/1.1") != 0) + log_warnx("unexpected protocol: %s", line); + line = spc; + + spc = strchr(line, ' '); + if (spc == NULL) + fatalx("bad HTTP response from server"); + *spc++ = '\0'; + + response_code = strtonum(line, 100, 599, + &errstr); + if (errstr != NULL) + log_warnx("response code is %s: %s", + errstr, line); + + buf_drain(&bio.rbuf, len); } + if (done) + break; if (!feof(tmpfp) && bio.wbuf.len < sizeof(buf)) { len = fread(buf, 1, sizeof(buf), tmpfp);