diff --git a/src/libei-device.c b/src/libei-device.c index 8de8c4f..527c20c 100644 --- a/src/libei-device.c +++ b/src/libei-device.c @@ -277,6 +277,8 @@ handle_msg_paused(struct ei_device *device) static struct brei_result * handle_msg_start_emulating(struct ei_device *device, uint32_t sequence) { + struct brei_result *result = NULL; + DISCONNECT_IF_SENDER_CONTEXT(device); switch (device->state) { @@ -284,22 +286,27 @@ handle_msg_start_emulating(struct ei_device *device, uint32_t sequence) case EI_DEVICE_STATE_NEW: case EI_DEVICE_STATE_PAUSED: case EI_DEVICE_STATE_EMULATING: + case EI_DEVICE_STATE_REMOVED_FROM_SERVER: + result = brei_result_new(EI_CONNECTION_DISCONNECT_REASON_PROTOCOL, + "Invalid device state %ud for a start_emulating event", device->state); break; case EI_DEVICE_STATE_RESUMED: ei_queue_device_start_emulating_event(device, sequence); device->state = EI_DEVICE_STATE_EMULATING; break; case EI_DEVICE_STATE_REMOVED_FROM_CLIENT: - case EI_DEVICE_STATE_REMOVED_FROM_SERVER: + /* race condition, that's fine */ break; } - return NULL; + return result; } static struct brei_result * handle_msg_stop_emulating(struct ei_device *device) { + struct brei_result *result = NULL; + DISCONNECT_IF_SENDER_CONTEXT(device); switch (device->state) { @@ -307,17 +314,20 @@ handle_msg_stop_emulating(struct ei_device *device) case EI_DEVICE_STATE_NEW: case EI_DEVICE_STATE_PAUSED: case EI_DEVICE_STATE_RESUMED: + case EI_DEVICE_STATE_REMOVED_FROM_SERVER: + result = brei_result_new(EI_CONNECTION_DISCONNECT_REASON_PROTOCOL, + "Invalid device state %ud for a stop_emulating event", device->state); break; case EI_DEVICE_STATE_EMULATING: ei_queue_device_stop_emulating_event(device); device->state = EI_DEVICE_STATE_RESUMED; break; case EI_DEVICE_STATE_REMOVED_FROM_CLIENT: - case EI_DEVICE_STATE_REMOVED_FROM_SERVER: + /* race condition, that's fine */ break; } - return NULL; + return result; } static struct brei_result *