Fix missing null termination at strncat() in wifi_test.c
authorSeongil Hahm <seongil.hahm@samsung.com>
Sat, 16 Sep 2017 05:42:20 +0000 (22:42 -0700)
committerSeongil Hahm <seongil.hahm@samsung.com>
Mon, 18 Sep 2017 15:26:06 +0000 (08:26 -0700)
1. Use snprintf instead of sprintf with maximum length - 1
2. Tackle the overflow when string concatenating

apps/examples/testcase/ta_tc/wifi_manager/utc/utc_wifi_manager_main.c
apps/examples/wifi_test/wifi_test.c

index 923dbf1..e9e5905 100644 (file)
@@ -147,10 +147,10 @@ static void utc_wifi_manager_set_mode_n(void)
 
        wifi_manager_softap_config_s ap_config;
        strncpy(ap_config.ssid, CONFIG_EXAMPLES_TESTCASE_WIFI_MANAGER_UTC_SOFTAP_SSID, \
-                                       strlen(CONFIG_EXAMPLES_TESTCASE_WIFI_MANAGER_UTC_SOFTAP_SSID));
+                                       strlen(CONFIG_EXAMPLES_TESTCASE_WIFI_MANAGER_UTC_SOFTAP_SSID) + 1);
        ap_config.channel = CONFIG_EXAMPLES_TESTCASE_WIFI_MANAGER_UTC_SOFTAP_CHANNEL;
        strncpy(ap_config.passphrase, CONFIG_EXAMPLES_TESTCASE_WIFI_MANAGER_UTC_SOFTAP_PASSPHRASE, \
-                                       strlen(CONFIG_EXAMPLES_TESTCASE_WIFI_MANAGER_UTC_SOFTAP_PASSPHRASE));
+                                       strlen(CONFIG_EXAMPLES_TESTCASE_WIFI_MANAGER_UTC_SOFTAP_PASSPHRASE) + 1);
 
        ret = wifi_manager_set_mode(WIFI_NONE, &ap_config);
 
@@ -164,11 +164,11 @@ static void utc_wifi_manager_set_mode_p(void)
 
        wifi_manager_softap_config_s ap_config;
        strncpy(ap_config.ssid, CONFIG_EXAMPLES_TESTCASE_WIFI_MANAGER_UTC_SOFTAP_SSID, \
-                                       strlen(CONFIG_EXAMPLES_TESTCASE_WIFI_MANAGER_UTC_SOFTAP_SSID));
+                                       strlen(CONFIG_EXAMPLES_TESTCASE_WIFI_MANAGER_UTC_SOFTAP_SSID) + 1);
        ap_config.channel = CONFIG_EXAMPLES_TESTCASE_WIFI_MANAGER_UTC_SOFTAP_CHANNEL;
        strncpy(ap_config.passphrase, CONFIG_EXAMPLES_TESTCASE_WIFI_MANAGER_UTC_SOFTAP_PASSPHRASE, \
-                                       strlen(CONFIG_EXAMPLES_TESTCASE_WIFI_MANAGER_UTC_SOFTAP_PASSPHRASE));
-       printf("SoftAP config: %s(%d), %s(%d), %d %d\n", ap_config.ssid, strlen(CONFIG_EXAMPLES_TESTCASE_WIFI_MANAGER_UTC_SOFTAP_SSID), \
+                                       strlen(CONFIG_EXAMPLES_TESTCASE_WIFI_MANAGER_UTC_SOFTAP_PASSPHRASE) + 1);
+       printf("SoftAP config: %s(%d), %s(%d), %d\n", ap_config.ssid, strlen(CONFIG_EXAMPLES_TESTCASE_WIFI_MANAGER_UTC_SOFTAP_SSID), \
                                        ap_config.passphrase, strlen(CONFIG_EXAMPLES_TESTCASE_WIFI_MANAGER_UTC_SOFTAP_PASSPHRASE), ap_config.channel);
 
        ret = wifi_manager_set_mode(SOFTAP_MODE, &ap_config);
@@ -206,10 +206,10 @@ static void utc_wifi_manager_get_mode_p(void)
 
        wifi_manager_softap_config_s ap_config;
        strncpy(ap_config.ssid, CONFIG_EXAMPLES_TESTCASE_WIFI_MANAGER_UTC_SOFTAP_SSID, \
-                                       strlen(CONFIG_EXAMPLES_TESTCASE_WIFI_MANAGER_UTC_SOFTAP_SSID));
+                                       strlen(CONFIG_EXAMPLES_TESTCASE_WIFI_MANAGER_UTC_SOFTAP_SSID) + 1);
        ap_config.channel = CONFIG_EXAMPLES_TESTCASE_WIFI_MANAGER_UTC_SOFTAP_CHANNEL;
        strncpy(ap_config.passphrase, CONFIG_EXAMPLES_TESTCASE_WIFI_MANAGER_UTC_SOFTAP_PASSPHRASE, \
-                                       strlen(CONFIG_EXAMPLES_TESTCASE_WIFI_MANAGER_UTC_SOFTAP_PASSPHRASE));
+                                       strlen(CONFIG_EXAMPLES_TESTCASE_WIFI_MANAGER_UTC_SOFTAP_PASSPHRASE) + 1);
        ret = wifi_manager_set_mode(SOFTAP_MODE, &ap_config);
 
        TC_ASSERT_EQ("wifi_manager_get_mode_p", ret, WIFI_MANAGER_SUCCESS);
@@ -236,8 +236,8 @@ static void utc_wifi_manager_connect_ap_n(void)
        wifi_manager_ap_config_s config;
        config.ssid_length = strlen(CONFIG_EXAMPLES_TESTCASE_WIFI_MANAGER_UTC_SSID);
        config.passphrase_length = strlen(CONFIG_EXAMPLES_TESTCASE_WIFI_MANAGER_UTC_PASSPHRASE);
-       strncpy(config.ssid, CONFIG_EXAMPLES_TESTCASE_WIFI_MANAGER_UTC_SSID, config.ssid_length);
-       strncpy(config.passphrase, CONFIG_EXAMPLES_TESTCASE_WIFI_MANAGER_UTC_PASSPHRASE, config.passphrase_length);
+       strncpy(config.ssid, CONFIG_EXAMPLES_TESTCASE_WIFI_MANAGER_UTC_SSID, config.ssid_length + 1);
+       strncpy(config.passphrase, CONFIG_EXAMPLES_TESTCASE_WIFI_MANAGER_UTC_PASSPHRASE, config.passphrase_length + 1);
        config.ap_auth_type = (wifi_manager_ap_auth_type_e)CONFIG_EXAMPLES_TESTCASE_WIFI_MANAGER_UTC_AUTHENTICATION;
        config.ap_crypto_type = (wifi_manager_ap_crypto_type_e)CONFIG_EXAMPLES_TESTCASE_WIFI_MANAGER_UTC_CRYPTO;
 
@@ -263,8 +263,8 @@ static void utc_wifi_manager_connect_ap_p(void)
        wifi_manager_ap_config_s config;
        config.ssid_length = strlen(CONFIG_EXAMPLES_TESTCASE_WIFI_MANAGER_UTC_SSID);
        config.passphrase_length = strlen(CONFIG_EXAMPLES_TESTCASE_WIFI_MANAGER_UTC_PASSPHRASE);
-       strncpy(config.ssid, CONFIG_EXAMPLES_TESTCASE_WIFI_MANAGER_UTC_SSID, config.ssid_length);
-       strncpy(config.passphrase, CONFIG_EXAMPLES_TESTCASE_WIFI_MANAGER_UTC_PASSPHRASE, config.passphrase_length);
+       strncpy(config.ssid, CONFIG_EXAMPLES_TESTCASE_WIFI_MANAGER_UTC_SSID, config.ssid_length + 1);
+       strncpy(config.passphrase, CONFIG_EXAMPLES_TESTCASE_WIFI_MANAGER_UTC_PASSPHRASE, config.passphrase_length + 1);
        config.ap_auth_type = (wifi_manager_ap_auth_type_e)CONFIG_EXAMPLES_TESTCASE_WIFI_MANAGER_UTC_AUTHENTICATION;
        config.ap_crypto_type = (wifi_manager_ap_crypto_type_e)CONFIG_EXAMPLES_TESTCASE_WIFI_MANAGER_UTC_CRYPTO;
        printf("AP config: %s(%d), %s(%d), %d %d\n", config.ssid, config.ssid_length, config.passphrase, config.passphrase_length, config.ap_auth_type, config.ap_crypto_type);
@@ -406,6 +406,18 @@ int main(int argc, FAR char *argv[])
 int utc_wifi_manager_main(int argc, char *argv[])
 #endif
 {
+
+       int ssid_len = strlen(CONFIG_EXAMPLES_TESTCASE_WIFI_MANAGER_UTC_SSID);
+       int passphrase_len = strlen(CONFIG_EXAMPLES_TESTCASE_WIFI_MANAGER_UTC_PASSPHRASE);
+       int softap_ssid_len =   strlen(CONFIG_EXAMPLES_TESTCASE_WIFI_MANAGER_UTC_SOFTAP_SSID);
+       int softap_passphrase_len = strlen(CONFIG_EXAMPLES_TESTCASE_WIFI_MANAGER_UTC_SOFTAP_PASSPHRASE);
+
+       if ((ssid_len > 31) || (softap_ssid_len > 31) || (passphrase_len > 63) || (softap_passphrase_len > 63)) {
+               printf("AP or SoftAP configuration fails: too long ssid or passphrase\n");
+               printf("Make sure that length of SSID < 32 and length of passphrase < 64\n");
+               return -1;
+       }
+
        int res = wifi_test_signal_init();
        if (res < 0) {
                return -1;
index cff228b..2088f32 100644 (file)
@@ -200,14 +200,18 @@ int wifi_test_proc(int argc, char *argv[])
                 * handle appropriately
                 */
 
-               memset(buf, 0, BUF_MAX_SIZE);
                memset(payload, 0, BUF_MAX_SIZE);
 
                printScanResult(scan_info);
-               snprintf(payload, BUF_MAX_SIZE, "/%s|", DEVICE_NAME);
+               snprintf(payload, BUF_MAX_SIZE - 1, "/%s|", DEVICE_NAME);
                for (i = 0; i < aps_cnt; i++) {
-                       sprintf(buf, "%02d:%d/", g_aps[i].id, g_aps[i].rssi);
-                       strncat(payload, buf, strlen(buf));
+                       memset(buf, 0, BUF_MAX_SIZE);
+                       snprintf(buf, BUF_MAX_SIZE - 1, "%02d:%d/", g_aps[i].id, g_aps[i].rssi);
+                       if (BUF_MAX_SIZE - strlen(payload) > strlen(buf)) {
+                               strncat(payload, buf, strlen(buf) + 1);
+                       } else {
+                               break;
+                       }
                }
                printf("[WiFi] PAYLOAD : %s\n", payload);
                if (sendto(fd, payload, strlen(payload), 0, (struct sockaddr *)&dest, sizeof(struct sockaddr_in)) == -1) {