vfs301: Fix error handling on peeking events

This commit is contained in:
Marco Trevisan (Treviño)
2026-07-13 08:13:46 +00:00
committed by Marco Trevisan
parent 98891dc042
commit 7f9504afd5
3 changed files with 25 additions and 14 deletions
+8 -1
View File
@@ -85,6 +85,7 @@ enum {
static void static void
m_loop_state (FpiSsm *ssm, FpDevice *_dev) m_loop_state (FpiSsm *ssm, FpDevice *_dev)
{ {
g_autoptr(GError) error = NULL;
FpImageDevice *dev = FP_IMAGE_DEVICE (_dev); FpImageDevice *dev = FP_IMAGE_DEVICE (_dev);
FpDeviceVfs301 *self = FPI_DEVICE_VFS301 (_dev); FpDeviceVfs301 *self = FPI_DEVICE_VFS301 (_dev);
@@ -101,10 +102,16 @@ m_loop_state (FpiSsm *ssm, FpDevice *_dev)
break; break;
case M_CHECK_PRINT: case M_CHECK_PRINT:
if (!vfs301_proto_peek_event (self)) {
int rv = vfs301_proto_peek_event (self, &error);
if (rv == VFS301_FAILURE)
fpi_ssm_mark_failed (ssm, error);
else if (rv == VFS301_ONGOING)
fpi_ssm_jump_to_state (ssm, M_WAIT_PRINT); fpi_ssm_jump_to_state (ssm, M_WAIT_PRINT);
else else
fpi_ssm_next_state (ssm); fpi_ssm_next_state (ssm);
}
break; break;
case M_READ_PRINT_START: case M_READ_PRINT_START:
+2 -1
View File
@@ -133,7 +133,8 @@ void vfs301_proto_deinit (FpDeviceVfs301 *dev);
void vfs301_proto_request_fingerprint (FpDeviceVfs301 *dev); void vfs301_proto_request_fingerprint (FpDeviceVfs301 *dev);
/** returns 0 if no event is ready, or 1 if there is one... */ /** returns 0 if no event is ready, or 1 if there is one... */
int vfs301_proto_peek_event (FpDeviceVfs301 *dev); int vfs301_proto_peek_event (FpDeviceVfs301 *dev,
GError **error);
void vfs301_proto_process_event_start (FpDeviceVfs301 *dev); void vfs301_proto_process_event_start (FpDeviceVfs301 *dev);
int vfs301_proto_process_event_poll (FpDeviceVfs301 *dev); int vfs301_proto_process_event_poll (FpDeviceVfs301 *dev);
+12 -9
View File
@@ -63,7 +63,7 @@ usb_print_packet (int dir, GError *error, const guint8 *data, int length)
} }
#endif #endif
static void static gboolean
usb_recv (FpDeviceVfs301 *dev, guint8 endpoint, int max_bytes, FpiUsbTransfer **out, GError **error) usb_recv (FpDeviceVfs301 *dev, guint8 endpoint, int max_bytes, FpiUsbTransfer **out, GError **error)
{ {
GError *err = NULL; GError *err = NULL;
@@ -87,10 +87,14 @@ usb_recv (FpDeviceVfs301 *dev, guint8 endpoint, int max_bytes, FpiUsbTransfer **
if (!error) if (!error)
g_warning ("Unhandled receive error: %s", err->message); g_warning ("Unhandled receive error: %s", err->message);
g_propagate_error (error, err); g_propagate_error (error, err);
return FALSE;
} }
if (out) if (out)
*out = g_steal_pointer (&transfer); *out = g_steal_pointer (&transfer);
return TRUE;
} }
FP_GNUC_ACCESS (read_only, 2, 3) FP_GNUC_ACCESS (read_only, 2, 3)
@@ -462,26 +466,25 @@ vfs301_proto_request_fingerprint (FpDeviceVfs301 *dev)
} }
int int
vfs301_proto_peek_event (FpDeviceVfs301 *dev) vfs301_proto_peek_event (FpDeviceVfs301 *dev,
GError **error)
{ {
g_autoptr(GError) error = NULL;
g_autoptr(FpiUsbTransfer) transfer = NULL; g_autoptr(FpiUsbTransfer) transfer = NULL;
const char no_event[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; const char no_event[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
const char got_event[] = {0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00}; const char got_event[] = {0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00};
USB_SEND (0x17, -1); USB_SEND (0x17, -1);
usb_recv (dev, VFS301_RECEIVE_ENDPOINT_CTRL, 7, &transfer, &error); if (!usb_recv (dev, VFS301_RECEIVE_ENDPOINT_CTRL, 7, &transfer, error))
return -1;
/* XXX: This is obviously not a sane error handling! */
g_assert (!error);
if (memcmp (transfer->buffer, no_event, sizeof (no_event)) == 0) if (memcmp (transfer->buffer, no_event, sizeof (no_event)) == 0)
return 0; return 0;
else if (memcmp (transfer->buffer, got_event, sizeof (no_event)) == 0) else if (memcmp (transfer->buffer, got_event, sizeof (no_event)) == 0)
return 1; return 1;
else
g_assert_not_reached (); g_set_error (error, FP_DEVICE_ERROR_PROTO, 0, "Unexpected event response");
return -1;
} }
/* XXX: We sometimes need to receive data on from two endpoints at the same /* XXX: We sometimes need to receive data on from two endpoints at the same