Received: by 2002:a05:6a10:1287:0:0:0:0 with SMTP id d7csp3672160pxv; Mon, 26 Jul 2021 09:07:38 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwn+AuPR2wQgg+ZfZ3xXtS1i+e5oEx/EZ0C7FczPIZNLqMJotKh+RSTKqF6cyuZGq9qb8YA X-Received: by 2002:a05:6e02:525:: with SMTP id h5mr13319775ils.205.1627315658301; Mon, 26 Jul 2021 09:07:38 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1627315658; cv=none; d=google.com; s=arc-20160816; b=t/L8FsI1RJwrZsXsEHambWL6Yck7jWjgFNohtJ+0ODVLb+GKqJpF5tsztL2Snc6++9 uIDixouffbqcV+LrzxGBwKlbrTXAhPh06bMSBaFmKxLA0XuuUsYnL4XoPsIk9d4DTNbh DAVUjtEZk1raoxo/6DeAOqYPBTJtbafC4ZAC45vHpOrv1hX6oM29tz6axYwPm0A2j+WN f3xMABPT5TaXT47YGk19tRpGkmbljx2IcRdnkurtdl9Zrv0FoXY+XKs852oRd7u1Sw0q ioPVqg/1EtPasi7xYC6E8pQDX1ZHggg3SLch3tZA3VcpZ9aisH5vePPJgiqFL+ub4vHk 5How== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=BXEOxoOTrQloHiSGIMoAd8Y3ln4Qgn8K1ohb8L29rfw=; b=j9Uxy8AyGCsdCH0ooZauWEttTBFv5sP/QdHfe+E7uSYF1WXx2kK7JLR9S02tj+ykBv NSfFwFmeINzAEFCD86NzSxWXT+a90wrjflOjfOHzWieBMf7w8guQAnvKwTAh2gPpLVk8 B1cv7KrRn7NASf7/wqAIfW1Doe012HzjwDZpPs0YgQ3pqTEsFBBoCyn0uPvr9lpKhZfB kRR5FFiAXvOXls8rejZdYUba/ZPhRlj5V4FvA32X237Fg4kZ8twmn+sQDe7YmrEH/ZWb XEBzcv44ql5e/9xSU4GGrqtMEbayQJ0RG+1/jdoWSeNH1A8R3sHoJQKyQe1kes8sud7p 3iCA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=iauOsQhy; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id i187si297155iof.20.2021.07.26.09.07.27; Mon, 26 Jul 2021 09:07:38 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=iauOsQhy; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S238017AbhGZPYd (ORCPT + 99 others); Mon, 26 Jul 2021 11:24:33 -0400 Received: from mail.kernel.org ([198.145.29.99]:53066 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236662AbhGZPMC (ORCPT ); Mon, 26 Jul 2021 11:12:02 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id A450C60F70; Mon, 26 Jul 2021 15:52:27 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1627314748; bh=2kahH2aTxnsqqtA5KrBCR2n8QnRwcIn/KQ7IdXkAS/g=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=iauOsQhyDei8/OU3squloMtYYQW1xXi/b8w27rBM1j96fnaAYgL6aAvag2Dn9JcW+ utnY6QQG8OzyPGfYNtQYndLvWeacCbL7iSajzCS8RlAfo0aLxqNUXMADjY5KAmXp5g YSKfPKjm9HDSQgn1BOr2deEeus58FK3C0aTgBPrk= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Nguyen Dinh Phi , syzbot+10f1194569953b72f1ae@syzkaller.appspotmail.com, "David S. Miller" , Sasha Levin Subject: [PATCH 4.19 078/120] netrom: Decrease sock refcount when sock timers expire Date: Mon, 26 Jul 2021 17:38:50 +0200 Message-Id: <20210726153834.894510264@linuxfoundation.org> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20210726153832.339431936@linuxfoundation.org> References: <20210726153832.339431936@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Nguyen Dinh Phi [ Upstream commit 517a16b1a88bdb6b530f48d5d153478b2552d9a8 ] Commit 63346650c1a9 ("netrom: switch to sock timer API") switched to use sock timer API. It replaces mod_timer() by sk_reset_timer(), and del_timer() by sk_stop_timer(). Function sk_reset_timer() will increase the refcount of sock if it is called on an inactive timer, hence, in case the timer expires, we need to decrease the refcount ourselves in the handler, otherwise, the sock refcount will be unbalanced and the sock will never be freed. Signed-off-by: Nguyen Dinh Phi Reported-by: syzbot+10f1194569953b72f1ae@syzkaller.appspotmail.com Fixes: 63346650c1a9 ("netrom: switch to sock timer API") Signed-off-by: David S. Miller Signed-off-by: Sasha Levin --- net/netrom/nr_timer.c | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/net/netrom/nr_timer.c b/net/netrom/nr_timer.c index 908e53ab47a4..426d49609524 100644 --- a/net/netrom/nr_timer.c +++ b/net/netrom/nr_timer.c @@ -124,11 +124,9 @@ static void nr_heartbeat_expiry(struct timer_list *t) is accepted() it isn't 'dead' so doesn't get removed. */ if (sock_flag(sk, SOCK_DESTROY) || (sk->sk_state == TCP_LISTEN && sock_flag(sk, SOCK_DEAD))) { - sock_hold(sk); bh_unlock_sock(sk); nr_destroy_socket(sk); - sock_put(sk); - return; + goto out; } break; @@ -149,6 +147,8 @@ static void nr_heartbeat_expiry(struct timer_list *t) nr_start_heartbeat(sk); bh_unlock_sock(sk); +out: + sock_put(sk); } static void nr_t2timer_expiry(struct timer_list *t) @@ -162,6 +162,7 @@ static void nr_t2timer_expiry(struct timer_list *t) nr_enquiry_response(sk); } bh_unlock_sock(sk); + sock_put(sk); } static void nr_t4timer_expiry(struct timer_list *t) @@ -172,6 +173,7 @@ static void nr_t4timer_expiry(struct timer_list *t) bh_lock_sock(sk); nr_sk(sk)->condition &= ~NR_COND_PEER_RX_BUSY; bh_unlock_sock(sk); + sock_put(sk); } static void nr_idletimer_expiry(struct timer_list *t) @@ -200,6 +202,7 @@ static void nr_idletimer_expiry(struct timer_list *t) sock_set_flag(sk, SOCK_DEAD); } bh_unlock_sock(sk); + sock_put(sk); } static void nr_t1timer_expiry(struct timer_list *t) @@ -212,8 +215,7 @@ static void nr_t1timer_expiry(struct timer_list *t) case NR_STATE_1: if (nr->n2count == nr->n2) { nr_disconnect(sk, ETIMEDOUT); - bh_unlock_sock(sk); - return; + goto out; } else { nr->n2count++; nr_write_internal(sk, NR_CONNREQ); @@ -223,8 +225,7 @@ static void nr_t1timer_expiry(struct timer_list *t) case NR_STATE_2: if (nr->n2count == nr->n2) { nr_disconnect(sk, ETIMEDOUT); - bh_unlock_sock(sk); - return; + goto out; } else { nr->n2count++; nr_write_internal(sk, NR_DISCREQ); @@ -234,8 +235,7 @@ static void nr_t1timer_expiry(struct timer_list *t) case NR_STATE_3: if (nr->n2count == nr->n2) { nr_disconnect(sk, ETIMEDOUT); - bh_unlock_sock(sk); - return; + goto out; } else { nr->n2count++; nr_requeue_frames(sk); @@ -244,5 +244,7 @@ static void nr_t1timer_expiry(struct timer_list *t) } nr_start_t1timer(sk); +out: bh_unlock_sock(sk); + sock_put(sk); } -- 2.30.2