diff options
author | Trumeet <yuuta@yuuta.moe> | 2022-07-28 15:38:34 -0700 |
---|---|---|
committer | Trumeet <yuuta@yuuta.moe> | 2022-07-28 15:38:34 -0700 |
commit | 0506ca8bdf8584858c0e462a24712c651a7e4e59 (patch) | |
tree | e8fd11d7fe7615536ec3f244bd5f90d39b396450 /client/acronc/handler_socket.c | |
parent | 35caf0da7fbf4ece60def1df1d88d34bf16185aa (diff) | |
download | acron-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.c | 20 |
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); |