Bugfix: ipc_receive_message reply leak
Patch status: merged
Patch by Tony Crisci
Long description:
The function ipc_recv_message in libi3 allocates memory to the location of the `message` reply in src/ipc_receive_message.c with malloc and must be freed. This memory leak was found using valgrind.
To apply this patch, use:
curl http://cr.i3wm.org/patch/450/raw.patch | git am
b/src/ipc.c
| 18 |
@@ -894,14 +894,16 @@ handler_t handlers[8] = {
|
| 19 |
static void ipc_receive_message(EV_P_ struct ev_io *w, int revents) {
|
| 20 |
uint32_t message_type; |
| 21 |
uint32_t message_length; |
| 22 |
- uint8_t *message; |
| 23 |
+ uint8_t *message = NULL; |
| 24 |
|
| 25 |
int ret = ipc_recv_message(w->fd, &message_type, &message_length, &message); |
| 26 |
/* EOF or other error */ |
| 27 |
if (ret < 0) {
|
| 28 |
/* Was this a spurious read? See ev(3) */ |
| 29 |
- if (ret == -1 && errno == EAGAIN) |
| 30 |
+ if (ret == -1 && errno == EAGAIN) {
|
| 31 |
+ FREE(message); |
| 32 |
return; |
| 33 |
+ } |
| 34 |
|
| 35 |
/* If not, there was some kind of error. We don’t bother |
| 36 |
* and close the connection */ |
| 37 |
@@ -924,6 +926,7 @@ static void ipc_receive_message(EV_P_ struct ev_io *w, int revents) {
|
| 38 |
|
| 39 |
ev_io_stop(EV_A_ w); |
| 40 |
free(w); |
| 41 |
+ FREE(message); |
| 42 |
|
| 43 |
DLOG("IPC: client disconnected\n");
|
| 44 |
return; |
| 45 |
@@ -935,6 +938,8 @@ static void ipc_receive_message(EV_P_ struct ev_io *w, int revents) {
|
| 46 |
handler_t h = handlers[message_type]; |
| 47 |
h(w->fd, message, 0, message_length, message_type); |
| 48 |
} |
| 49 |
+ |
| 50 |
+ FREE(message); |
| 51 |
} |
| 52 |
|
| 53 |
/* |