 0f6fb05d91
			
		
	
	
		0f6fb05d91
		
	
	
	
	
		
			
			For some reason, a potential OOM in hostapd_config_read_wpa_psk() and hostapd_derive_psk() were missed in --codecov runs during the main iteration loop. Cover these specific cases with separate instances to avoid missing coverage. Signed-off-by: Jouni Malinen <j@w1.fi>
		
			
				
	
	
		
			174 lines
		
	
	
	
		
			6.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			174 lines
		
	
	
	
		
			6.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| # hostapd and out-of-memory error paths
 | |
| # Copyright (c) 2015, Jouni Malinen
 | |
| #
 | |
| # This software may be distributed under the terms of the BSD license.
 | |
| # See README for more details.
 | |
| 
 | |
| from remotehost import remote_compatible
 | |
| import logging
 | |
| logger = logging.getLogger()
 | |
| import time
 | |
| 
 | |
| import hostapd
 | |
| from utils import HwsimSkip
 | |
| 
 | |
| def hostapd_oom_loop(apdev, params, start_func="main"):
 | |
|     hapd = hostapd.add_ap(apdev[0], { "ssid": "ctrl" })
 | |
| 
 | |
|     count = 0
 | |
|     for i in range(1, 1000):
 | |
|         if "OK" not in hapd.request("TEST_ALLOC_FAIL %d:%s" % (i, start_func)):
 | |
|             raise HwsimSkip("TEST_ALLOC_FAIL not supported")
 | |
|         try:
 | |
|             hostapd.add_ap(apdev[1], params, timeout=2.5)
 | |
|             logger.info("Iteration %d - success" % i)
 | |
|             hostapd.remove_bss(apdev[1])
 | |
| 
 | |
|             state = hapd.request('GET_ALLOC_FAIL')
 | |
|             logger.info("GET_ALLOC_FAIL: " + state)
 | |
|             hapd.request("TEST_ALLOC_FAIL 0:")
 | |
|             if i < 3:
 | |
|                 raise Exception("AP setup succeeded during out-of-memory")
 | |
|             if state.startswith('0:'):
 | |
|                 count = 0
 | |
|             else:
 | |
|                 count += 1
 | |
|                 if count == 5:
 | |
|                     break
 | |
|         except Exception, e:
 | |
|             logger.info("Iteration %d - %s" % (i, str(e)))
 | |
| 
 | |
| @remote_compatible
 | |
| def test_hostapd_oom_open(dev, apdev):
 | |
|     """hostapd failing to setup open mode due to OOM"""
 | |
|     params = { "ssid": "open" }
 | |
|     hostapd_oom_loop(apdev, params)
 | |
| 
 | |
| def test_hostapd_oom_wpa2_psk(dev, apdev):
 | |
|     """hostapd failing to setup WPA2-PSK mode due to OOM"""
 | |
|     params = hostapd.wpa2_params(ssid="test", passphrase="12345678")
 | |
|     params['wpa_psk_file'] = 'hostapd.wpa_psk'
 | |
|     hostapd_oom_loop(apdev, params)
 | |
| 
 | |
|     tests = [ "hostapd_config_read_wpa_psk", "hostapd_derive_psk" ]
 | |
|     for t in tests:
 | |
|         hapd = hostapd.add_ap(apdev[0], { "ssid": "ctrl" })
 | |
|         hapd.request("TEST_ALLOC_FAIL 1:%s" % t)
 | |
|         try:
 | |
|             hostapd.add_ap(apdev[1], params, timeout=2.5)
 | |
|             raise Exception("Unexpected add_ap() success during OOM")
 | |
|         except Exception, e:
 | |
|             if "Failed to enable hostapd" in str(e):
 | |
|                 pass
 | |
|             else:
 | |
|                 raise
 | |
|         state = hapd.request('GET_ALLOC_FAIL')
 | |
|         if state != "0:%s" % t:
 | |
|             raise Exception("OOM not triggered")
 | |
| 
 | |
| @remote_compatible
 | |
| def test_hostapd_oom_wpa2_eap(dev, apdev):
 | |
|     """hostapd failing to setup WPA2-EAP mode due to OOM"""
 | |
|     params = hostapd.wpa2_eap_params(ssid="test")
 | |
|     params['acct_server_addr'] = "127.0.0.1"
 | |
|     params['acct_server_port'] = "1813"
 | |
|     params['acct_server_shared_secret'] = "radius"
 | |
|     hostapd_oom_loop(apdev, params)
 | |
| 
 | |
| @remote_compatible
 | |
| def test_hostapd_oom_wpa2_eap_radius(dev, apdev):
 | |
|     """hostapd failing to setup WPA2-EAP mode due to OOM in RADIUS"""
 | |
|     params = hostapd.wpa2_eap_params(ssid="test")
 | |
|     params['acct_server_addr'] = "127.0.0.1"
 | |
|     params['acct_server_port'] = "1813"
 | |
|     params['acct_server_shared_secret'] = "radius"
 | |
|     hostapd_oom_loop(apdev, params, start_func="accounting_init")
 | |
| 
 | |
| def test_hostapd_oom_wpa2_psk_connect(dev, apdev):
 | |
|     """hostapd failing during WPA2-PSK mode connection due to OOM"""
 | |
|     params = hostapd.wpa2_params(ssid="test-wpa2-psk", passphrase="12345678")
 | |
|     hapd = hostapd.add_ap(apdev[0], params)
 | |
| 
 | |
|     dev[0].request("SCAN_INTERVAL 1")
 | |
|     count = 0
 | |
|     for i in range(1, 1000):
 | |
|         logger.info("Iteration %d" % i)
 | |
|         if "OK" not in hapd.request("TEST_ALLOC_FAIL %d:main" % i):
 | |
|             raise HwsimSkip("TEST_ALLOC_FAIL not supported")
 | |
|         id = dev[0].connect("test-wpa2-psk", psk="12345678",
 | |
|                             scan_freq="2412", wait_connect=False)
 | |
|         ev = dev[0].wait_event(["CTRL-EVENT-CONNECTED",
 | |
|                                 "CTRL-EVENT-SSID-TEMP-DISABLED"], timeout=5)
 | |
|         if ev is None:
 | |
|             logger.info("Timeout while waiting for connection in iteration %d" % i)
 | |
|             dev[0].request("REMOVE_NETWORK all")
 | |
|             time.sleep(0.1)
 | |
|         else:
 | |
|             if "CTRL-EVENT-SSID-TEMP-DISABLED" in ev:
 | |
|                 logger.info("Re-select to avoid long wait for temp disavle")
 | |
|                 dev[0].select_network(id)
 | |
|                 dev[0].wait_connected()
 | |
|             dev[0].request("REMOVE_NETWORK all")
 | |
|             dev[0].wait_disconnected()
 | |
|         for i in range(3):
 | |
|             dev[i].dump_monitor()
 | |
|         hapd.dump_monitor()
 | |
| 
 | |
|         state = hapd.request('GET_ALLOC_FAIL')
 | |
|         logger.info("GET_ALLOC_FAIL: " + state)
 | |
|         hapd.request("TEST_ALLOC_FAIL 0:")
 | |
|         if state.startswith('0:'):
 | |
|             count = 0
 | |
|         else:
 | |
|             count += 1
 | |
|             if count == 5:
 | |
|                 break
 | |
|     dev[0].request("SCAN_INTERVAL 5")
 | |
| 
 | |
| def test_hostapd_oom_wpa2_eap_connect(dev, apdev, params):
 | |
|     """hostapd failing during WPA2-EAP mode connection due to OOM"""
 | |
|     if not params['long']:
 | |
|         raise HwsimSkip("Skip test case with long duration due to --long not specified")
 | |
|     params = hostapd.wpa2_eap_params(ssid="test-wpa2-eap")
 | |
|     params['acct_server_addr'] = "127.0.0.1"
 | |
|     params['acct_server_port'] = "1813"
 | |
|     params['acct_server_shared_secret'] = "radius"
 | |
|     hapd = hostapd.add_ap(apdev[0], params)
 | |
| 
 | |
|     dev[0].request("SCAN_INTERVAL 1")
 | |
|     count = 0
 | |
|     for i in range(1, 1000):
 | |
|         logger.info("Iteration %d" % i)
 | |
|         if "OK" not in hapd.request("TEST_ALLOC_FAIL %d:main" % i):
 | |
|             raise HwsimSkip("TEST_ALLOC_FAIL not supported")
 | |
|         id = dev[0].connect("test-wpa2-eap", key_mgmt="WPA-EAP",
 | |
|                             eap="GPSK", identity="gpsk user",
 | |
|                             password="abcdefghijklmnop0123456789abcdef",
 | |
|                             scan_freq="2412", wait_connect=False)
 | |
|         ev = dev[0].wait_event(["CTRL-EVENT-CONNECTED",
 | |
|                                 "CTRL-EVENT-SSID-TEMP-DISABLED"], timeout=5)
 | |
|         if ev is None:
 | |
|             logger.info("Timeout while waiting for connection in iteration %d" % i)
 | |
|             dev[0].request("REMOVE_NETWORK all")
 | |
|             time.sleep(0.1)
 | |
|         else:
 | |
|             if "CTRL-EVENT-SSID-TEMP-DISABLED" in ev:
 | |
|                 logger.info("Re-select to avoid long wait for temp disavle")
 | |
|                 dev[0].select_network(id)
 | |
|                 dev[0].wait_connected()
 | |
|             dev[0].request("REMOVE_NETWORK all")
 | |
|             dev[0].wait_disconnected()
 | |
|         for i in range(3):
 | |
|             dev[i].dump_monitor()
 | |
|         hapd.dump_monitor()
 | |
| 
 | |
|         state = hapd.request('GET_ALLOC_FAIL')
 | |
|         logger.info("GET_ALLOC_FAIL: " + state)
 | |
|         hapd.request("TEST_ALLOC_FAIL 0:")
 | |
|         if state.startswith('0:'):
 | |
|             count = 0
 | |
|         else:
 | |
|             count += 1
 | |
|             if count == 5:
 | |
|                 break
 | |
|     dev[0].request("SCAN_INTERVAL 5")
 |