mirror of
https://gitea.osmocom.org/sim-card/simtrace2.git
synced 2026-03-16 21:28:33 +03:00
dispatch_usb_command: Ensure list consistency + avoid mem leaks
When iterating over the queue of req_ctx, make sure to unlink each buffer before processing it. And during processing, ensure all buffers are reelased back to the memory management.
This commit is contained in:
@@ -305,7 +305,6 @@ static void dispatch_usb_command(struct req_ctx *rctx, struct cardem_inst *ci)
|
|||||||
case CEMU_USB_MSGT_DT_SET_ATR:
|
case CEMU_USB_MSGT_DT_SET_ATR:
|
||||||
atr = (struct cardemu_usb_msg_set_atr *) hdr;
|
atr = (struct cardemu_usb_msg_set_atr *) hdr;
|
||||||
card_emu_set_atr(ci->ch, atr->atr, hdr->data_len);
|
card_emu_set_atr(ci->ch, atr->atr, hdr->data_len);
|
||||||
llist_del(&rctx->list);
|
|
||||||
req_ctx_put(rctx);
|
req_ctx_put(rctx);
|
||||||
break;
|
break;
|
||||||
case CEMU_USB_MSGT_DT_CARDINSERT:
|
case CEMU_USB_MSGT_DT_CARDINSERT:
|
||||||
@@ -314,11 +313,13 @@ static void dispatch_usb_command(struct req_ctx *rctx, struct cardem_inst *ci)
|
|||||||
PIO_Set(&ci->pin_insert);
|
PIO_Set(&ci->pin_insert);
|
||||||
else
|
else
|
||||||
PIO_Clear(&ci->pin_insert);
|
PIO_Clear(&ci->pin_insert);
|
||||||
|
req_ctx_put(rctx);
|
||||||
break;
|
break;
|
||||||
case CEMU_USB_MSGT_DT_GET_STATS:
|
case CEMU_USB_MSGT_DT_GET_STATS:
|
||||||
case CEMU_USB_MSGT_DT_GET_STATUS:
|
case CEMU_USB_MSGT_DT_GET_STATUS:
|
||||||
default:
|
default:
|
||||||
/* FIXME */
|
/* FIXME */
|
||||||
|
req_ctx_put(rctx);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -329,8 +330,10 @@ static void process_any_usb_commands(struct llist_head *main_q, struct cardem_in
|
|||||||
{
|
{
|
||||||
struct req_ctx *rctx, *tmp;
|
struct req_ctx *rctx, *tmp;
|
||||||
|
|
||||||
llist_for_each_entry_safe(rctx, tmp, main_q, list)
|
llist_for_each_entry_safe(rctx, tmp, main_q, list) {
|
||||||
|
llist_del(&rctx->list);
|
||||||
dispatch_usb_command(rctx, ci);
|
dispatch_usb_command(rctx, ci);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* main loop function, called repeatedly */
|
/* main loop function, called repeatedly */
|
||||||
|
|||||||
Reference in New Issue
Block a user