diff --git a/drivers/char/diag/diagfwd_glink.c b/drivers/char/diag/diagfwd_glink.c index 42182e3a939d..f1f8f0b2b34b 100644 --- a/drivers/char/diag/diagfwd_glink.c +++ b/drivers/char/diag/diagfwd_glink.c @@ -375,8 +375,10 @@ static void diag_glink_notify_rx_work_fn(struct work_struct *work) struct diag_glink_read_work, work); struct diag_glink_info *glink_info = read_work->glink_info; - if (!glink_info || !glink_info->hdl) + if (!glink_info || !glink_info->hdl) { + kfree(read_work); return; + } diagfwd_channel_read_done(glink_info->fwd_ctxt, (unsigned char *)(read_work->ptr_read_done), @@ -388,6 +390,7 @@ static void diag_glink_notify_rx_work_fn(struct work_struct *work) "diag: Rx done for packet %pK of len: %d periph: %d ch: %d\n", read_work->ptr_rx_done, (int)read_work->ptr_read_size, glink_info->peripheral, glink_info->type); + kfree(read_work); } static void diag_glink_notify_rx(void *hdl, const void *priv, @@ -411,6 +414,7 @@ static void diag_glink_notify_rx(void *hdl, const void *priv, if (!read_work) { DIAG_LOG(DIAG_DEBUG_PERIPHERALS, "diag: Could not allocate read_work\n"); + glink_rx_done(glink_info->hdl, ptr, true); return; }