Use memcpy/memdup as there can be intermediate NULLs in BLE payload 16/211816/1
authorLokesh <l.kasana@samsung.com>
Mon, 5 Aug 2019 09:47:40 +0000 (15:17 +0530)
committersaerome.kim <saerome.kim@samsung.com>
Fri, 9 Aug 2019 08:28:02 +0000 (17:28 +0900)
Change-Id: Icc684c590d4af8c2c3ad33e6d49429e67bdd7a41
Signed-off-by: Lokesh <l.kasana@samsung.com>
include/ua-api.h
ua-daemon/src/pm/ua-pm-util.c
ua-daemon/src/ua-manager-core.c
ua-daemon/src/ua-manager-device-db.c

index c46289c..380ebda 100644 (file)
@@ -56,10 +56,10 @@ typedef enum {
 #define UAM_DEVICE_ID_MAX_STRING_LEN 50
 
 /**
- * @brief Max. device payload length.
+ * @brief Device's BLE payload length.
  * @since_tizen 5.5
  */
-#define UAM_PAYLOAD_MAX_STRING_LEN 50
+#define UAM_BLE_PAYLOAD_STRING_LEN 31
 
 /**
  * @brief Max. IP address length.
@@ -447,7 +447,7 @@ typedef struct {
        char mac[UAM_MAC_ADDRESS_STRING_LEN]; /**< Device's MAC ADDRESS */
        char ipv4_addr[UAM_IP_ADDRESS_MAX_STRING_LEN];/**< Device's IPv4 address optional */
        char device_id[UAM_DEVICE_ID_MAX_STRING_LEN]; /**< Device's uniquie ID */
-       char payload[UAM_PAYLOAD_MAX_STRING_LEN]; /**< Payload to scan ble devices*/
+       char payload[UAM_BLE_PAYLOAD_STRING_LEN + 1]; /**< Payload to scan ble devices*/
        gboolean discriminant; /**< Determines whether to judge PRESENCE/ABSENCE */
        long last_seen; /**< Latest timestamp when device was discoverd */
 } uam_device_info_s;
index 287cb45..85638a3 100644 (file)
@@ -246,7 +246,7 @@ uas_device_info_t *_pm_util_uam_dev_info_to_uas_dev_info(const uam_device_info_s
                UAM_WARN("device->num_addr = %d", device->num_addr);
 
        device->device_id = g_strdup(dev->device_id);
-       device->payload = g_strdup(dev->payload);
+       device->payload = g_memdup(dev->payload, UAM_BLE_PAYLOAD_STRING_LEN);
        device->addr_list = g_new0(uas_address_info_t, device->num_addr);
        if (mac) {
                device->addr_list[i].type = type;
@@ -277,7 +277,8 @@ uam_device_info_s *_pm_util_uas_dev_info_to_uam_dev_info(const uas_device_info_t
        device->discriminant = dev->discriminant;
 
        g_strlcpy(device->device_id, dev->device_id, UAM_DEVICE_ID_MAX_STRING_LEN);
-       g_strlcpy(device->payload, dev->payload, UAM_PAYLOAD_MAX_STRING_LEN);
+       device->payload[UAM_BLE_PAYLOAD_STRING_LEN] = 0;
+       memcpy(device->payload, dev->payload, UAM_BLE_PAYLOAD_STRING_LEN);
 
        for (i = 0; i < dev->num_addr; i++) {
                UAM_DBG("Address[%d]: %s", i, dev->addr_list[i].address);
index ace4182..ef2da56 100644 (file)
@@ -454,8 +454,10 @@ static void __get_uam_db_dev_list_to_uam_dev_list(
                        (*device_list)[indx].operating_system = db_info->os;
                        g_strlcpy((*device_list)[indx].device_id, db_info->device_id,
                                        UAM_DEVICE_ID_MAX_STRING_LEN);
-                       g_strlcpy((*device_list)[indx].payload, tech->payload,
-                                       UAM_PAYLOAD_MAX_STRING_LEN);
+
+                       (*device_list)[indx].payload[UAM_BLE_PAYLOAD_STRING_LEN] = 0;
+                       memcpy((*device_list)[indx].payload, tech->payload,
+                                       UAM_BLE_PAYLOAD_STRING_LEN);
                        (*device_list)[indx].discriminant = tech->discriminant;
                        (*device_list)[indx].last_seen = tech->timestamp;
                        (*device_list)[indx++].type = tech->tech_type;
@@ -503,8 +505,10 @@ static int __copy_tech_info_to_device_info(uam_db_tech_info_t *tech, uam_device_
                        UAM_DEVICE_ID_MAX_STRING_LEN);
        device->type = tech->tech_type;
        device->discriminant = tech->discriminant;
-       g_strlcpy(device->payload, tech->payload,
-                       UAM_PAYLOAD_MAX_STRING_LEN);
+
+       device->payload[UAM_BLE_PAYLOAD_STRING_LEN] = 0;
+       memcpy(device->payload, tech->payload,
+                       UAM_BLE_PAYLOAD_STRING_LEN);
 
        FUNC_EXIT;
        return UAM_ERROR_NONE;
@@ -645,7 +649,7 @@ static void __uam_core_add_dev_to_list(
        tech->timestamp = timestamp;
        tech->device = device;
        tech->discriminant = dev_info->discriminant;
-       tech->payload =  g_strdup(dev_info->payload);
+       tech->payload =  g_memdup(dev_info->payload, UAM_BLE_PAYLOAD_STRING_LEN);
 
        tech->svc_list = svc_list;
        g_slist_foreach(tech->svc_list, __print_service, tech);
@@ -3093,8 +3097,9 @@ static void __get_service_dev_list(
                                UAM_DEVICE_ID_MAX_STRING_LEN);
                (*device_list)[indx].last_seen = tech->timestamp;
                (*device_list)[indx].discriminant = tech->discriminant;
-               g_strlcpy((*device_list)[indx].payload, tech->payload,
-                               UAM_PAYLOAD_MAX_STRING_LEN);
+               (*device_list)[indx].payload[UAM_BLE_PAYLOAD_STRING_LEN] = 0;
+               memcpy((*device_list)[indx].payload, tech->payload,
+                               UAM_BLE_PAYLOAD_STRING_LEN);
                (*device_list)[indx++].type = tech->tech_type;
        }
 
index 7f26a35..45ad9bb 100644 (file)
@@ -574,8 +574,9 @@ int _ua_device_db_get_device(char *device_id, int tech_type, char *address,
                info->dev_info.operating_system = sqlite3_column_int(stmt, 6);
                info->user_id = sqlite3_column_int(stmt, 7);
                info->dev_info.discriminant = sqlite3_column_int(stmt, 8);
-               g_strlcpy(info->dev_info.payload, (char *)sqlite3_column_text(stmt, 9),
-                       UAM_PAYLOAD_MAX_STRING_LEN);
+               info->dev_info.payload[UAM_BLE_PAYLOAD_STRING_LEN] = 0;
+               memcpy(info->dev_info.payload, (char *)sqlite3_column_text(stmt, 9),
+                       UAM_BLE_PAYLOAD_STRING_LEN);
 
                UAM_INFO("%s-%d-%s-%s-%ld-%d-%d-%d-%d-%s",
                        info->dev_info.device_id,
@@ -668,8 +669,9 @@ GSList *_ua_device_db_get_all_devices(void)
                        info->dev_info.operating_system = sqlite3_column_int(stmt, 6);
                        info->user_id = sqlite3_column_int(stmt, 7);
                        info->dev_info.discriminant = sqlite3_column_int(stmt, 8);
-                       g_strlcpy(info->dev_info.payload, (char *)sqlite3_column_text(stmt, 9),
-                               UAM_PAYLOAD_MAX_STRING_LEN);
+                       info->dev_info.payload[UAM_BLE_PAYLOAD_STRING_LEN] = 0;
+                       memcpy(info->dev_info.payload, (char *)sqlite3_column_text(stmt, 9),
+                               UAM_BLE_PAYLOAD_STRING_LEN);
 
                        UAM_INFO("%s-%d-%s-%s-%ld-%d-%d-%d-%d-%s",
                                info->dev_info.device_id,