All of lore.kernel.org
 help / color / mirror / Atom feed
From: Duoming Zhou <duoming@zju.edu.cn>
To: linux-kernel@vger.kernel.org
Cc: netdev@vger.kernel.org, isdn@linux-pingi.de, kuba@kernel.org,
	Duoming Zhou <duoming@zju.edu.cn>
Subject: [PATCH V3] mISDN: fix use-after-free bugs in l1oip timer handlers
Date: Sat, 24 Sep 2022 10:18:42 +0800	[thread overview]
Message-ID: <20220924021842.71754-1-duoming@zju.edu.cn> (raw)

The l1oip_cleanup() traverses the l1oip_ilist and calls
release_card() to cleanup module and stack. However,
release_card() calls del_timer() to delete the timers
such as keep_tl and timeout_tl. If the timer handler is
running, the del_timer() will not stop it and result in
UAF bugs. One of the processes is shown below:

    (cleanup routine)          |        (timer handler)
release_card()                 | l1oip_timeout()
 ...                           |
 del_timer()                   | ...
 ...                           |
 kfree(hc) //FREE              |
                               | hc->timeout_on = 0 //USE

Fix by calling del_timer_sync() in release_card(), which
makes sure the timer handlers have finished before the
resources, such as l1oip and so on, have been deallocated.

What's more, the hc->workq and hc->socket_thread can kick
those timers right back in. We use del_timer_sync(&hc->keep_tl)
and cancel_work_sync(&hc->workq) twice to stop keep_tl timer
and hc->workq. Then, we add del_timer_sync(&hc->timeout_tl)
inside l1oip_socket_close() to stop timeout_tl timer. Because
the hc->socket_thread has been killed and the timeout_tl timer
will not be rescheduled.

Fixes: 3712b42d4b1b ("Add layer1 over IP support")
Signed-off-by: Duoming Zhou <duoming@zju.edu.cn>
---
Changes in v3:
  - Make commit messages more clearer.
  - Add del_timer_sync(&hc->timeout_tl) inside l1oip_socket_close().

 drivers/isdn/mISDN/l1oip_core.c | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/drivers/isdn/mISDN/l1oip_core.c b/drivers/isdn/mISDN/l1oip_core.c
index 2c40412466e..5939f1d8f08 100644
--- a/drivers/isdn/mISDN/l1oip_core.c
+++ b/drivers/isdn/mISDN/l1oip_core.c
@@ -762,6 +762,8 @@ l1oip_socket_close(struct l1oip *hc)
 		wait_for_completion(&hc->socket_complete);
 	}
 
+	del_timer_sync(&hc->timeout_tl);
+
 	/* if active, we send up a PH_DEACTIVATE and deactivate */
 	if (test_bit(FLG_ACTIVE, &dch->Flags)) {
 		if (debug & (DEBUG_L1OIP_MSG | DEBUG_L1OIP_SOCKET))
@@ -1232,12 +1234,10 @@ release_card(struct l1oip *hc)
 {
 	int	ch;
 
-	if (timer_pending(&hc->keep_tl))
-		del_timer(&hc->keep_tl);
-
-	if (timer_pending(&hc->timeout_tl))
-		del_timer(&hc->timeout_tl);
-
+	del_timer_sync(&hc->keep_tl);
+	del_timer_sync(&hc->timeout_tl);
+	cancel_work_sync(&hc->workq);
+	del_timer_sync(&hc->keep_tl);
 	cancel_work_sync(&hc->workq);
 
 	if (hc->socket_thread)
-- 
2.17.1


             reply	other threads:[~2022-09-24  2:18 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-09-24  2:18 Duoming Zhou [this message]
2022-09-28  0:26 ` [PATCH V3] mISDN: fix use-after-free bugs in l1oip timer handlers Jakub Kicinski
2022-09-28 13:27   ` duoming

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20220924021842.71754-1-duoming@zju.edu.cn \
    --to=duoming@zju.edu.cn \
    --cc=isdn@linux-pingi.de \
    --cc=kuba@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=netdev@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.