1.1 --- a/libexec/include/exec/elf.h Mon Apr 03 19:35:35 2023 +0200
1.2 +++ b/libexec/include/exec/elf.h Mon Apr 03 22:10:42 2023 +0200
1.3 @@ -66,6 +66,7 @@
1.4 protected:
1.5 HEADER *_header;
1.6 Segment **_segments = NULL;
1.7 + unsigned int _nsegments;
1.8
1.9 public:
1.10 explicit PayloadVariant(HEADER *header);
2.1 --- a/libexec/lib/src/elf.cc Mon Apr 03 19:35:35 2023 +0200
2.2 +++ b/libexec/lib/src/elf.cc Mon Apr 03 22:10:42 2023 +0200
2.3 @@ -100,6 +100,11 @@
2.4 PayloadVariant<HEADER, PROGRAM_HEADER>::PayloadVariant(HEADER *header)
2.5 : _header(header)
2.6 {
2.7 + /* Record the number of segments since various methods depend on it, but the
2.8 + header data may be unavailable when it is used, upon destruction, for
2.9 + example. */
2.10 +
2.11 + _nsegments = _header->e_phnum;
2.12 }
2.13
2.14 /* Specific payload destruction. */
2.15 @@ -111,6 +116,8 @@
2.16 {
2.17 for (unsigned int i = 0; i < segments(); i++)
2.18 delete _segments[i];
2.19 +
2.20 + delete _segments;
2.21 }
2.22 }
2.23
2.24 @@ -135,7 +142,7 @@
2.25 template <typename HEADER, typename PROGRAM_HEADER>
2.26 unsigned int PayloadVariant<HEADER, PROGRAM_HEADER>::segments()
2.27 {
2.28 - return _header->e_phnum;
2.29 + return _nsegments;
2.30 }
2.31
2.32 template <typename HEADER, typename PROGRAM_HEADER>