From ee907697b40fe5fe21c45be2c6b912db16117374 Mon Sep 17 00:00:00 2001 From: Saurav Babu Date: Fri, 13 Apr 2018 16:35:38 +0530 Subject: [PATCH] comp-manager: Fixed glib warnings and memory corruptions Signed-off-by: Saurav Babu --- capi/src/companion.c | 6 +- src/companion-manager/src/comp_gdbus_group.c | 2 +- src/companion-manager/src/comp_group.c | 175 +++++++++++++++------------ src/companion-manager/src/comp_iot.cpp | 10 +- 4 files changed, 105 insertions(+), 88 deletions(-) diff --git a/capi/src/companion.c b/capi/src/companion.c index e7a1d2c..ba075ac 100644 --- a/capi/src/companion.c +++ b/capi/src/companion.c @@ -320,7 +320,7 @@ EXPORT_API int companion_device_send_data(companion_h handle, companion_device_s *dev = (companion_device_s *)device; companion_check_null_ret_error("dev", dev, COMP_ERROR_INVALID_PARAMETER); - buf = g_malloc0(len + 1); + buf = g_try_malloc0(len + 1); if (NULL == buf) { /* LCOV_EXCL_START */ _ERR("g_malloc0 is failed"); @@ -331,7 +331,7 @@ EXPORT_API int companion_device_send_data(companion_h handle, bytearray_builder = g_variant_builder_new(G_VARIANT_TYPE("ay")); for (i = 0; i < len; i++) - g_variant_builder_add(bytearray_builder, "y", data[i]); + g_variant_builder_add(bytearray_builder, "y", buf[i]); params = g_variant_new("(iay)", len, bytearray_builder); g_variant_builder_unref(bytearray_builder); @@ -342,7 +342,7 @@ EXPORT_API int companion_device_send_data(companion_h handle, group_call_send_data_sync(_handle->group_proxy, dev->device_id, dev->ip, dev->sec_port, params, &ret, NULL, &error); - free(buf); + g_free(buf); buf = NULL; return ret; diff --git a/src/companion-manager/src/comp_gdbus_group.c b/src/companion-manager/src/comp_gdbus_group.c index 4b7d105..87b7b48 100644 --- a/src/companion-manager/src/comp_gdbus_group.c +++ b/src/companion-manager/src/comp_gdbus_group.c @@ -240,7 +240,7 @@ gboolean group_send_data(Group *group, GDBusMethodInvocation *invocation, g_variant_get(params, "(iay)", &len, &iter); - data = g_try_malloc0(len); + data = g_try_malloc0(len + 1); if (NULL == data) { group_complete_send_data(group, invocation, -1); LOG_ERR("Failed to allocate memory"); diff --git a/src/companion-manager/src/comp_group.c b/src/companion-manager/src/comp_group.c index 270d772..2e888f1 100644 --- a/src/companion-manager/src/comp_group.c +++ b/src/companion-manager/src/comp_group.c @@ -205,37 +205,37 @@ int comp_group_find(int timeout) GVariant *comp_group_get_found_groups() { - GVariantBuilder builder; + GVariantBuilder *builder; GVariant *group_data; GList *iter = NULL; - g_variant_builder_init(&builder, G_VARIANT_TYPE("aa{sv}")); + builder = g_variant_builder_new(G_VARIANT_TYPE("aa{sv}")); iter = found_group_list; while (iter != NULL) { comp_group_t *group = (comp_group_t *)iter->data; - g_variant_builder_open(&builder, G_VARIANT_TYPE_VARDICT); - g_variant_builder_add(&builder, "{sv}", "URI", + g_variant_builder_open(builder, G_VARIANT_TYPE_VARDICT); + g_variant_builder_add(builder, "{sv}", "URI", g_variant_new_string(group->uri_path)); - g_variant_builder_add(&builder, "{sv}", "DeviceID", + g_variant_builder_add(builder, "{sv}", "DeviceID", g_variant_new_string(group->device_id)); - g_variant_builder_add(&builder, "{sv}", "GroupName", + g_variant_builder_add(builder, "{sv}", "GroupName", g_variant_new_string(group->group_name)); - g_variant_builder_add(&builder, "{sv}", "HostAddress", + g_variant_builder_add(builder, "{sv}", "HostAddress", g_variant_new_string(group->host_addr)); - g_variant_builder_add(&builder, "{sv}", "GroupDeviceType", + g_variant_builder_add(builder, "{sv}", "GroupDeviceType", g_variant_new_string(group->resource_type)); /*When we get found groups, we can get my groups also. */ - g_variant_builder_add(&builder, "{sv}", "GroupType", + g_variant_builder_add(builder, "{sv}", "GroupType", g_variant_new_int32(group->type)); - g_variant_builder_close(&builder); + g_variant_builder_close(builder); iter = g_list_next(iter); } - group_data = g_variant_builder_end(&builder); - g_variant_builder_unref(&builder); + group_data = g_variant_builder_end(builder); + g_variant_builder_unref(builder); return group_data; } @@ -244,7 +244,7 @@ int comp_group_add_new(char *uri_path, char *device_id, char *device_name, char *host_addr, char *resource_type, comp_group_type_e type) { comp_group_t *group; - GVariantBuilder builder; + GVariantBuilder *builder; GVariant *group_data; LOG_BEGIN(); @@ -259,26 +259,26 @@ int comp_group_add_new(char *uri_path, char *device_id, char *device_name, found_group_list = g_list_append(found_group_list, group); - g_variant_builder_init(&builder, G_VARIANT_TYPE("a{sv}")); + builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}")); - g_variant_builder_add(&builder, "{sv}", "URI", + g_variant_builder_add(builder, "{sv}", "URI", g_variant_new_string(group->uri_path)); - g_variant_builder_add(&builder, "{sv}", "DeviceID", + g_variant_builder_add(builder, "{sv}", "DeviceID", g_variant_new_string(group->device_id)); - g_variant_builder_add(&builder, "{sv}", "GroupName", + g_variant_builder_add(builder, "{sv}", "GroupName", g_variant_new_string(group->group_name)); - g_variant_builder_add(&builder, "{sv}", "HostAddress", + g_variant_builder_add(builder, "{sv}", "HostAddress", g_variant_new_string(group->host_addr)); - g_variant_builder_add(&builder, "{sv}", "GroupDeviceType", + g_variant_builder_add(builder, "{sv}", "GroupDeviceType", g_variant_new_string(group->resource_type)); - g_variant_builder_add(&builder, "{sv}", "GroupType", + g_variant_builder_add(builder, "{sv}", "GroupType", g_variant_new_int32(group->type)); - group_data = g_variant_builder_end(&builder); + group_data = g_variant_builder_end(builder); notify_group_found(group_data); - g_variant_builder_unref(&builder); + g_variant_builder_unref(builder); LOG_END(); @@ -323,53 +323,53 @@ int comp_group_add_new_mot_device(comp_mot_device_t *device) GVariant *comp_group_get_remote_mot_enabled_devices() { - GVariantBuilder builder; + GVariantBuilder *builder; GVariant *group_data; GList *iter = NULL; comp_remove_ip_info(); comp_make_ip_info(); - g_variant_builder_init(&builder, G_VARIANT_TYPE("aa{sv}")); + builder = g_variant_builder_new(G_VARIANT_TYPE("aa{sv}")); iter = mot_enb_dev_list; while (iter != NULL) { comp_mot_device_t *device = (comp_mot_device_t *)iter->data; - g_variant_builder_open(&builder, G_VARIANT_TYPE_VARDICT); - g_variant_builder_add(&builder, "{sv}", "DeviceID", + g_variant_builder_open(builder, G_VARIANT_TYPE_VARDICT); + g_variant_builder_add(builder, "{sv}", "DeviceID", g_variant_new_string(device->device_id)); - g_variant_builder_add(&builder, "{sv}", "Adapter", + g_variant_builder_add(builder, "{sv}", "Adapter", g_variant_new_int32(device->adapter)); - g_variant_builder_add(&builder, "{sv}", "Flags", + g_variant_builder_add(builder, "{sv}", "Flags", g_variant_new_int32(device->flags)); - g_variant_builder_add(&builder, "{sv}", "Port", + g_variant_builder_add(builder, "{sv}", "Port", g_variant_new_uint16(device->port)); - g_variant_builder_add(&builder, "{sv}", "Address", + g_variant_builder_add(builder, "{sv}", "Address", g_variant_new_string(device->addr)); - g_variant_builder_add(&builder, "{sv}", "DeviceType", + g_variant_builder_add(builder, "{sv}", "DeviceType", g_variant_new_uint16(comp_is_local_ip(device->addr))); - g_variant_builder_add(&builder, "{sv}", "Ifindex", + g_variant_builder_add(builder, "{sv}", "Ifindex", g_variant_new_int32(device->ifindex)); - g_variant_builder_add(&builder, "{sv}", "RouteData", + g_variant_builder_add(builder, "{sv}", "RouteData", g_variant_new_string(device->route_data)); - g_variant_builder_add(&builder, "{sv}", "ConnType", + g_variant_builder_add(builder, "{sv}", "ConnType", g_variant_new_int32(device->conn_type)); - g_variant_builder_add(&builder, "{sv}", "SecurePort", + g_variant_builder_add(builder, "{sv}", "SecurePort", g_variant_new_uint16(device->secure_port)); - g_variant_builder_add(&builder, "{sv}", "TcpPort", + g_variant_builder_add(builder, "{sv}", "TcpPort", g_variant_new_uint16(device->tcp_port)); - g_variant_builder_add(&builder, "{sv}", "SecVer", + g_variant_builder_add(builder, "{sv}", "SecVer", g_variant_new_string(device->sec_ver)); - g_variant_builder_add(&builder, "{sv}", "DeviceStatus", + g_variant_builder_add(builder, "{sv}", "DeviceStatus", g_variant_new_int32(device->dev_status)); - g_variant_builder_close(&builder); + g_variant_builder_close(builder); iter = g_list_next(iter); } - group_data = g_variant_builder_end(&builder); - g_variant_builder_unref(&builder); + group_data = g_variant_builder_end(builder); + g_variant_builder_unref(builder); return group_data; } @@ -668,23 +668,38 @@ int comp_group_send_data(gchar *uuid_dev, gchar *addr, int port, LOG_BEGIN(); - comp_command_t *cmd = g_new0(comp_command_t, 1); + comp_command_t *cmd = g_try_malloc0(sizeof(comp_command_t)); + if (NULL == cmd) { + ret = COMP_ERROR_OUT_OF_MEMORY; + LOG_ERR("Failed to alloc memory"); + return ret; + } + cmd->command = COMP_REQ_SEND_DATA; cmd->uuid = g_strdup(uuid_dev); cmd->host = _addr2host(addr, port); - cmd->data = g_malloc0(len + 1); +#ifdef SUPPORT_BASE64_ENCODING + cmd->data = g_try_malloc0(len + 1); if (NULL == cmd->data) { ret = COMP_ERROR_OUT_OF_MEMORY; LOG_ERR("Send Data Fail to uuid = %s host %s error=%s", cmd->uuid, cmd->host, comp_log_get_error_string(ret)); return ret; } -#ifdef SUPPORT_BASE64_ENCODING + memcpy(cmd->data, data, len); cmd->data_len = len; #else + cmd->arg1 = g_try_malloc0(len + 1); + if (NULL == cmd->arg1) { + ret = COMP_ERROR_OUT_OF_MEMORY; + LOG_ERR("Send Data Fail to uuid = %s host %s error=%s", + cmd->uuid, cmd->host, comp_log_get_error_string(ret)); + return ret; + } + memcpy(cmd->arg1, data, len); cmd->arg1[len] = '\0'; #endif @@ -736,53 +751,53 @@ int comp_group_add_new_mowned_device(comp_mot_device_t *device) GVariant *comp_group_get_mowned_devices() { - GVariantBuilder builder; + GVariantBuilder *builder; GVariant *group_data; GList *iter = NULL; comp_remove_ip_info(); comp_make_ip_info(); - g_variant_builder_init(&builder, G_VARIANT_TYPE("aa{sv}")); + builder = g_variant_builder_new(G_VARIANT_TYPE("aa{sv}")); iter = mowned_dev_list; while (iter != NULL) { comp_mot_device_t *device = (comp_mot_device_t *)iter->data; - g_variant_builder_open(&builder, G_VARIANT_TYPE_VARDICT); - g_variant_builder_add(&builder, "{sv}", "DeviceID", + g_variant_builder_open(builder, G_VARIANT_TYPE_VARDICT); + g_variant_builder_add(builder, "{sv}", "DeviceID", g_variant_new_string(device->device_id)); - g_variant_builder_add(&builder, "{sv}", "Adapter", + g_variant_builder_add(builder, "{sv}", "Adapter", g_variant_new_int32(device->adapter)); - g_variant_builder_add(&builder, "{sv}", "Flags", + g_variant_builder_add(builder, "{sv}", "Flags", g_variant_new_int32(device->flags)); - g_variant_builder_add(&builder, "{sv}", "Port", + g_variant_builder_add(builder, "{sv}", "Port", g_variant_new_uint16(device->port)); - g_variant_builder_add(&builder, "{sv}", "Address", + g_variant_builder_add(builder, "{sv}", "Address", g_variant_new_string(device->addr)); - g_variant_builder_add(&builder, "{sv}", "DeviceType", + g_variant_builder_add(builder, "{sv}", "DeviceType", g_variant_new_uint16(comp_is_local_ip(device->addr))); - g_variant_builder_add(&builder, "{sv}", "Ifindex", + g_variant_builder_add(builder, "{sv}", "Ifindex", g_variant_new_int32(device->ifindex)); - g_variant_builder_add(&builder, "{sv}", "RouteData", + g_variant_builder_add(builder, "{sv}", "RouteData", g_variant_new_string(device->route_data)); - g_variant_builder_add(&builder, "{sv}", "ConnType", + g_variant_builder_add(builder, "{sv}", "ConnType", g_variant_new_int32(device->conn_type)); - g_variant_builder_add(&builder, "{sv}", "SecurePort", + g_variant_builder_add(builder, "{sv}", "SecurePort", g_variant_new_uint16(device->secure_port)); - g_variant_builder_add(&builder, "{sv}", "TcpPort", + g_variant_builder_add(builder, "{sv}", "TcpPort", g_variant_new_uint16(device->tcp_port)); - g_variant_builder_add(&builder, "{sv}", "SecVer", + g_variant_builder_add(builder, "{sv}", "SecVer", g_variant_new_string(device->sec_ver)); - g_variant_builder_add(&builder, "{sv}", "DeviceStatus", + g_variant_builder_add(builder, "{sv}", "DeviceStatus", g_variant_new_int32(device->dev_status)); - g_variant_builder_close(&builder); + g_variant_builder_close(builder); iter = g_list_next(iter); } - group_data = g_variant_builder_end(&builder); - g_variant_builder_unref(&builder); + group_data = g_variant_builder_end(builder); + g_variant_builder_unref(builder); return group_data; } @@ -798,45 +813,45 @@ void comp_group_change_mowned_device(comp_mot_device_t *device) GVariant *comp_group_get_my_mowned_devices() { - GVariantBuilder builder; + GVariantBuilder *builder; GVariant *group_data; comp_remove_ip_info(); comp_make_ip_info(); - g_variant_builder_init(&builder, G_VARIANT_TYPE("a{sv}")); + builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}")); if (my_device != NULL) { - g_variant_builder_add(&builder, "{sv}", "DeviceID", + g_variant_builder_add(builder, "{sv}", "DeviceID", g_variant_new_string(my_device->device_id)); - g_variant_builder_add(&builder, "{sv}", "Adapter", + g_variant_builder_add(builder, "{sv}", "Adapter", g_variant_new_int32(my_device->adapter)); - g_variant_builder_add(&builder, "{sv}", "Flags", + g_variant_builder_add(builder, "{sv}", "Flags", g_variant_new_int32(my_device->flags)); - g_variant_builder_add(&builder, "{sv}", "Port", + g_variant_builder_add(builder, "{sv}", "Port", g_variant_new_uint16(my_device->port)); - g_variant_builder_add(&builder, "{sv}", "Address", + g_variant_builder_add(builder, "{sv}", "Address", g_variant_new_string(my_device->addr)); - g_variant_builder_add(&builder, "{sv}", "DeviceType", + g_variant_builder_add(builder, "{sv}", "DeviceType", g_variant_new_uint16(comp_is_local_ip(my_device->addr))); - g_variant_builder_add(&builder, "{sv}", "Ifindex", + g_variant_builder_add(builder, "{sv}", "Ifindex", g_variant_new_int32(my_device->ifindex)); - g_variant_builder_add(&builder, "{sv}", "RouteData", + g_variant_builder_add(builder, "{sv}", "RouteData", g_variant_new_string(my_device->route_data)); - g_variant_builder_add(&builder, "{sv}", "ConnType", + g_variant_builder_add(builder, "{sv}", "ConnType", g_variant_new_int32(my_device->conn_type)); - g_variant_builder_add(&builder, "{sv}", "SecurePort", + g_variant_builder_add(builder, "{sv}", "SecurePort", g_variant_new_uint16(my_device->secure_port)); - g_variant_builder_add(&builder, "{sv}", "TcpPort", + g_variant_builder_add(builder, "{sv}", "TcpPort", g_variant_new_uint16(my_device->tcp_port)); - g_variant_builder_add(&builder, "{sv}", "SecVer", + g_variant_builder_add(builder, "{sv}", "SecVer", g_variant_new_string(my_device->sec_ver)); - g_variant_builder_add(&builder, "{sv}", "DeviceStatus", + g_variant_builder_add(builder, "{sv}", "DeviceStatus", g_variant_new_int32(my_device->dev_status)); } - group_data = g_variant_builder_end(&builder); - g_variant_builder_unref(&builder); + group_data = g_variant_builder_end(builder); + g_variant_builder_unref(builder); return group_data; } diff --git a/src/companion-manager/src/comp_iot.cpp b/src/companion-manager/src/comp_iot.cpp index c134d64..3cc21de 100755 --- a/src/companion-manager/src/comp_iot.cpp +++ b/src/companion-manager/src/comp_iot.cpp @@ -423,7 +423,7 @@ OCEntityHandlerResult _request_handler(std::shared_ptr reques payload_len); outSize = B64DECODE_OUT_SAFESIZE(payload_len + 1); - out = (uint8_t *)g_malloc0(outSize); + out = (uint8_t *)g_try_malloc0(outSize); if (NULL == out) { LOG_ERR("Can't allocate memory for base64 str"); return OC_EH_OK; @@ -432,6 +432,7 @@ OCEntityHandlerResult _request_handler(std::shared_ptr reques if (B64_OK != b64Decode(data.c_str(), payload_len, out, outSize, &len)) { LOG_ERR("Base64 decoding failed."); + g_free(out); return OC_EH_OK; } @@ -439,6 +440,8 @@ OCEntityHandlerResult _request_handler(std::shared_ptr reques memcpy(arg, out, len); arg_len = len; + g_free(out); + LOG_DEBUG("Successfully decoded from base64"); #else if (!rep.getValue("data", data)) @@ -622,7 +625,7 @@ static void _on_post(const HeaderOptions& /*headerOptions*/, notify_send_data_finish("RESP_DATA", last_get_result); - _clear_user_data(user_data); + //_clear_user_data(cmd); } static bool _found_resource(std::shared_ptr resource, @@ -848,14 +851,13 @@ int comp_iot_send_data(comp_resource_type_e resource_type, int timeout, case COMP_REQ_SEND_DATA: #ifdef SUPPORT_BASE64_ENCODING b64BufSize = B64ENCODE_OUT_SAFESIZE((cmd->data_len + 1)); - b64Buf = (char *) g_malloc0(b64BufSize); + b64Buf = (char *) g_try_malloc0(b64BufSize + 1); if (NULL == b64Buf) { _clear_user_data(cmd); return TRUE; } b64Encode(cmd->data, cmd->data_len, b64Buf, b64BufSize, &outSize); - b64Buf[b64BufSize] = '\0'; rep.setValue("data", std::string(b64Buf)); LOG_DEBUG("b64BufSize =%d outSize = %d b64Buf = %s", b64BufSize, outSize, b64Buf); -- 2.7.4