Received: by 2002:a05:6a10:f347:0:0:0:0 with SMTP id d7csp835595pxu; Mon, 23 Nov 2020 05:30:56 -0800 (PST) X-Google-Smtp-Source: ABdhPJyFkRrpCDI+vJoAb1VHfsnygjBPLVjBcmgDVwOgLjT3FpULZBydL/pZej9vrc5Ph8f74wIl X-Received: by 2002:a17:906:aad7:: with SMTP id kt23mr26755864ejb.158.1606138255981; Mon, 23 Nov 2020 05:30:55 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1606138255; cv=none; d=google.com; s=arc-20160816; b=dSPQUE019XZcwEeIGybwFZWjTb3mokhd8Vzwosn0y1waAcJcegxkCaH+eBe6J88Mwn /IniUudnmHx6g2jjvuQS1WZqA5lqtBQWY1/FAPSSaD+I+0AmdIVrGGjPmIMrhxomRg0l Zo2PAxh+dTCIRodYzlZf/MQEt6rOnYSyau8G3Q31pfq0rbqnoneaB6jseGJPv3KvbI29 T16gsKy727a9E17HQDBteouaJNiCIZl33gTCL+ybTnn4f4+sYFyEcNSEy/CU9xebsaoT qRbZTBctpWLTShOVzkK9+iScFrT2ZnuUF92jzBiXLkfBcuOBIvVNKdlxl5J1lC937a29 blNA== 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=++LdQtetDesekRzRL5IeNRCuppFq5RrTqSy03Z3PA6U=; b=eqz4tGxQJV+vqV5nD+We43mv/2h2fGPYKPsftfD6ts0OsfuY0mf8VOR5GOfUpCzgH3 iUYuUoz++rCbNd9KgKvKadIMG/JGMAD4wBn6rx/nAdcd+4+UOZJNmEowb7O35OYHh0GR JAIuLgXhihpcczSIlcliI6X5ikiZDKq3lXqBKpxO5iEXySy9rlpXisBMQ5JPEmdm4PZA qFjUHavtMJ7Sg0acSD9WMmO20jByG3mB1VTVsIe4XuJjc34EJnHkQcRqyF3Wu7Hy9LoQ zjrUDSBLZzmmFZErXwRXbKZkV14cpc5yrul91m/0r4WURTQuBAvfpIUBrikTuCmvN+Dk 2znA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=ig75j82G; 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 rk21si6423712ejb.139.2020.11.23.05.30.31; Mon, 23 Nov 2020 05:30:55 -0800 (PST) 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=ig75j82G; 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 S2388972AbgKWNZe (ORCPT + 99 others); Mon, 23 Nov 2020 08:25:34 -0500 Received: from mail.kernel.org ([198.145.29.99]:44712 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1731173AbgKWMdO (ORCPT ); Mon, 23 Nov 2020 07:33:14 -0500 Received: from localhost (83-86-74-64.cable.dynamic.v4.ziggo.nl [83.86.74.64]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 37B2920721; Mon, 23 Nov 2020 12:33:13 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1606134794; bh=z5PWkdOOMtL8ANKvzJP2CyYiCUYdTph4fTL5PBUB8F4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ig75j82G3NvqvoVNEEiHs9nx3yK/MmkNBKOjjhfS5UdeYISrC2qEGq7oiweYfWMhH NpOHtz8RQABWUN+uFkN9UJP6FYFLdYQRK51V9j3S6dG98TbtpD/uhbULwf8Yw0AqmM yO7uq/mVbprAPjeDY2zntjdlCN4MyFjz3u8ow1IU= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, syzbot+32c6c38c4812d22f2f0b@syzkaller.appspotmail.com, syzbot+4c81fe92e372d26c4246@syzkaller.appspotmail.com, syzbot+6a7fe9faf0d1d61bc24a@syzkaller.appspotmail.com, syzbot+abed06851c5ffe010921@syzkaller.appspotmail.com, syzbot+b7aeb9318541a1c709f1@syzkaller.appspotmail.com, syzbot+d5a9416c6cafe53b5dd0@syzkaller.appspotmail.com, Johannes Berg Subject: [PATCH 4.19 85/91] mac80211: free sta in sta_info_insert_finish() on errors Date: Mon, 23 Nov 2020 13:22:45 +0100 Message-Id: <20201123121813.447834066@linuxfoundation.org> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20201123121809.285416732@linuxfoundation.org> References: <20201123121809.285416732@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: Johannes Berg commit 7bc40aedf24d31d8bea80e1161e996ef4299fb10 upstream. If sta_info_insert_finish() fails, we currently keep the station around and free it only in the caller, but there's only one such caller and it always frees it immediately. As syzbot found, another consequence of this split is that we can put things that sleep only into __cleanup_single_sta() and not in sta_info_free(), but this is the only place that requires such of sta_info_free() now. Change this to free the station in sta_info_insert_finish(), in which case we can still sleep. This will also let us unify the cleanup code later. Cc: stable@vger.kernel.org Fixes: dcd479e10a05 ("mac80211: always wind down STA state") Reported-by: syzbot+32c6c38c4812d22f2f0b@syzkaller.appspotmail.com Reported-by: syzbot+4c81fe92e372d26c4246@syzkaller.appspotmail.com Reported-by: syzbot+6a7fe9faf0d1d61bc24a@syzkaller.appspotmail.com Reported-by: syzbot+abed06851c5ffe010921@syzkaller.appspotmail.com Reported-by: syzbot+b7aeb9318541a1c709f1@syzkaller.appspotmail.com Reported-by: syzbot+d5a9416c6cafe53b5dd0@syzkaller.appspotmail.com Link: https://lore.kernel.org/r/20201112112201.ee6b397b9453.I9c31d667a0ea2151441cc64ed6613d36c18a48e0@changeid Signed-off-by: Johannes Berg Signed-off-by: Greg Kroah-Hartman --- net/mac80211/sta_info.c | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) --- a/net/mac80211/sta_info.c +++ b/net/mac80211/sta_info.c @@ -634,7 +634,7 @@ static int sta_info_insert_finish(struct out_drop_sta: local->num_sta--; synchronize_net(); - __cleanup_single_sta(sta); + cleanup_single_sta(sta); out_err: mutex_unlock(&local->sta_mtx); kfree(sinfo); @@ -653,19 +653,13 @@ int sta_info_insert_rcu(struct sta_info err = sta_info_insert_check(sta); if (err) { + sta_info_free(local, sta); mutex_unlock(&local->sta_mtx); rcu_read_lock(); - goto out_free; + return err; } - err = sta_info_insert_finish(sta); - if (err) - goto out_free; - - return 0; - out_free: - sta_info_free(local, sta); - return err; + return sta_info_insert_finish(sta); } int sta_info_insert(struct sta_info *sta)