From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by sourceware.org (Postfix) with ESMTPS id 5D3923858437 for ; Thu, 21 Oct 2021 19:38:10 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 5D3923858437 Received: from mail-qk1-f197.google.com (mail-qk1-f197.google.com [209.85.222.197]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-6-bGXpht1wPUCQKdRjPqglkA-1; Thu, 21 Oct 2021 15:38:07 -0400 X-MC-Unique: bGXpht1wPUCQKdRjPqglkA-1 Received: by mail-qk1-f197.google.com with SMTP id y5-20020ae9f405000000b0045fa3120bebso1285961qkl.17 for ; Thu, 21 Oct 2021 12:38:07 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:message-id:date:mime-version:user-agent:subject :content-language:to:references:from:in-reply-to :content-transfer-encoding; bh=/wkPzp6kXZEEKuimFZ9KfpFUmc/Vh5iz0xoibzuTIeM=; b=yYyFiRXKgGVdXfPq2V1K5Ze4iuJ3MQO7kW/e1BuTTOLrs4UxMEYuxp84h+LfHex0iP SWGouBUBSf6MyrSb9p1ZxA89y+oCr8hyqV1pnm+2QOPENPTKS8UJWhqN5sUfLKp2x2ed UzLpWOxG/OMRzxVsShvUW/5DSuEQp3KY7zec/yMHbb1oyixfRdNHGf7JgsqfoylLxgFe bHZyemf5fJgZ2vS8UfPxJUvlxJJG9SR8VOC/ZN24MDPWSP+DzhC3KHsg2cg4Rbyd/pAu o9LARKavf+mJteDKgGh09tJTxqrJbY+4iwZkQpoJoHz6/pCph58HZCYWz1EnwZsWCQr0 1IPg== X-Gm-Message-State: AOAM530xfgbCkL2OLiyMhh/TQDlQfdt9Jvx2tQ9yFByuzws83QUJfMLq rEZoHfMKult6gg41XGVyZrdkPEDKn2tcYWOEldat/s0/nBAWQs9mw3um3n4SlaNLEqsINybXjz2 zuBJpPe9z5nVxCBA= X-Received: by 2002:a05:6214:448:: with SMTP id cc8mr7278720qvb.28.1634845086843; Thu, 21 Oct 2021 12:38:06 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzfUj04vUfO5vawawjMKEUDCJo3lUMmk+uDfSBMRcOgBa4EyZIK1bwmnaZ5QfwujrS7Z5Vgrw== X-Received: by 2002:a05:6214:448:: with SMTP id cc8mr7278705qvb.28.1634845086563; Thu, 21 Oct 2021 12:38:06 -0700 (PDT) Received: from [192.168.1.149] (130-44-159-43.s15913.c3-0.arl-cbr1.sbo-arl.ma.cable.rcncustomer.com. [130.44.159.43]) by smtp.gmail.com with ESMTPSA id j14sm2956171qke.68.2021.10.21.12.38.05 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 21 Oct 2021 12:38:06 -0700 (PDT) Message-ID: <2dfa49c9-d55e-8169-616a-ff48a957fb61@redhat.com> Date: Thu, 21 Oct 2021 15:38:04 -0400 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.2.0 Subject: Re: [PATCH] c++tools: Fix memory leak To: Jonathan Wakely , libstdc++@gcc.gnu.org, gcc-patches@gcc.gnu.org References: <20211021132834.636383-1-jwakely@redhat.com> From: Jason Merrill In-Reply-To: <20211021132834.636383-1-jwakely@redhat.com> X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Language: en-US Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Spam-Status: No, score=-14.2 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, NICE_REPLY_A, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, SPF_NONE, TXREP autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: libstdc++@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libstdc++ mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 21 Oct 2021 19:38:11 -0000 On 10/21/21 09:28, Jonathan Wakely wrote: > The allocated memory is not freed when returning early due to an error. > > c++tools/ChangeLog: > > * resolver.cc (module_resolver::read_tuple_file): Use unique_ptr > to ensure memory is freed before returning. > --- > c++tools/resolver.cc | 14 ++++++++------ > 1 file changed, 8 insertions(+), 6 deletions(-) > > diff --git a/c++tools/resolver.cc b/c++tools/resolver.cc > index 421fdaa55fe..d1b73a47778 100644 > --- a/c++tools/resolver.cc > +++ b/c++tools/resolver.cc > @@ -23,6 +23,7 @@ along with GCC; see the file COPYING3. If not see > #include "resolver.h" > // C++ > #include > +#include > // C > #include > // OS > @@ -114,10 +115,17 @@ module_resolver::read_tuple_file (int fd, char const *prefix, bool force) > buffer = mmap (nullptr, stat.st_size, PROT_READ, MAP_PRIVATE, fd, 0); > if (buffer == MAP_FAILED) > return -errno; > + struct Deleter { > + void operator()(void* p) const { munmap(p, size); } > + size_t size; > + }; > + std::unique_ptr guard(buffer, Deleter{(size_t)stat.st_size}); > #else > buffer = xmalloc (stat.st_size); > if (!buffer) > return -errno; > + struct Deleter { void operator()(void* p) const { free(p); } }; > + std::unique_ptr guard; Don't you need to initialize guard from buffer? > if (read (fd, buffer, stat.st_size) != stat.st_size) > return -errno; > #endif > @@ -179,12 +187,6 @@ module_resolver::read_tuple_file (int fd, char const *prefix, bool force) > } > } > > -#if MAPPED_READING > - munmap (buffer, stat.st_size); > -#else > - free (buffer); > -#endif > - > return 0; > } > >