Claudio Jeker([email protected]) on 2021.11.04 18:43:10 +0100:
> On Thu, Nov 04, 2021 at 11:27:46AM -0600, Theo de Raadt wrote:
> > Claudio Jeker <[email protected]> wrote:
> >
> > > This diff replaces the errx() call in the poll fd check with warnings plus
> > > an exit of the main event loop. It also prints an error in case not all
> > > files have been processed.
> > >
> > > An example after kill -9 of the rsync process is:
> > > rpki-client: https://rrdp.lacnic.net/rrdp/notification.xml: loaded from
> > > network
> > > rpki-client: poll[1]: hangup
> > > rpki-client: rsync terminated signal 9
> >
> > I am not thrilled with giving people error messages about a system call
> > (poll).
> >
> > In this specific case, the actual issue is on the next like (it is a rsync
> > failure, which you caused I suspect)
> >
> > Is that 2nd message not enough?
> >
> > Could you set hangup = 1, but skip the warnx, so that the code just reacts
> > correctly?
> >
> > Are there other circumstances (different types of fd), which do not make
> > it to a wait (rrdp?). Can those report a nice termination message?
> >
>
> I agree that the hangup message is not very helpful. It is actually
> the one message I did not alter. I'm happy to remove that message.
> For the errors from msgbuf_write() I think those are valid error messages
> and I feel the POLLERR|POLLNVAL fall into the same boat.
>
> Updated diff below
i'm fine with that
ok benno@
> --
> :wq Claudio
>
> Index: http.c
> ===================================================================
> RCS file: /cvs/src/usr.sbin/rpki-client/http.c,v
> retrieving revision 1.48
> diff -u -p -r1.48 http.c
> --- http.c 4 Nov 2021 14:24:41 -0000 1.48
> +++ http.c 4 Nov 2021 14:25:03 -0000
> @@ -159,7 +159,7 @@ static uint8_t *tls_ca_mem;
> static size_t tls_ca_size;
>
> /* HTTP request API */
> -static void http_req_new(size_t, char *, char *, int);
> +static void http_req_new(size_t, char *, char *, int, int);
> static void http_req_free(struct http_request *);
> static void http_req_done(size_t, enum http_result, const char *);
> static void http_req_fail(size_t);
> @@ -507,7 +507,7 @@ http_resolv(struct addrinfo **res, const
> * Create and queue a new request.
> */
> static void
> -http_req_new(size_t id, char *uri, char *modified_since, int outfd)
> +http_req_new(size_t id, char *uri, char *modified_since, int count, int
> outfd)
> {
> struct http_request *req;
> char *host, *port, *path;
> @@ -530,6 +530,7 @@ http_req_new(size_t id, char *uri, char
> req->path = path;
> req->uri = uri;
> req->modified_since = modified_since;
> + req->redirect_loop = count;
>
> TAILQ_INSERT_TAIL(&queue, req, entry);
> }
> @@ -1135,7 +1136,8 @@ http_redirect(struct http_connection *co
> err(1, NULL);
>
> logx("redirect to %s", http_info(uri));
> - http_req_new(conn->req->id, uri, mod_since, outfd);
> + http_req_new(conn->req->id, uri, mod_since, conn->req->redirect_loop,
> + outfd);
>
> /* clear request before moving connection to idle */
> http_req_free(conn->req);
> @@ -1867,7 +1869,7 @@ proc_http(char *bind_addr, int fd)
> io_read_str(b, &mod);
>
> /* queue up new requests */
> - http_req_new(id, uri, mod, b->fd);
> + http_req_new(id, uri, mod, 0, b->fd);
> ibuf_free(b);
> }
> }
> Index: main.c
> ===================================================================
> RCS file: /cvs/src/usr.sbin/rpki-client/main.c,v
> retrieving revision 1.162
> diff -u -p -r1.162 main.c
> --- main.c 4 Nov 2021 14:24:41 -0000 1.162
> +++ main.c 4 Nov 2021 17:42:42 -0000
> @@ -1020,19 +1020,23 @@ main(int argc, char *argv[])
> }
>
> for (i = 0; i < NPFD; i++) {
> - if (pfd[i].revents & (POLLERR|POLLNVAL))
> - errx(1, "poll[%zu]: bad fd", i);
> - if (pfd[i].revents & POLLHUP) {
> - warnx("poll[%zu]: hangup", i);
> + if (pfd[i].revents & (POLLERR|POLLNVAL)) {
> + warnx("poll[%zu]: bad fd", i);
> hangup = 1;
> }
> + if (pfd[i].revents & POLLHUP)
> + hangup = 1;
> if (pfd[i].revents & POLLOUT) {
> switch (msgbuf_write(queues[i])) {
> case 0:
> - errx(1, "write[%zu]: "
> + warnx("write[%zu]: "
> "connection closed", i);
> + hangup = 1;
> + break;
> case -1:
> - err(1, "write[%zu]", i);
> + warn("write[%zu]", i);
> + hangup = 1;
> + break;
> }
> }
> }
> @@ -1147,7 +1151,7 @@ main(int argc, char *argv[])
>
> /* processing did not finish because of error */
> if (entity_queue != 0)
> - return 1;
> + errx(1, "not all files processed, giving up");
>
> logx("all files parsed: generating output");
>
> Index: rrdp_delta.c
> ===================================================================
> RCS file: /cvs/src/usr.sbin/rpki-client/rrdp_delta.c,v
> retrieving revision 1.5
> diff -u -p -r1.5 rrdp_delta.c
> --- rrdp_delta.c 3 Nov 2021 13:30:56 -0000 1.5
> +++ rrdp_delta.c 4 Nov 2021 09:20:13 -0000
> @@ -225,6 +225,16 @@ delta_content_handler(void *data, const
> PARSE_FAIL(p, "parse failed - content too big");
> }
>
> +static void
> +delta_doctype_handler(void *data, const char *doctypeName,
> + const char *sysid, const char *pubid, int subset)
> +{
> + struct delta_xml *dxml = data;
> + XML_Parser p = dxml->parser;
> +
> + PARSE_FAIL(p, "parse failed - DOCTYPE not allowed");
> +}
> +
> struct delta_xml *
> new_delta_xml(XML_Parser p, struct rrdp_session *rs, struct rrdp *r)
> {
> @@ -243,6 +253,7 @@ new_delta_xml(XML_Parser p, struct rrdp_
> delta_xml_elem_end);
> XML_SetCharacterDataHandler(dxml->parser, delta_content_handler);
> XML_SetUserData(dxml->parser, dxml);
> + XML_SetDoctypeDeclHandler(dxml->parser, delta_doctype_handler, NULL);
>
> return dxml;
> }
> Index: rrdp_notification.c
> ===================================================================
> RCS file: /cvs/src/usr.sbin/rpki-client/rrdp_notification.c,v
> retrieving revision 1.9
> diff -u -p -r1.9 rrdp_notification.c
> --- rrdp_notification.c 29 Oct 2021 09:27:36 -0000 1.9
> +++ rrdp_notification.c 4 Nov 2021 09:20:13 -0000
> @@ -308,6 +308,16 @@ notification_xml_elem_end(void *data, co
> PARSE_FAIL(p, "parse failed - unexpected elem exit found");
> }
>
> +static void
> +notification_doctype_handler(void *data, const char *doctypeName,
> + const char *sysid, const char *pubid, int subset)
> +{
> + struct notification_xml *nxml = data;
> + XML_Parser p = nxml->parser;
> +
> + PARSE_FAIL(p, "parse failed - DOCTYPE not allowed");
> +}
> +
> struct notification_xml *
> new_notification_xml(XML_Parser p, struct rrdp_session *repository,
> struct rrdp_session *current, const char *notifyuri)
> @@ -325,6 +335,8 @@ new_notification_xml(XML_Parser p, struc
> XML_SetElementHandler(nxml->parser, notification_xml_elem_start,
> notification_xml_elem_end);
> XML_SetUserData(nxml->parser, nxml);
> + XML_SetDoctypeDeclHandler(nxml->parser, notification_doctype_handler,
> + NULL);
>
> return nxml;
> }
> Index: rrdp_snapshot.c
> ===================================================================
> RCS file: /cvs/src/usr.sbin/rpki-client/rrdp_snapshot.c,v
> retrieving revision 1.4
> diff -u -p -r1.4 rrdp_snapshot.c
> --- rrdp_snapshot.c 3 Nov 2021 13:30:56 -0000 1.4
> +++ rrdp_snapshot.c 4 Nov 2021 09:20:13 -0000
> @@ -201,6 +201,16 @@ snapshot_content_handler(void *data, con
> PARSE_FAIL(p, "parse failed - content too big");
> }
>
> +static void
> +snapshot_doctype_handler(void *data, const char *doctypeName,
> + const char *sysid, const char *pubid, int subset)
> +{
> + struct snapshot_xml *sxml = data;
> + XML_Parser p = sxml->parser;
> +
> + PARSE_FAIL(p, "parse failed - DOCTYPE not allowed");
> +}
> +
> struct snapshot_xml *
> new_snapshot_xml(XML_Parser p, struct rrdp_session *rs, struct rrdp *r)
> {
> @@ -219,6 +229,8 @@ new_snapshot_xml(XML_Parser p, struct rr
> snapshot_xml_elem_end);
> XML_SetCharacterDataHandler(sxml->parser, snapshot_content_handler);
> XML_SetUserData(sxml->parser, sxml);
> + XML_SetDoctypeDeclHandler(sxml->parser, snapshot_doctype_handler,
> + NULL);
>
> return sxml;
> }
>