Add some error checks
authorCheoleun Moon <chleun.moon@samsung.com>
Fri, 3 Apr 2020 03:25:00 +0000 (12:25 +0900)
committerCheoleun Moon <chleun.moon@samsung.com>
Fri, 3 Apr 2020 03:25:00 +0000 (12:25 +0900)
src/wifi-aware-private.c

index 67af6a5..88e5981 100644 (file)
@@ -967,20 +967,20 @@ int _wifi_aware_session_cancel(wifi_aware_session_h session)
        return WIFI_AWARE_ERROR_INVALID_OPERATION;
 }
 
-static void __unpack_byte_array(unsigned char *array, GVariant *var, uint16_t len)
+static bool __unpack_byte_array(unsigned char *array, GVariant *var, uint16_t len)
 {
     GVariantIter *iter = NULL;
     int length = 0;
 
     if (array == NULL || var == NULL || len == 0) {
         WIFI_AWARE_LOGI("Invalid parameter");
-        return;
+        return false;
     }
 
     g_variant_get(var, "ay", &iter);
     if (iter == NULL) {
         WIFI_AWARE_LOGE("Fail to get iterator");
-        return;
+        return false;
     }
 
     while (g_variant_iter_loop(iter, "y", &array[length])) {
@@ -989,9 +989,11 @@ static void __unpack_byte_array(unsigned char *array, GVariant *var, uint16_t le
             break;
     }
     g_variant_iter_free(iter);
+
+       return true;
 }
 
-static void __parsing_service_discovered_event(GVariant *parameters,
+static bool __parsing_service_discovered_event(GVariant *parameters,
                uint16_t *sub_id, unsigned int *peer_id, unsigned char *peer_mac,
                unsigned char *specific_info, size_t *specific_info_len)
 {
@@ -1000,14 +1002,26 @@ static void __parsing_service_discovered_event(GVariant *parameters,
 
        g_variant_get(parameters, "(quvqv)", sub_id, peer_id, &mac_var,
                        specific_info_len, &info_var);
+       if (*specific_info_len > WIFI_AWARE_MAX_SERVICE_SPECIFIC_INFO_LEN) {
+               WIFI_AWARE_LOGE("Too long service specific info, %u", *specific_info_len);
+               return false;
+       }
 
-       __unpack_byte_array(peer_mac, mac_var, WIFI_AWARE_MAC_ADDRESS_LEN);
-       __unpack_byte_array(specific_info, info_var, *specific_info_len);
+       if (__unpack_byte_array(peer_mac, mac_var, WIFI_AWARE_MAC_ADDRESS_LEN) == false) {
+               WIFI_AWARE_LOGE("Fail to get peer MAC address");
+               return false;
+       }
+       if (__unpack_byte_array(specific_info, info_var, *specific_info_len) == false) {
+               WIFI_AWARE_LOGE("Fail to get service specific info");
+               return false;
+       }
        g_variant_unref(mac_var);
        g_variant_unref(info_var);
+
+       return true;
 }
 
-static void __parsing_message_received_event(GVariant *parameters, unsigned int *peer_id,
+static bool __parsing_message_received_event(GVariant *parameters, unsigned int *peer_id,
                unsigned char *peer_mac,
                unsigned char *message, size_t *message_len)
 {
@@ -1016,11 +1030,23 @@ static void __parsing_message_received_event(GVariant *parameters, unsigned int
 
        g_variant_get(parameters, "(uvqv)", peer_id, &mac_var,
                        message_len, &msg_var);
+       if (*message_len > WIFI_AWARE_MAX_SERVICE_SPECIFIC_INFO_LEN) {
+               WIFI_AWARE_LOGE("Too long message %u", *message_len);
+               return false;
+       }
 
-       __unpack_byte_array(peer_mac, mac_var, WIFI_AWARE_MAC_ADDRESS_LEN);
-       __unpack_byte_array(message, msg_var, *message_len);
+       if (__unpack_byte_array(peer_mac, mac_var, WIFI_AWARE_MAC_ADDRESS_LEN) == false) {
+               WIFI_AWARE_LOGE("Fail to get peer MAC address");
+               return false;
+       }
+       if (__unpack_byte_array(message, msg_var, *message_len) == false) {
+               WIFI_AWARE_LOGE("fail to get message");
+               return false;
+       }
        g_variant_unref(mac_var);
        g_variant_unref(msg_var);
+
+       return true;
 }
 
 static int __get_peer_handle(unsigned int peer_id, wifi_aware_peer_h *peer)
@@ -1061,12 +1087,10 @@ static void __service_discovered_cb(GDBusConnection *connection,
 
        RET_IF(!_wifi_aware_session_is_subscribe_type(session), "This session is not for Subscribe");
 
-       __parsing_service_discovered_event(parameters,
+       if (__parsing_service_discovered_event(parameters,
                        &sub_id, &peer_id, peer_mac,
-                       specific_info, &specific_info_len);
-
-       if (specific_info_len > WIFI_AWARE_MAX_SERVICE_SPECIFIC_INFO_LEN) {
-               WIFI_AWARE_LOGE("Too long service specific info");
+                       specific_info, &specific_info_len) == false) {
+               WIFI_AWARE_LOGE("Fail to get parameters");
                return;
        }
 
@@ -1102,10 +1126,9 @@ static void __message_received_cb(GDBusConnection *connection,
        wifi_aware_session_h session = (wifi_aware_session_h)user_data;
        wifi_aware_peer_h peer = NULL;
 
-       __parsing_message_received_event(parameters, &peer_id, peer_mac,
-                       message, &message_len);
-       if (message_len > WIFI_AWARE_MAX_SERVICE_SPECIFIC_INFO_LEN) {
-               WIFI_AWARE_LOGE("Too long message %u", message_len);
+       if (__parsing_message_received_event(parameters, &peer_id, peer_mac,
+                       message, &message_len) == false) {
+               WIFI_AWARE_LOGE("Fail to get parameters");
                return;
        }