summaryrefslogtreecommitdiff
path: root/monitor/hcidump.c
diff options
context:
space:
mode:
authorTedd Ho-Jeong An <hj.tedd.an@gmail.com>2020-11-20 12:07:07 -0800
committerLuiz Augusto von Dentz <luiz.von.dentz@intel.com>2020-11-24 13:03:46 -0800
commit66affa10d820e1fda19cbcea668a8e3d63d887f0 (patch)
tree7cbb1726aeb4cdee82a216bb0f46e880a7add9f9 /monitor/hcidump.c
parentd83f1d480a15e0229ff47c197e0145a4640e626a (diff)
downloadbluez-66affa10d820e1fda19cbcea668a8e3d63d887f0.tar.gz
monitor: Fix potential memory leak
If the mainloop_add_fd() returns with failure, the destroy callback is never called so any reosurces need to be released never freed/closed. This potential leakage is checked with valgrind after failing the mainloop_add_fd() function manually. ==258684== 1,500 bytes in 1 blocks are definitely lost in loss record 3 of 3 ==258684== at 0x483BB1A: calloc (vg_replace_malloc.c:760) ==258684== by 0x123F1A: open_channel (control.c:1058) ==258684== by 0x125B09: control_tracing (control.c:1540) ==258684== by 0x122764: main (main.c:255) ==258684== ==258684== LEAK SUMMARY: ==258684== definitely lost: 1,500 bytes in 1 blocks ==258684== indirectly lost: 0 bytes in 0 blocks ==258684== possibly lost: 0 bytes in 0 blocks ==258684== still reachable: 48 bytes in 2 blocks ==258684== suppressed: 0 bytes in 0 blocks This patch frees/closes the resources if the function returns with failure.
Diffstat (limited to 'monitor/hcidump.c')
-rw-r--r--monitor/hcidump.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/monitor/hcidump.c b/monitor/hcidump.c
index 690b9b913..fac9c8a08 100644
--- a/monitor/hcidump.c
+++ b/monitor/hcidump.c
@@ -184,7 +184,11 @@ static void open_device(uint16_t index)
return;
}
- mainloop_add_fd(data->fd, EPOLLIN, device_callback, data, free_data);
+ if (mainloop_add_fd(data->fd, EPOLLIN, device_callback,
+ data, free_data) < 0) {
+ close(data->fd);
+ free(data);
+ }
}
static void device_info(int fd, uint16_t index, uint8_t *type, uint8_t *bus,
@@ -393,8 +397,12 @@ int hcidump_tracing(void)
return -1;
}
- mainloop_add_fd(data->fd, EPOLLIN, stack_internal_callback,
- data, free_data);
+ if (mainloop_add_fd(data->fd, EPOLLIN, stack_internal_callback,
+ data, free_data) < 0) {
+ close(data->fd);
+ free(data);
+ return -1;
+ }
return 0;
}