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 <algorithm>
+#include <memory>
  // C
  #include <cstring>
  // 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<void, Deleter> 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<void, Deleter> 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;
  }

Reply via email to