aboutsummaryrefslogtreecommitdiff
path: root/client/acronc/handler_socket.c
diff options
context:
space:
mode:
authorTrumeet <yuuta@yuuta.moe>2022-07-28 15:38:34 -0700
committerTrumeet <yuuta@yuuta.moe>2022-07-28 15:38:34 -0700
commit0506ca8bdf8584858c0e462a24712c651a7e4e59 (patch)
treee8fd11d7fe7615536ec3f244bd5f90d39b396450 /client/acronc/handler_socket.c
parent35caf0da7fbf4ece60def1df1d88d34bf16185aa (diff)
downloadacron-0506ca8bdf8584858c0e462a24712c651a7e4e59.tar
acron-0506ca8bdf8584858c0e462a24712c651a7e4e59.tar.gz
acron-0506ca8bdf8584858c0e462a24712c651a7e4e59.tar.bz2
acron-0506ca8bdf8584858c0e462a24712c651a7e4e59.zip
fix(libacron): memory leak when received more than one frames
API:CHANGE
Diffstat (limited to 'client/acronc/handler_socket.c')
-rw-r--r--client/acronc/handler_socket.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/client/acronc/handler_socket.c b/client/acronc/handler_socket.c
index efed127..2dfda5e 100644
--- a/client/acronc/handler_socket.c
+++ b/client/acronc/handler_socket.c
@@ -156,6 +156,26 @@ static void on_read(uv_stream_t *tcp, ssize_t nread, const uv_buf_t *buf) {
/* acronc error. Socket is working. */
ex(false);
}
+
+ LOGD("Clearing backlog.");
+ while (true) {
+ if ((r = ac_receive(ac_conn, NULL, 0, &obj))) {
+ LOGEV("Cannot clear backlog (%d).", r);
+ /* libac error. Socket is working. */
+ free(buf->base);
+ ex(false);
+ return;
+ }
+ if (!obj) {
+ break;
+ }
+ if (cb_recv(obj)) {
+ /* acronc error. Socket is working. */
+ ex(false);
+ free(buf->base);
+ return;
+ }
+ }
}
free(buf->base);