Received: by 2002:a05:6a10:6d10:0:0:0:0 with SMTP id gq16csp54597pxb; Tue, 12 Apr 2022 16:37:56 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwtxKBLIBoGdnvVkHjY0pWHDpixemR+Pn/meXN0dEOK4bCQJh6EAwx/7Q525zeMyvlt6kUB X-Received: by 2002:a17:902:bf07:b0:158:24d9:3946 with SMTP id bi7-20020a170902bf0700b0015824d93946mr23098057plb.28.1649806670830; Tue, 12 Apr 2022 16:37:50 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1649806670; cv=none; d=google.com; s=arc-20160816; b=NtitF152CkwP20shuWYO+eCjEA/P1iFjAI5z5skBLLzFRHTNiKPP8dCQ8Wg9nBzs9p 3VmKkqQQSMo4Ua5J8ky0AiSmWGm8ymiaaK3ijST2oyHVU6MIWzYzse+xwpJ7cdoPYBlw DtFXrLGAVALscql0LjwTiQd8r5dPN1aM8Ha9MPvMEvIIi9qN3kzwWZC48dOkX2xGOvhp 4v3PPoYfMcb1uxfewzIPH15Nzfws+KO+SP92CT3zs1bY3QL3IGI5U7tYSFtWflWn05rd dAjQCHG4SEnNmKpvMEU/YSyd3+KS9tHyzAJfWv41ZgQuI7ogJajLaKlUDdm+sAPk1AQH Ol2A== 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 :message-id:date:subject:cc:to:from:dkim-signature; bh=mYhX4cxvNPixKiX8/O3wLDCe+0alwiuzYnrIU9ZEA4g=; b=gNe0+ipvf743lcuyusd3xyZNz9U9njquDITa/+2XcRqfNze+U3GcPrrRVDxrowdpi2 60iuYLrrY1eBA0Hx5GXb+0M+LInqvuvxIe7qTKE2v9Q9LU3My9Urorai6sHqFwEX9S+P I82RWlBuDmK2wnnrUTLOkKUBb427VgpRBvmwrr7e9MU4a+8GAK6V03d8eRpt2xD3mcjZ kSPtnLSxqPx68LEzb4T+pWUF74mFrV/ArH+u7xlv0pqTTHWpSzP7vguq/z/Ava0kR121 RroQ3j9BiMOKYp/rSlGLY1zV+sb+AVsnVu6o3xm9i9qOC53M/En2bVgpAaAZSbVg17xN MHGA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=WcXC5z9i; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from lindbergh.monkeyblade.net (lindbergh.monkeyblade.net. [2620:137:e000::1:18]) by mx.google.com with ESMTPS id q12-20020aa7842c000000b00505f73f2a30si3403776pfn.344.2022.04.12.16.37.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 12 Apr 2022 16:37:50 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) client-ip=2620:137:e000::1:18; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=WcXC5z9i; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id C7C0B10EC69; Tue, 12 Apr 2022 14:29:45 -0700 (PDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1352985AbiDLT14 (ORCPT + 99 others); Tue, 12 Apr 2022 15:27:56 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54994 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1357713AbiDLT1o (ORCPT ); Tue, 12 Apr 2022 15:27:44 -0400 Received: from mail-pg1-x52e.google.com (mail-pg1-x52e.google.com [IPv6:2607:f8b0:4864:20::52e]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 3D06525C60 for ; Tue, 12 Apr 2022 12:25:25 -0700 (PDT) Received: by mail-pg1-x52e.google.com with SMTP id k29so1589400pgm.12 for ; Tue, 12 Apr 2022 12:25:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=mYhX4cxvNPixKiX8/O3wLDCe+0alwiuzYnrIU9ZEA4g=; b=WcXC5z9iBD0s8lqEIkWuMQZUWfBIEmGdOcTDJqsddJGTc3xoDzEDte6mLkWCIDPq6H YHQuTi2jz+pLaZ8K0n3h+80UsslQCJcbZCL49vv/iIQRc4MzeoUTN57u4Pk6Dtk8H9Wc KDCu2a04jyUl6dKyGyJfhQgPSJPUaOxmhiyGeDPKKJPcJHNUlNymuti54JQo6/NDczvO vbVuQ9W77Cy/v2QPjgtsQEF4MpP2tX3f+bHSl/ir7fHiWkRxbpG2V2V744Rx+xNFpwjR XZUkPMYcqusEKPz9Uy9mX9juzRrR5tQ+Q4qiBB8T1Gj6Sx2YQ1W9au99vcD3HFtSTAwh 8rqw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=mYhX4cxvNPixKiX8/O3wLDCe+0alwiuzYnrIU9ZEA4g=; b=IGVH9N0gAAKpO5FkSU7nyQPye5JQLFDg43YJBGWHBEpIHz18DyefUZHwWV49p7uCKn jpO4Chs4G7fHuiughq/vGUHIq2kg2aSa7Z33opyEOR0/vYw2Kew0MXdYl0hDKbI6Heoj isL+lzcdVdgkiZsE3CqZElhpVRUprLpA2UqVoB1xlAo3mkmfFHgSnasdeqIWkRa0Ok46 +P8xpI+oE8HoUdVFb46/wMtfp0JbW7UTVLQqmflo1jPKpavrVe1BuSFuSdn3J5FYDLT/ OCXaPO1NS4yucJo4I2cWuM25WZXBLZaYLXnlwGxOZaH2pCaa3TqUgQBKXWBequRSLcxb 8qtg== X-Gm-Message-State: AOAM531/ubnKTNhzPjCtqFejotGfY8hiHIzk8YgjIWJ+7MDhnEI0w+2G yeKdErz+yzLslJrTCOR0horZFg== X-Received: by 2002:a05:6a00:15ca:b0:505:bf6f:2b48 with SMTP id o10-20020a056a0015ca00b00505bf6f2b48mr12169006pfu.64.1649791524446; Tue, 12 Apr 2022 12:25:24 -0700 (PDT) Received: from localhost.localdomain ([50.39.160.154]) by smtp.gmail.com with ESMTPSA id k10-20020a056a00168a00b004f7e2a550ccsm38925670pfc.78.2022.04.12.12.25.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 12 Apr 2022 12:25:24 -0700 (PDT) From: Tadeusz Struk To: cgroups@vger.kernel.org Cc: Tadeusz Struk , Tejun Heo , Zefan Li , Johannes Weiner , Christian Brauner , Alexei Starovoitov , Daniel Borkmann , Andrii Nakryiko , Martin KaFai Lau , Song Liu , Yonghong Song , John Fastabend , KP Singh , netdev@vger.kernel.org, bpf@vger.kernel.org, stable@vger.kernel.org, linux-kernel@vger.kernel.org, syzbot+e42ae441c3b10acf9e9d@syzkaller.appspotmail.com Subject: [PATCH] cgroup: don't queue css_release_work if one already pending Date: Tue, 12 Apr 2022 12:24:59 -0700 Message-Id: <20220412192459.227740-1-tadeusz.struk@linaro.org> X-Mailer: git-send-email 2.35.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-2.0 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,RDNS_NONE,SPF_HELO_NONE,T_SCC_BODY_TEXT_LINE autolearn=no autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Syzbot found a corrupted list bug scenario that can be triggered from cgroup css_create(). The reproduces writes to cgroup.subtree_control file, which invokes cgroup_apply_control_enable(), css_create(), and css_populate_dir(), which then randomly fails with a fault injected -ENOMEM. In such scenario the css_create() error path rcu enqueues css_free_rwork_fn work for an css->refcnt initialized with css_release() destructor, and there is a chance that the css_release() function will be invoked for a cgroup_subsys_state, for which a destroy_work has already been queued via css_create() error path. This causes a list_add corruption as can be seen in the syzkaller report [1]. This can be avoided by adding a check to css_release() that checks if it has already been enqueued. [1] https://syzkaller.appspot.com/bug?id=e26e54d6eac9d9fb50b221ec3e4627b327465dbd Cc: Tejun Heo Cc: Zefan Li Cc: Johannes Weiner Cc: Christian Brauner Cc: Alexei Starovoitov Cc: Daniel Borkmann Cc: Andrii Nakryiko Cc: Martin KaFai Lau Cc: Song Liu Cc: Yonghong Song Cc: John Fastabend Cc: KP Singh Cc: Cc: Cc: Cc: Cc: Reported-by: syzbot+e42ae441c3b10acf9e9d@syzkaller.appspotmail.com Fixes: 8f36aaec9c92 ("cgroup: Use rcu_work instead of explicit rcu and work item") Signed-off-by: Tadeusz Struk --- kernel/cgroup/cgroup.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/kernel/cgroup/cgroup.c b/kernel/cgroup/cgroup.c index adb820e98f24..9ae2de29f8c9 100644 --- a/kernel/cgroup/cgroup.c +++ b/kernel/cgroup/cgroup.c @@ -5210,8 +5210,11 @@ static void css_release(struct percpu_ref *ref) struct cgroup_subsys_state *css = container_of(ref, struct cgroup_subsys_state, refcnt); - INIT_WORK(&css->destroy_work, css_release_work_fn); - queue_work(cgroup_destroy_wq, &css->destroy_work); + if (!test_and_set_bit(WORK_STRUCT_PENDING_BIT, + work_data_bits(&css->destroy_work))) { + INIT_WORK(&css->destroy_work, css_release_work_fn); + queue_work(cgroup_destroy_wq, &css->destroy_work); + } } static void init_and_link_css(struct cgroup_subsys_state *css, -- 2.35.1