diff options
Diffstat (limited to 'src/bt_packet_logger.c')
| -rw-r--r-- | src/bt_packet_logger.c | 33 | 
1 files changed, 14 insertions, 19 deletions
diff --git a/src/bt_packet_logger.c b/src/bt_packet_logger.c index 5391825..196039e 100644 --- a/src/bt_packet_logger.c +++ b/src/bt_packet_logger.c @@ -1,6 +1,6 @@  /*   * bt_packet_logger.c - * com.apple.bt_packet_logger service implementation. + * com.apple.bluetooth.BTPacketLogger service implementation.   *   * Copyright (c) 2021 Geoffrey Kruse, All Rights Reserved.   * @@ -28,13 +28,16 @@  #include "bt_packet_logger.h"  #include "lockdown.h"  #include "common/debug.h" -  struct bt_packet_logger_worker_thread {  	bt_packet_logger_client_t client;  	bt_packet_logger_receive_cb_t cbfunc;  	void *user_data; +	uint8_t rxbuff[BT_MAX_PACKET_SIZE];  }; +#define SZ_READ_TIMEOUT 100 +#define PAYLOAD_READ_TIMEOUT 500 +  /**   * Convert a service_error_t value to a bt_packet_logger_error_t value.   * Used internally to get correct error codes. @@ -67,8 +70,6 @@ static bt_packet_logger_error_t bt_packet_logger_error(service_error_t err)  LIBIMOBILEDEVICE_API bt_packet_logger_error_t bt_packet_logger_client_new(idevice_t device, lockdownd_service_descriptor_t service, bt_packet_logger_client_t * client)  { -	*client = NULL; -  	if (!device || !service || service->port == 0 || !client || *client) {  		debug_info("Incorrect parameter passed to bt_packet_logger_client_new.");  		return BT_PACKET_LOGGER_E_INVALID_ARG; @@ -111,11 +112,6 @@ LIBIMOBILEDEVICE_API bt_packet_logger_error_t bt_packet_logger_client_free(bt_pa  	return err;  } -LIBIMOBILEDEVICE_API bt_packet_logger_error_t bt_packet_logger_receive(bt_packet_logger_client_t client, char* data, uint32_t size, uint32_t *received) -{ -	return bt_packet_logger_receive_with_timeout(client, data, size, received, 1000); -} -  LIBIMOBILEDEVICE_API bt_packet_logger_error_t bt_packet_logger_receive_with_timeout(bt_packet_logger_client_t client, char* data, uint32_t size, uint32_t *received, unsigned int timeout)  {  	bt_packet_logger_error_t res = BT_PACKET_LOGGER_E_UNKNOWN_ERROR; @@ -141,8 +137,9 @@ void *bt_packet_logger_worker(void *arg)  	bt_packet_logger_error_t ret = BT_PACKET_LOGGER_E_UNKNOWN_ERROR;  	struct bt_packet_logger_worker_thread *btwt = (struct bt_packet_logger_worker_thread*)arg; -	if (!btwt) +	if (!btwt) {  		return NULL; +	}  	debug_info("Running"); @@ -150,7 +147,7 @@ void *bt_packet_logger_worker(void *arg)  		uint32_t bytes = 0;  		uint16_t len; -		ret = bt_packet_logger_receive_with_timeout(btwt->client, &len, 2, &bytes, 100); +		ret = bt_packet_logger_receive_with_timeout(btwt->client, (char*)&len, 2, &bytes, SZ_READ_TIMEOUT);  		if (ret == BT_PACKET_LOGGER_E_TIMEOUT || ret == BT_PACKET_LOGGER_E_NOT_ENOUGH_DATA || ((bytes == 0) && (ret == BT_PACKET_LOGGER_E_SUCCESS))) {  			continue; @@ -159,11 +156,10 @@ void *bt_packet_logger_worker(void *arg)  			break;  		} -		// todo remove magic and move "c" off stack -		if(bytes > 0 && len > 12) { -			char c[65535]; +		// sanity check received length +		if(bytes > 0 && len > sizeof(bt_packet_logger_header_t)) {  			debug_info("Reading %u bytes\n", len); -			ret = bt_packet_logger_receive_with_timeout(btwt->client, c, len, &bytes, 500); +			ret = bt_packet_logger_receive_with_timeout(btwt->client, (char *)btwt->rxbuff, len, &bytes, PAYLOAD_READ_TIMEOUT);  			if(len != bytes) {  				debug_info("Failed Read Expected %u, Received %u\n", len, bytes); @@ -177,13 +173,12 @@ void *bt_packet_logger_worker(void *arg)  				break;  			} -			btwt->cbfunc(c, len, btwt->user_data); +			btwt->cbfunc(btwt->rxbuff, len, btwt->user_data);  		}  	} -	if (btwt) { -		free(btwt); -	} +	// null check performed above +	free(btwt);  	debug_info("Exiting");  | 
