From patchwork Thu Oct 21 21:34:37 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jonathan Wakely X-Patchwork-Id: 46511 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id B3443385780F for ; Thu, 21 Oct 2021 21:35:19 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org B3443385780F DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1634852119; bh=V4Ixh01dhAAK9tFCRH2o0MU5GmWh4yZPp+Yw/quLyiA=; h=References:In-Reply-To:Date:Subject:To:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc: From; b=BkIcfxXZJruhGfRf4AByTAGcAlwCGTj/Lom1KuzRRBcNmjfeQDWaQkO8YJNKc6lNi aqAxTHmJzFe8pBsZUAuhJRSqDskoB1ooPXqfGJPqaK44d0u/9HRdqfe10lHqVfgLLY khUtFFOjrUKkztJm/xadr9f5CEMZza56uEIypSrU= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org 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 840473858416 for ; Thu, 21 Oct 2021 21:34:50 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 840473858416 Received: from mail-ua1-f69.google.com (mail-ua1-f69.google.com [209.85.222.69]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-176-9bOoWiHdPPC0gm_BR_-_9Q-1; Thu, 21 Oct 2021 17:34:48 -0400 X-MC-Unique: 9bOoWiHdPPC0gm_BR_-_9Q-1 Received: by mail-ua1-f69.google.com with SMTP id 69-20020a9f21cb000000b002cb2d7cc2b2so924112uac.19 for ; Thu, 21 Oct 2021 14:34:48 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=sQGLK+HQj0L9A5iNcGOyoE/XD+gncQUS4NVOp6tbWso=; b=yXWvUYHJSfsHTkptU06MOWulxL1/V/+2YqMz/rMH6s1Q9LmigNHNTz6NIKFftrMhlJ vQojUSdGDg+LTU1+TUjq0tDkw9rqhqg81nwKuM4vi0Do6LU3oDzrSbo7U9jEySmcQRcT GSUoX4iJwPcbytuphsLkfXj9wPYLPP2j1EGC3MHYW+2NOTeBJrHvVATNR6M6kALGZvJw xQMnJfp36BaihJMxIBCaIwG/rHJLm8b3riTXccss3HPkWfZqGVPBtPWhvnV+HojAomDW 6OoLJBsbpzcIisX5vwQxg+TNtF/ZeBnD5lKZK1I0hEeXBwEaqcHIW4xXiDpGcJSSJO+h 3K8Q== X-Gm-Message-State: AOAM531yVmZ1+s280vT/ODZWwZCn26MnjurueGFMDGTvJyi+HI+VaBJn yxhg+kMqVl/KgM+8EAesJ38NKhWGW6xVtTwYgw9gHGrDBai/X+XtAPhtoRC1zkv4LMrJ2F6otL6 T1d1vUnEwp0Is++HSox9ZaLpBtzL7I+oNWg== X-Received: by 2002:ab0:1447:: with SMTP id c7mr9415798uae.2.1634852088078; Thu, 21 Oct 2021 14:34:48 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxj5pqu7lV9/lYQtRO6dN+FoBCVzF0BCL9S/sxu3BgP+P9AzjSkL+lC/6Gjul4Fhcmvx1sewTda4M84L0nWNSg= X-Received: by 2002:ab0:1447:: with SMTP id c7mr9415776uae.2.1634852087873; Thu, 21 Oct 2021 14:34:47 -0700 (PDT) MIME-Version: 1.0 References: <20211021132834.636383-1-jwakely@redhat.com> <2dfa49c9-d55e-8169-616a-ff48a957fb61@redhat.com> In-Reply-To: <2dfa49c9-d55e-8169-616a-ff48a957fb61@redhat.com> Date: Thu, 21 Oct 2021 22:34:37 +0100 Message-ID: Subject: [PATCH v2] c++tools: Fix memory leak To: Jason Merrill X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com X-Spam-Status: No, score=-12.9 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, HTML_MESSAGE, 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-Content-Filtered-By: Mailman/MimeDel 2.1.29 X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Jonathan Wakely via Gcc-patches From: Jonathan Wakely Reply-To: Jonathan Wakely Cc: libstdc++ , gcc Patches Errors-To: gcc-patches-bounces+patchwork=sourceware.org@gcc.gnu.org Sender: "Gcc-patches" On Thu, 21 Oct 2021 at 20:38, Jason Merrill wrote: > On 10/21/21 09:28, Jonathan Wakely wrote: > > #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? > Oops, yes! Updated patch attached. commit b280f6b5b4339586446eec99e49074e091c27ea5 Author: Jonathan Wakely Date: Thu Oct 21 22:32:23 2021 c++tools: Fix memory leak 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. diff --git a/c++tools/resolver.cc b/c++tools/resolver.cc index 421fdaa55fe..a1837b3ee10 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(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; }