diff options
Diffstat (limited to 'courgette')
-rw-r--r-- | courgette/disassembler_elf_32.h | 14 | ||||
-rw-r--r-- | courgette/disassembler_elf_32_x86.h | 5 | ||||
-rw-r--r-- | courgette/third_party/bsdiff.h | 10 | ||||
-rw-r--r-- | courgette/third_party/bsdiff_apply.cc | 41 |
4 files changed, 59 insertions, 11 deletions
diff --git a/courgette/disassembler_elf_32.h b/courgette/disassembler_elf_32.h index 5c3f8a2..b1832dc 100644 --- a/courgette/disassembler_elf_32.h +++ b/courgette/disassembler_elf_32.h @@ -47,7 +47,7 @@ class DisassemblerElf32 : public Disassembler { // Misc Section Helpers - const Elf32_Half SectionHeaderCount() const { + Elf32_Half SectionHeaderCount() const { return section_header_table_size_; } @@ -60,13 +60,13 @@ class DisassemblerElf32 : public Disassembler { return OffsetToPointer(SectionHeader(id)->sh_offset); } - const Elf32_Word SectionBodySize(int id) const { + Elf32_Word SectionBodySize(int id) const { return SectionHeader(id)->sh_size; } // Misc Segment Helpers - const Elf32_Half ProgramSegmentHeaderCount() const { + Elf32_Half ProgramSegmentHeaderCount() const { return program_header_table_size_; } @@ -76,22 +76,22 @@ class DisassemblerElf32 : public Disassembler { } // The virtual memory address at which this program segment will be loaded - const Elf32_Addr ProgramSegmentMemoryBegin(int id) const { + Elf32_Addr ProgramSegmentMemoryBegin(int id) const { return ProgramSegmentHeader(id)->p_vaddr; } // The number of virtual memory bytes for this program segment - const Elf32_Word ProgramSegmentMemorySize(int id) const { + Elf32_Word ProgramSegmentMemorySize(int id) const { return ProgramSegmentHeader(id)->p_memsz; } // Pointer into the source file for this program segment - const Elf32_Addr ProgramSegmentFileOffset(int id) const { + Elf32_Addr ProgramSegmentFileOffset(int id) const { return ProgramSegmentHeader(id)->p_offset; } // Number of file bytes for this program segment. Is <= ProgramMemorySize. - const Elf32_Word ProgramSegmentFileSize(int id) const { + Elf32_Word ProgramSegmentFileSize(int id) const { return ProgramSegmentHeader(id)->p_filesz; } diff --git a/courgette/disassembler_elf_32_x86.h b/courgette/disassembler_elf_32_x86.h index 6096781..28de7cf 100644 --- a/courgette/disassembler_elf_32_x86.h +++ b/courgette/disassembler_elf_32_x86.h @@ -23,13 +23,12 @@ class DisassemblerElf32X86 : public DisassemblerElf32 { virtual e_machine_values ElfEM() { return EM_386; } protected: - virtual CheckBool RelToRVA(Elf32_Rel rel, RVA* result) - const WARN_UNUSED_RESULT; + const WARN_UNUSED_RESULT; virtual CheckBool ParseRelocationSection( const Elf32_Shdr *section_header, - AssemblyProgram* program) WARN_UNUSED_RESULT; + AssemblyProgram* program) WARN_UNUSED_RESULT; virtual CheckBool ParseRel32RelocsFromSection( const Elf32_Shdr* section) WARN_UNUSED_RESULT; diff --git a/courgette/third_party/bsdiff.h b/courgette/third_party/bsdiff.h index 5e5683a..77897a8 100644 --- a/courgette/third_party/bsdiff.h +++ b/courgette/third_party/bsdiff.h @@ -30,12 +30,15 @@ * 2009-03-31 - Change to use Streams. Move CRC code to crc.{h,cc} * Changed status to an enum, removed unused status codes. * --Stephen Adams <sra@chromium.org> + * 2013-04-10 - Added wrapper to apply a patch directly to files. + * --Joshua Pawlicki <waffles@chromium.org> */ #ifndef COURGETTE_BSDIFF_H_ #define COURGETTE_BSDIFF_H_ #include "base/basictypes.h" +#include "base/file_util.h" namespace courgette { @@ -44,7 +47,8 @@ enum BSDiffStatus { MEM_ERROR = 1, CRC_ERROR = 2, READ_ERROR = 3, - UNEXPECTED_ERROR = 4 + UNEXPECTED_ERROR = 4, + WRITE_ERROR = 5 }; class SourceStream; @@ -64,6 +68,10 @@ BSDiffStatus ApplyBinaryPatch(SourceStream* old_stream, SourceStream* patch_stream, SinkStream* new_stream); +// As above, but simply takes the file paths. +BSDiffStatus ApplyBinaryPatch(const base::FilePath& old_stream, + const base::FilePath& patch_stream, + const base::FilePath& new_stream); // The following declarations are common to the patch-creation and // patch-application code. diff --git a/courgette/third_party/bsdiff_apply.cc b/courgette/third_party/bsdiff_apply.cc index 762c12c..3ed346e 100644 --- a/courgette/third_party/bsdiff_apply.cc +++ b/courgette/third_party/bsdiff_apply.cc @@ -26,6 +26,8 @@ * Changelog: * 2009-03-31 - Change to use Streams. Move CRC code to crc.{h,cc} * --Stephen Adams <sra@chromium.org> + * 2013-04-10 - Add wrapper method to apply a patch to files directly. + * --Joshua Pawlicki <waffles@chromium.org> */ // Copyright (c) 2009 The Chromium Authors. All rights reserved. @@ -34,6 +36,7 @@ #include "courgette/third_party/bsdiff.h" +#include "base/files/memory_mapped_file.h" #include "courgette/crc.h" #include "courgette/streams.h" @@ -168,4 +171,42 @@ BSDiffStatus ApplyBinaryPatch(SourceStream* old_stream, return OK; } +BSDiffStatus ApplyBinaryPatch(const base::FilePath& old_file_path, + const base::FilePath& patch_file_path, + const base::FilePath& new_file_path) { + // Set up the old stream. + base::MemoryMappedFile old_file; + if (!old_file.Initialize(old_file_path)) { + return READ_ERROR; + } + SourceStream old_file_stream; + old_file_stream.Init(old_file.data(), old_file.length()); + + // Set up the patch stream. + base::MemoryMappedFile patch_file; + if (!patch_file.Initialize(patch_file_path)) { + return READ_ERROR; + } + SourceStream patch_file_stream; + patch_file_stream.Init(patch_file.data(), patch_file.length()); + + // Set up the new stream and apply the patch. + SinkStream new_sink_stream; + BSDiffStatus status = ApplyBinaryPatch(&old_file_stream, + &patch_file_stream, + &new_sink_stream); + if (status != OK) { + return status; + } + + // Write the stream to disk. + int written = file_util::WriteFile( + new_file_path, + reinterpret_cast<const char*>(new_sink_stream.Buffer()), + static_cast<int>(new_sink_stream.Length())); + if (written != static_cast<int>(new_sink_stream.Length())) + return WRITE_ERROR; + return OK; +} + } // namespace |