Commit Diff


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 *