From: Cheoleun Moon Date: Fri, 3 Apr 2020 03:25:00 +0000 (+0900) Subject: Add some error checks X-Git-Tag: submit/tizen/20200403.050222~1^2~1^2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=2f925cc7e3a72e9132942ceb88ee98319f937977;p=platform%2Fcore%2Fapi%2Fwifi-aware.git Add some error checks --- diff --git a/src/wifi-aware-private.c b/src/wifi-aware-private.c index 67af6a5..88e5981 100644 --- a/src/wifi-aware-private.c +++ b/src/wifi-aware-private.c @@ -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; }