# HG changeset patch # User Paul Boddie # Date 1680552642 -7200 # Node ID 9cf77374b29925e4a5c57640be774dbe0853c5fc # Parent b4b80ed8624b55fb82596e85910ff6bd7579f4fb Record the number of segments when initialising a payload variant, since various methods depend on this value, but the header data that provides it may no longer be available when it is required, upon destruction, for example. diff -r b4b80ed8624b -r 9cf77374b299 libexec/include/exec/elf.h --- a/libexec/include/exec/elf.h Mon Apr 03 19:35:35 2023 +0200 +++ b/libexec/include/exec/elf.h Mon Apr 03 22:10:42 2023 +0200 @@ -66,6 +66,7 @@ protected: HEADER *_header; Segment **_segments = NULL; + unsigned int _nsegments; public: explicit PayloadVariant(HEADER *header); diff -r b4b80ed8624b -r 9cf77374b299 libexec/lib/src/elf.cc --- a/libexec/lib/src/elf.cc Mon Apr 03 19:35:35 2023 +0200 +++ b/libexec/lib/src/elf.cc Mon Apr 03 22:10:42 2023 +0200 @@ -100,6 +100,11 @@ PayloadVariant::PayloadVariant(HEADER *header) : _header(header) { + /* Record the number of segments since various methods depend on it, but the + header data may be unavailable when it is used, upon destruction, for + example. */ + + _nsegments = _header->e_phnum; } /* Specific payload destruction. */ @@ -111,6 +116,8 @@ { for (unsigned int i = 0; i < segments(); i++) delete _segments[i]; + + delete _segments; } } @@ -135,7 +142,7 @@ template unsigned int PayloadVariant::segments() { - return _header->e_phnum; + return _nsegments; } template