Skip to content

Commit

Permalink
[Courgette] Clean up Disassembler; fix ELF Memory leaks.
Browse files Browse the repository at this point in the history
Cleaning up code surrounding Disassembler:
- Extract AddressTranslator interface to be used across subclasses.
- Use FileOffset = size_t by context.
- Detailed comments & TODOs in DisassemblerElf32ARM.
- Fix DisassemblerElf32ARM memory leaks.
- Lots of superficial stylistic changes.

Except for AddressTranslator routines and unit tests, shying away
from control flow and logic changes.

BUG=579206

Committed: https://crrev.com/58b822d441f5c982e879e536fa3c1cbac8fd339a
Cr-Commit-Position: refs/heads/master@{#380881}

Review URL: https://codereview.chromium.org/1676683002

Cr-Commit-Position: refs/heads/master@{#380987}
  • Loading branch information
samuelhuang authored and Commit bot committed Mar 14, 2016
1 parent be97fce commit dda11d0
Show file tree
Hide file tree
Showing 19 changed files with 888 additions and 880 deletions.
20 changes: 15 additions & 5 deletions courgette/disassembler.cc
Original file line number Diff line number Diff line change
Expand Up @@ -4,24 +4,34 @@

#include "courgette/disassembler.h"

#include "base/logging.h"

namespace courgette {

Disassembler::Disassembler(const void* start, size_t length)
: failure_reason_("uninitialized") {
: failure_reason_("uninitialized") {
start_ = reinterpret_cast<const uint8_t*>(start);
length_ = length;
end_ = start_ + length_;
};

Disassembler::~Disassembler() {};

const uint8_t* Disassembler::OffsetToPointer(size_t offset) const {
assert(start_ + offset <= end_);
return start_ + offset;
const uint8_t* Disassembler::FileOffsetToPointer(FileOffset file_offset) const {
CHECK_LE(file_offset, static_cast<FileOffset>(end_ - start_));
return start_ + file_offset;
}

const uint8_t* Disassembler::RVAToPointer(RVA rva) const {
FileOffset file_offset = RVAToFileOffset(rva);
if (file_offset == kNoFileOffset)
return nullptr;

return FileOffsetToPointer(file_offset);
}

bool Disassembler::Good() {
failure_reason_ = NULL;
failure_reason_ = nullptr;
return true;
}

Expand Down
34 changes: 18 additions & 16 deletions courgette/disassembler.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,33 +16,35 @@ namespace courgette {

class AssemblyProgram;

class Disassembler {
class Disassembler : public AddressTranslator {
public:
virtual ~Disassembler();

virtual ExecutableType kind() { return EXE_UNKNOWN; }
// AddressTranslator interfaces.
virtual RVA FileOffsetToRVA(FileOffset file_offset) const override = 0;
virtual FileOffset RVAToFileOffset(RVA rva) const override = 0;
const uint8_t* FileOffsetToPointer(FileOffset file_offset) const override;
const uint8_t* RVAToPointer(RVA rva) const override;

// ok() may always be called but returns 'true' only after ParseHeader
// succeeds.
bool ok() const { return failure_reason_ == NULL; }
virtual ExecutableType kind() const = 0;

// Returns 'true' if the buffer appears to be a valid executable of the
// expected type. It is not required that this be called before Disassemble.
// Returns true if the buffer appears to be a valid executable of the expected
// type, and false otherwise. This needs not be called before Disassemble().
virtual bool ParseHeader() = 0;

// Disassembles the item passed to the factory method into the output
// parameter 'program'.
virtual bool Disassemble(AssemblyProgram* program) = 0;

// Returns the length of the source executable. May reduce after ParseHeader.
// ok() may always be called but returns true only after ParseHeader()
// succeeds.
bool ok() const { return failure_reason_ == nullptr; }

// Returns the length of the image. May reduce after ParseHeader().
size_t length() const { return length_; }
const uint8_t* start() const { return start_; }
const uint8_t* end() const { return end_; }

// Returns a pointer into the memory copy of the file format.
// FileOffsetToPointer(0) returns a pointer to the start of the file format.
const uint8_t* OffsetToPointer(size_t offset) const;

protected:
Disassembler(const void* start, size_t length);

Expand All @@ -55,16 +57,16 @@ class Disassembler {
}

// Reduce the length of the image in memory. Does not actually free
// (or realloc) any memory. Usually only called via ParseHeader()
// (or realloc) any memory. Usually only called via ParseHeader().
void ReduceLength(size_t reduced_length);

private:
const char* failure_reason_;

//
// Basic information that is always valid after Construction, though
// ParseHeader may shorten the length if the executable is shorter than
// the total data.
// Basic information that is always valid after construction, although
// ParseHeader() may shorten |length_| if the executable is shorter than the
// total data.
//
size_t length_; // In current memory.
const uint8_t* start_; // In current memory, base for 'file offsets'.
Expand Down
Loading

0 comments on commit dda11d0

Please sign in to comment.