restart_dhcp() is passing dhcp_client->last_address as the last_address
argument of g_dhcp_client_start()
this leads a memory violation in g_dhcp_client_start if
dhcp_client->last_address == last_address, as
g_free(dhcp_client->last_address);
dhcp_client->last_address = g_strdup(last_address);
which may happen when called from restart_dhcp()
==10736== Invalid read of size 1
==10736== at 0x4C2BFA2: strlen (in
/usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==10736== by 0x4E942A1: g_strdup (in
/lib/x86_64-linux-gnu/libglib-2.0.so.0.3200.4)
==10736== by 0x416A60: g_dhcp_client_start (client.c:2837)
==10736== by 0x413D1A: restart_dhcp (client.c:1647)
==10736== by 0x413D63: start_expire (client.c:1659)
==10736== by 0x4E7A8DA: ??? (in
/lib/x86_64-linux-gnu/libglib-2.0.so.0.3200.4)
==10736== by 0x4E79D12: g_main_context_dispatch (in
/lib/x86_64-linux-gnu/libglib-2.0.so.0.3200.4)
==10736== by 0x4E7A05F: ??? (in
/lib/x86_64-linux-gnu/libglib-2.0.so.0.3200.4)
==10736== by 0x4E7A459: g_main_loop_run (in
/lib/x86_64-linux-gnu/libglib-2.0.so.0.3200.4)
==10736== by 0x444535: main (main.c:705)
==10736== Address 0x735eca0 is 0 bytes inside a block of size 16 free'd
==10736== at 0x4C2A82E: free (in
/usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==10736== by 0x416A54: g_dhcp_client_start (client.c:2836)
==10736== by 0x413D1A: restart_dhcp (client.c:1647)
==10736== by 0x413D63: start_expire (client.c:1659)
==10736== by 0x4E7A8DA: ??? (in
/lib/x86_64-linux-gnu/libglib-2.0.so.0.3200.4)
==10736== by 0x4E79D12: g_main_context_dispatch (in
/lib/x86_64-linux-gnu/libglib-2.0.so.0.3200.4)
==10736== by 0x4E7A05F: ??? (in
/lib/x86_64-linux-gnu/libglib-2.0.so.0.3200.4)
==10736== by 0x4E7A459: g_main_loop_run (in
/lib/x86_64-linux-gnu/libglib-2.0.so.0.3200.4)
==10736== by 0x444535: main (main.c:705)
---
gdhcp/client.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/gdhcp/client.c b/gdhcp/client.c
index 084cd7e..3c11957 100644
--- a/gdhcp/client.c
+++ b/gdhcp/client.c
@@ -2832,7 +2832,7 @@ int g_dhcp_client_start(GDHCPClient *dhcp_client, const
char *last_address)
addr = ntohl(inet_addr(last_address));
if (addr == 0xFFFFFFFF) {
addr = 0;
- } else {
+ } else if (dhcp_client->last_address != last_address) {
g_free(dhcp_client->last_address);
dhcp_client->last_address = g_strdup(last_address);
}
--
1.7.10.4
_______________________________________________
connman mailing list
[email protected]
https://lists.connman.net/mailman/listinfo/connman