Message ID | 20211021132834.636383-1-jwakely@redhat.com |
---|---|
State | New |
Headers | show |
Series | c++tools: Fix memory leak | expand |
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; > } > >
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; 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; }