commit - c4eae628f4a40d033c09ec9b40823c8f04411365
commit + fe36cf7631693ba127c07fe188f9ff963f900e86
blob - cd44eab6b3c47176b99421324d28e1c87544c58a
blob + 3f705279c643a7a7586cf44c85be37fe0ccec95e
--- lib/privsep.c
+++ lib/privsep.c
}
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;
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 =
*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) {