commit b8fd0ed6d85ecf09d927c6551d1e233f41bd68ab from: Omar Polo date: Mon Sep 13 15:47:10 2021 UTC send received page in chunks imsg can't handle buffer "too big" (around INT16_MAX) and solene@ capsule index is ~29K. The 4K chunk size is completely arbitrary. commit - 7b0be57c7cb536303ba948e71fcd81f40f85f0c3 commit + b8fd0ed6d85ecf09d927c6551d1e233f41bd68ab blob - 88b9b979998d210062fdde5d8e9507772e1a56d3 blob + 6d8e0e4e3262ab70488c88ff0cdbc9e1f647b5a8 --- net.c +++ net.c @@ -541,7 +541,7 @@ net_read(struct bufferevent *bev, void *d) struct req *req = d; struct evbuffer *src = EVBUFFER_INPUT(bev); void *data; - size_t len; + size_t len, chunk; int r; char *header; @@ -562,8 +562,19 @@ net_read(struct bufferevent *bev, void *d) if ((len = EVBUFFER_LENGTH(src)) == 0) return; data = EVBUFFER_DATA(src); - net_send_ui(IMSG_BUF, req->id, data, len); - evbuffer_drain(src, len); + + /* + * Split data into chunks before sending. imsg can't handle + * message that are "too big". + */ + while (len != 0) { + chunk = MIN(len, 4096); + net_send_ui(IMSG_BUF, req->id, data, chunk); + data += chunk; + len -= chunk; + } + + evbuffer_drain(src, EVBUFFER_LENGTH(src)); return; err: