commit b00c982167ffc56b444ff3211a2b5a62c56ec589 from: Stefan Sperling date: Sun Nov 04 20:37:28 2018 UTC avoid unnecessary imsg flushing in got_privsep_send_tree() commit - 904df868d68e12778fedf815fe73a70919d71b19 commit + b00c982167ffc56b444ff3211a2b5a62c56ec589 blob - 325eec8a4a865b83e3bde9ce509f2fc339a25189 blob + 24bc13c17a4bac288c81125e4564e661ca7d4fd6 --- lib/privsep.c +++ lib/privsep.c @@ -626,16 +626,14 @@ got_privsep_send_tree(struct imsgbuf *ibuf, struct got const struct got_error *err = NULL; struct got_imsg_tree_object itree; struct got_tree_entry *te; + size_t totlen; itree.nentries = tree->entries.nentries; if (imsg_compose(ibuf, GOT_IMSG_TREE, 0, 0, -1, &itree, sizeof(itree)) == -1) return got_error_from_errno(); - err = flush_imsg(ibuf); - if (err) - return err; - + totlen = sizeof(itree); SIMPLEQ_FOREACH(te, &tree->entries.head, entry) { struct got_imsg_tree_entry ite; uint8_t *buf = NULL; @@ -644,6 +642,12 @@ got_privsep_send_tree(struct imsgbuf *ibuf, struct got if (len > MAX_IMSGSIZE) return got_error(GOT_ERR_NO_SPACE); + if (totlen + len >= MAX_IMSGSIZE - IMSG_HEADER_SIZE) { + err = flush_imsg(ibuf); + if (err) + return err; + } + buf = malloc(len); if (buf == NULL) return got_error_from_errno(); @@ -659,13 +663,10 @@ got_privsep_send_tree(struct imsgbuf *ibuf, struct got free(buf); if (err) return err; - - err = flush_imsg(ibuf); - if (err) - return err; + totlen += len; } - return NULL; + return flush_imsg(ibuf); } const struct got_error *