commit fe36cf7631693ba127c07fe188f9ff963f900e86 from: Stefan Sperling date: Mon Apr 23 05:01:14 2018 UTC create recv_one_imsg() helper commit - c4eae628f4a40d033c09ec9b40823c8f04411365 commit + fe36cf7631693ba127c07fe188f9ff963f900e86 blob - cd44eab6b3c47176b99421324d28e1c87544c58a blob + 3f705279c643a7a7586cf44c85be37fe0ccec95e --- lib/privsep.c +++ lib/privsep.c @@ -64,6 +64,35 @@ poll_fd(int fd, int events, int timeout) } static const struct got_error * +recv_one_imsg(struct imsg *imsg, struct imsgbuf *ibuf, size_t min_datalen) +{ + const struct got_error *err; + ssize_t n, m; + + err = poll_fd(ibuf->fd, POLLIN, INFTIM); + if (err) + return err; + + n = imsg_read(ibuf); + if (n == -1) { + if (errno == EAGAIN) /* Could be a file-descriptor leak. */ + return got_error(GOT_ERR_PRIVSEP_NO_FD); + return got_error(GOT_ERR_PRIVSEP_READ); + } + if (n == 0) + return got_error(GOT_ERR_PRIVSEP_PIPE); + + m = imsg_get(ibuf, imsg); + if (m == 0) + return got_error(GOT_ERR_PRIVSEP_READ); + + if (imsg->hdr.len < IMSG_HEADER_SIZE + min_datalen) + return got_error(GOT_ERR_PRIVSEP_LEN); + + return NULL; +} + +static const struct got_error * recv_imsg_error(struct imsg *imsg, size_t datalen) { struct got_imsg_error ierr; @@ -148,7 +177,6 @@ got_privsep_recv_obj(struct got_object **obj, struct i const struct got_error *err = NULL; struct imsg imsg; struct got_imsg_object iobj; - ssize_t n, m; size_t datalen; int i; const size_t min_datalen = @@ -156,26 +184,10 @@ got_privsep_recv_obj(struct got_object **obj, struct i *obj = NULL; - err = poll_fd(ibuf->fd, POLLIN, INFTIM); + err = recv_one_imsg(&imsg, ibuf, min_datalen); if (err) return err; - n = imsg_read(ibuf); - if (n == -1) { - if (errno == EAGAIN) /* Could be a file-descriptor leak. */ - return got_error(GOT_ERR_PRIVSEP_NO_FD); - return got_error(GOT_ERR_PRIVSEP_READ); - } - if (n == 0) - return got_error(GOT_ERR_PRIVSEP_PIPE); - - m = imsg_get(ibuf, &imsg); - if (m == 0) - return got_error(GOT_ERR_PRIVSEP_READ); - - if (imsg.hdr.len < IMSG_HEADER_SIZE + min_datalen) - return got_error(GOT_ERR_PRIVSEP_LEN); - datalen = imsg.hdr.len - IMSG_HEADER_SIZE; switch (imsg.hdr.type) {