Received: by 2002:a05:6358:d09b:b0:dc:cd0c:909e with SMTP id jc27csp667932rwb; Thu, 15 Dec 2022 00:23:08 -0800 (PST) X-Google-Smtp-Source: AA0mqf5S9HYa3BoU0I6bAMi/pPYTVOD4Md4lI84wYNM4E++BMa3AbYl685ys+nkOC32tkwbLdXNF X-Received: by 2002:a17:906:30d3:b0:78d:f454:ba10 with SMTP id b19-20020a17090630d300b0078df454ba10mr24495881ejb.15.1671092587971; Thu, 15 Dec 2022 00:23:07 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1671092587; cv=none; d=google.com; s=arc-20160816; b=xa/xUsqgXNI69d/p1D41IF/F+5RP6Tl8X57CE6ygSQ7z7WU/ia6ss3jIN1rJhyxyQn 7vXKdBp8uFXdSlPsjVXncY9vjeUTuYatwkIvbYtOHqYgQA0YKmYpqoyaVqN0ORXm8mKB LPLyfLp5+M0ZnMw5IfDXVYawVFMxPzzw9xQ/fwxmLzll/WOAIuD8rds/boxC6egqs8v9 ocq9HVfx1WsxaKqBFqbjdv229y4M9z+cx5OytlBsJjJ6ufdAncYufVmaqP5/Mr3Q/gRM gTfEXsbpX4CzJCP7asIGZ1PqKr9o9RbEJb+9VZrTRzvBuBCTPzMglpD6AT0y0vMC3FIG albw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:in-reply-to:content-disposition:mime-version :references:message-id:subject:cc:to:from:date:dkim-signature; bh=ApTPtm4BpVUmJDkiZyC1YdPf5EgpdLIlVfUqGS4nvKM=; b=ay9QwCO0hBJH0XJL6IRSxFjdmdx/WZHxPJQQulg+1t2B7NYkRQF8tuNORpjTDRc4ga T9aavOi/caHuirZB8VVSqoZ3S41vfhulMNJc9mzinFsdh33Yt4uVrvZ8SSobeBIAc4Ky 35Wl31gjAQ3UCHnpw/Ep6SXe4EST5fKmsxdwWf/Yq8ykzWROuzpqVF2j7P24JB+1c+IJ SQ3aYCVp+6GBLA0guBlfwjsqMuQ3Dj4lvrpLcQOVbN9b268cmCW4dvDk23hm3gNwnml1 s3PtCc0mk0xiNTyEjY0bosOQZrt/GCzm4VWpvm+muC8GVOGjfMZBOygueTg0nBXGB8zY z9/w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@suse.com header.s=susede1 header.b=a41MyVNd; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=suse.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id xd12-20020a170907078c00b007a835c56b70si12477859ejb.267.2022.12.15.00.22.51; Thu, 15 Dec 2022 00:23:07 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@suse.com header.s=susede1 header.b=a41MyVNd; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=suse.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229723AbiLOHv0 (ORCPT + 69 others); Thu, 15 Dec 2022 02:51:26 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:51290 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229488AbiLOHvW (ORCPT ); Thu, 15 Dec 2022 02:51:22 -0500 Received: from smtp-out2.suse.de (smtp-out2.suse.de [IPv6:2001:67c:2178:6::1d]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 2D64420995; Wed, 14 Dec 2022 23:51:21 -0800 (PST) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out2.suse.de (Postfix) with ESMTPS id 6AFA120CA9; Thu, 15 Dec 2022 07:51:19 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=susede1; t=1671090679; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=ApTPtm4BpVUmJDkiZyC1YdPf5EgpdLIlVfUqGS4nvKM=; b=a41MyVNd5CeVoWrJcB4xuBEUNfYo4yDh603pgccImOnX5OCtr1gya9icfuLNk75R7Tk1id gSDLYnn/xsqXVWQ/tro/OCo9PqlVcQRku5Sc/vAZfPj2iATPKyx+oom9eFMvCeJ+2W3Tsm /ufa51Ym/t8u3pVUN7hd/OkttdwJEH0= Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id 4203A138E5; Thu, 15 Dec 2022 07:51:19 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id 0LftDffRmmMJewAAMHmgww (envelope-from ); Thu, 15 Dec 2022 07:51:19 +0000 Date: Thu, 15 Dec 2022 08:51:18 +0100 From: Michal Hocko To: Mathieu Desnoyers Cc: Andrew Morton , linux-kernel@vger.kernel.org, "Aneesh Kumar K . V" , Ben Widawsky , Dave Hansen , Feng Tang , Andrea Arcangeli , Mel Gorman , Mike Kravetz , Randy Dunlap , Vlastimil Babka , Andi Kleen , Dan Williams , Huang Ying , linux-api@vger.kernel.org, stable@vger.kernel.org Subject: Re: [RFC PATCH] mm/mempolicy: Fix memory leak in set_mempolicy_home_node system call Message-ID: References: <20221214222110.200487-1-mathieu.desnoyers@efficios.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20221214222110.200487-1-mathieu.desnoyers@efficios.com> X-Spam-Status: No, score=-4.4 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_MED,SPF_HELO_NONE, SPF_PASS autolearn=ham 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 On Wed 14-12-22 17:21:10, Mathieu Desnoyers wrote: > When encountering any vma in the range with policy other than MPOL_BIND > or MPOL_PREFERRED_MANY, an error is returned without issuing a mpol_put > on the policy just allocated with mpol_dup(). > > This allows arbitrary users to leak kernel memory. > > Fixes: c6018b4b2549 ("mm/mempolicy: add set_mempolicy_home_node syscall") > Signed-off-by: Mathieu Desnoyers > Cc: Aneesh Kumar K.V > Cc: Ben Widawsky > Cc: Dave Hansen > Cc: Feng Tang > Cc: Michal Hocko > Cc: Andrea Arcangeli > Cc: Mel Gorman > Cc: Mike Kravetz > Cc: Randy Dunlap > Cc: Vlastimil Babka > Cc: Andi Kleen > Cc: Dan Williams > Cc: Huang Ying > Cc: > Cc: Andrew Morton > Cc: stable@vger.kernel.org # 5.17+ Acked-by: Michal Hocko Thanks for catching this! Btw. looking at the code again it seems rather pointless to duplicate the policy just to throw it away anyway. A slightly bigger diff but this looks more reasonable to me. What do you think? I can also send it as a clean up on top of your fix. --- diff --git a/mm/mempolicy.c b/mm/mempolicy.c index 61aa9aedb728..918cdc8a7f0c 100644 --- a/mm/mempolicy.c +++ b/mm/mempolicy.c @@ -1489,7 +1489,7 @@ SYSCALL_DEFINE4(set_mempolicy_home_node, unsigned long, start, unsigned long, le { struct mm_struct *mm = current->mm; struct vm_area_struct *vma; - struct mempolicy *new; + struct mempolicy *new. *old; unsigned long vmstart; unsigned long vmend; unsigned long end; @@ -1521,30 +1521,28 @@ SYSCALL_DEFINE4(set_mempolicy_home_node, unsigned long, start, unsigned long, le return 0; mmap_write_lock(mm); for_each_vma_range(vmi, vma, end) { - vmstart = max(start, vma->vm_start); - vmend = min(end, vma->vm_end); - new = mpol_dup(vma_policy(vma)); - if (IS_ERR(new)) { - err = PTR_ERR(new); - break; - } - /* - * Only update home node if there is an existing vma policy - */ - if (!new) - continue; - /* * If any vma in the range got policy other than MPOL_BIND * or MPOL_PREFERRED_MANY we return error. We don't reset * the home node for vmas we already updated before. */ - if (new->mode != MPOL_BIND && new->mode != MPOL_PREFERRED_MANY) { + old = vma_policy(vma); + if (!old) + continue; + if (old->mode != MPOL_BIND && old->mode != MPOL_PREFERRED_MANY) { err = -EOPNOTSUPP; break; } + new = mpol_dup(vma_policy(vma)); + if (IS_ERR(new)) { + err = PTR_ERR(new); + break; + } + new->home_node = home_node; + vmstart = max(start, vma->vm_start); + vmend = min(end, vma->vm_end); err = mbind_range(mm, vmstart, vmend, new); mpol_put(new); if (err) -- Michal Hocko SUSE Labs