mirror of
https://github.com/shadps4-emu/ext-libusb.git
synced 2026-01-31 00:55:21 +01:00
Don't pass ctrl_msg/bulk_msg structures through async paths
These are easiest to construct on the stack, but in the async case it is likely that the submitting function returns (hence stack is destroyed) before URB completion.
This commit is contained in:
@@ -205,8 +205,8 @@ static int set_mode(unsigned char data)
|
||||
}
|
||||
|
||||
static void cb_mode_changed(struct fpusb_dev_handle *_devh,
|
||||
struct fpusb_urb_handle *urbh, struct fpusb_ctrl_msg *msg,
|
||||
enum fp_urb_cb_status status, unsigned char *data, int actual_length,
|
||||
struct fpusb_urb_handle *urbh, enum fp_urb_cb_status status,
|
||||
struct usb_ctrl_setup *setup, unsigned char *data, int actual_length,
|
||||
void *user_data)
|
||||
{
|
||||
if (status != FP_URB_COMPLETED) {
|
||||
@@ -336,10 +336,10 @@ static int next_state(void)
|
||||
}
|
||||
|
||||
static void cb_irq(fpusb_dev_handle *_devh, fpusb_urb_handle *urbh,
|
||||
struct fpusb_bulk_msg *msg, enum fp_urb_cb_status status,
|
||||
int actual_length, void *user_data)
|
||||
enum fp_urb_cb_status status, unsigned char endpoint, int rqlength,
|
||||
unsigned char *data, int actual_length, void *user_data)
|
||||
{
|
||||
unsigned char irqtype = msg->data[0];
|
||||
unsigned char irqtype = data[0];
|
||||
|
||||
if (status != FP_URB_COMPLETED) {
|
||||
fprintf(stderr, "irq URB status %d?\n", status);
|
||||
@@ -375,8 +375,8 @@ static void cb_irq(fpusb_dev_handle *_devh, fpusb_urb_handle *urbh,
|
||||
}
|
||||
|
||||
static void cb_img(fpusb_dev_handle *_devh, fpusb_urb_handle *urbh,
|
||||
struct fpusb_bulk_msg *msg, enum fp_urb_cb_status status,
|
||||
int actual_length, void *user_data)
|
||||
enum fp_urb_cb_status status, unsigned char endpoint, int rqlength,
|
||||
unsigned char *data, int actual_length, void *user_data)
|
||||
{
|
||||
if (status != FP_URB_COMPLETED) {
|
||||
fprintf(stderr, "img URB status %d?\n", status);
|
||||
|
||||
@@ -165,6 +165,16 @@ struct usb_config_descriptor {
|
||||
int extralen;
|
||||
};
|
||||
|
||||
/* off-the-wire structures */
|
||||
|
||||
struct usb_ctrl_setup {
|
||||
uint8_t bRequestType;
|
||||
uint8_t bRequest;
|
||||
uint16_t wValue;
|
||||
uint16_t wIndex;
|
||||
uint16_t wLength;
|
||||
} __attribute__((packed));
|
||||
|
||||
/* fpusb */
|
||||
|
||||
struct fpusb_dev;
|
||||
@@ -193,7 +203,7 @@ struct fpusb_ctrl_msg {
|
||||
};
|
||||
|
||||
typedef void (*fpusb_ctrl_cb_fn)(fpusb_dev_handle *devh, fpusb_urb_handle *urbh,
|
||||
struct fpusb_ctrl_msg *msg, enum fp_urb_cb_status status,
|
||||
enum fp_urb_cb_status status, struct usb_ctrl_setup *setup,
|
||||
unsigned char *data, int actual_length, void *user_data);
|
||||
|
||||
struct fpusb_bulk_msg {
|
||||
@@ -203,8 +213,8 @@ struct fpusb_bulk_msg {
|
||||
};
|
||||
|
||||
typedef void (*fpusb_bulk_cb_fn)(fpusb_dev_handle *devh, fpusb_urb_handle *urbh,
|
||||
struct fpusb_bulk_msg *msg, enum fp_urb_cb_status status,
|
||||
int actual_length, void *user_data);
|
||||
enum fp_urb_cb_status status, unsigned char endpoint,
|
||||
int rqlength, unsigned char *data, int actual_length, void *user_data);
|
||||
|
||||
int fpusb_init(int signum);
|
||||
void fpusb_exit(void);
|
||||
|
||||
@@ -175,7 +175,6 @@ struct fpusb_urb_handle {
|
||||
timer_t timer;
|
||||
unsigned char urb_type;
|
||||
unsigned char endpoint;
|
||||
void *msg;
|
||||
int transfer_len;
|
||||
int transferred;
|
||||
unsigned char *buffer;
|
||||
@@ -186,14 +185,6 @@ struct fpusb_urb_handle {
|
||||
|
||||
/* bus structures */
|
||||
|
||||
struct usb_ctrl_setup {
|
||||
uint8_t bRequestType;
|
||||
uint8_t bRequest;
|
||||
uint16_t wValue;
|
||||
uint16_t wIndex;
|
||||
uint16_t wLength;
|
||||
} __attribute__((packed));
|
||||
|
||||
/* All standard descriptors have these 2 fields in common */
|
||||
struct usb_descriptor_header {
|
||||
uint8_t bLength;
|
||||
|
||||
@@ -240,7 +240,6 @@ API_EXPORTED struct fpusb_urb_handle *fpusb_submit_ctrl_msg(
|
||||
memcpy(urbdata + sizeof(struct usb_ctrl_setup), msg->data, msg->length);
|
||||
|
||||
urbh->urb_type = USB_URB_TYPE_CONTROL;
|
||||
urbh->msg = msg;
|
||||
urbh->buffer = urbdata;
|
||||
urbh->transfer_len = urbdata_length;
|
||||
|
||||
@@ -275,7 +274,6 @@ static struct fpusb_urb_handle *submit_bulk_msg(struct fpusb_dev_handle *devh,
|
||||
urbh->callback = callback;
|
||||
urbh->user_data = user_data;
|
||||
urbh->flags |= FPUSB_URBH_DATA_BELONGS_TO_USER;
|
||||
urbh->msg = msg;
|
||||
urbh->endpoint = msg->endpoint;
|
||||
urbh->urb_type = urbtype;
|
||||
urbh->buffer = msg->data;
|
||||
@@ -352,15 +350,15 @@ int handle_transfer_completion(struct fpusb_dev_handle *devh,
|
||||
if (urb->type == USB_URB_TYPE_CONTROL) {
|
||||
fpusb_ctrl_cb_fn callback = urbh->callback;
|
||||
if (callback)
|
||||
callback(devh, urbh, urbh->msg, status,
|
||||
callback(devh, urbh, status, urb->buffer,
|
||||
urb->buffer + sizeof(struct usb_ctrl_setup), urbh->transferred,
|
||||
urbh->user_data);
|
||||
} else if (urb->type == USB_URB_TYPE_BULK ||
|
||||
urb->type == USB_URB_TYPE_INTERRUPT) {
|
||||
fpusb_bulk_cb_fn callback = urbh->callback;
|
||||
if (callback)
|
||||
callback(devh, urbh, urbh->msg, status, urbh->transferred,
|
||||
urbh->user_data);
|
||||
callback(devh, urbh, status, urbh->endpoint, urbh->transfer_len,
|
||||
urbh->buffer, urbh->transferred, urbh->user_data);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -570,8 +568,8 @@ struct sync_ctrl_handle {
|
||||
};
|
||||
|
||||
static void ctrl_msg_cb(struct fpusb_dev_handle *devh,
|
||||
struct fpusb_urb_handle *urbh, struct fpusb_ctrl_msg *msg,
|
||||
enum fp_urb_cb_status status, unsigned char *data, int actual_length,
|
||||
struct fpusb_urb_handle *urbh, enum fp_urb_cb_status status,
|
||||
struct usb_ctrl_setup *setup, unsigned char *data, int actual_length,
|
||||
void *user_data)
|
||||
{
|
||||
struct sync_ctrl_handle *ctrlh = (struct sync_ctrl_handle *) user_data;
|
||||
@@ -579,7 +577,7 @@ static void ctrl_msg_cb(struct fpusb_dev_handle *devh,
|
||||
|
||||
if (status == FP_URB_COMPLETED) {
|
||||
/* copy results into user-defined buffer */
|
||||
if (msg->requesttype & USB_ENDPOINT_IN)
|
||||
if (setup->bRequestType & USB_ENDPOINT_IN)
|
||||
memcpy(ctrlh->data, data, actual_length);
|
||||
}
|
||||
|
||||
@@ -628,8 +626,9 @@ struct sync_bulk_handle {
|
||||
};
|
||||
|
||||
static void bulk_msg_cb(struct fpusb_dev_handle *devh,
|
||||
struct fpusb_urb_handle *urbh, struct fpusb_bulk_msg *msg,
|
||||
enum fp_urb_cb_status status, int actual_length, void *user_data)
|
||||
struct fpusb_urb_handle *urbh, enum fp_urb_cb_status status,
|
||||
unsigned char endpoint, int rqlength, unsigned char *data,
|
||||
int actual_length, void *user_data)
|
||||
{
|
||||
struct sync_bulk_handle *bulkh = (struct sync_bulk_handle *) user_data;
|
||||
fp_dbg("");
|
||||
|
||||
Reference in New Issue
Block a user