Import Cobalt 21.master.0.260628
diff --git a/src/components/courgette/courgette.h b/src/components/courgette/courgette.h new file mode 100644 index 0000000..b80c3ca --- /dev/null +++ b/src/components/courgette/courgette.h
@@ -0,0 +1,118 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_COURGETTE_COURGETTE_H_ +#define COMPONENTS_COURGETTE_COURGETTE_H_ + +#include <stddef.h> // Required to define size_t on GCC + +#include "base/files/file.h" +#include "base/files/file_path.h" + +namespace courgette { + +// Status codes for Courgette APIs. +// +// Client code should only rely on the distintion between C_OK and the other +// status codes. +// +enum Status { + C_OK = 1, // Successful operation. + + C_GENERAL_ERROR = 2, // Error other than listed below. + + C_READ_OPEN_ERROR = 3, // Could not open input file for reading. + C_READ_ERROR = 4, // Could not read from opened input file. + + C_WRITE_OPEN_ERROR = 3, // Could not open output file for writing. + C_WRITE_ERROR = 4, // Could not write to opened output file. + + C_BAD_ENSEMBLE_MAGIC = 5, // Ensemble patch has bad magic. + C_BAD_ENSEMBLE_VERSION = 6, // Ensemble patch has wrong version. + C_BAD_ENSEMBLE_HEADER = 7, // Ensemble patch has corrupt header. + C_BAD_ENSEMBLE_CRC = 8, // Ensemble patch has corrupt data. + + C_BAD_TRANSFORM = 12, // Transform mis-specified. + C_BAD_BASE = 13, // Base for transform malformed. + + C_BINARY_DIFF_CRC_ERROR = 14, // Internal diff input doesn't have expected + // CRC. + + // Internal errors. + C_STREAM_ERROR = 20, // Unexpected error from streams.h. + C_STREAM_NOT_CONSUMED = 21, // Stream has extra data, is expected to be + // used up. + C_SERIALIZATION_FAILED = 22, // + C_DESERIALIZATION_FAILED = 23, // + C_INPUT_NOT_RECOGNIZED = 24, // Unrecognized input (not an executable). + C_DISASSEMBLY_FAILED = 25, // + C_ASSEMBLY_FAILED = 26, // + C_ADJUSTMENT_FAILED = 27, // +}; + +// What type of executable is something +// This is part of the patch format. Never reuse an id number. +enum ExecutableType { + EXE_UNKNOWN = 0, + EXE_WIN_32_X86 = 1, + EXE_ELF_32_X86 = 2, + EXE_ELF_32_ARM = 3, + EXE_WIN_32_X64 = 4, +}; + +class SinkStream; +class SinkStreamSet; +class SourceStream; + +class AssemblyProgram; +class EncodedProgram; + +// Applies the patch to the bytes in |old| and writes the transformed ensemble +// to |output|. +// Returns C_OK unless something went wrong. +Status ApplyEnsemblePatch(SourceStream* old, + SourceStream* patch, + SinkStream* output); + +// Applies the patch in |patch_file| to the bytes in |old_file| and writes the +// transformed ensemble to |new_file|. +// Returns C_OK unless something went wrong. +// This function first validates that the patch file has a proper header, so the +// function can be used to 'try' a patch. +Status ApplyEnsemblePatch(base::File old_file, + base::File patch_file, + base::File new_file); + +// Applies the patch in |patch_file_name| to the bytes in |old_file_name| and +// writes the transformed ensemble to |new_file_name|. +// Returns C_OK unless something went wrong. +// This function first validates that the patch file has a proper header, so the +// function can be used to 'try' a patch. +Status ApplyEnsemblePatch(const base::FilePath::CharType* old_file_name, + const base::FilePath::CharType* patch_file_name, + const base::FilePath::CharType* new_file_name); + +// Generates a patch that will transform the bytes in |old| into the bytes in +// |target|. +// Returns C_OK unless something when wrong (unexpected). +Status GenerateEnsemblePatch(SourceStream* old, + SourceStream* target, + SinkStream* patch); + +// Serializes |encoded| into the stream set. +// Returns C_OK if succeeded, otherwise returns an error status. +Status WriteEncodedProgram(EncodedProgram* encoded, SinkStreamSet* sink); + +// Assembles |encoded|, emitting the bytes into |buffer|. +// Returns C_OK if succeeded, otherwise returns an error status and leaves +// |buffer| in an undefined state. +Status Assemble(EncodedProgram* encoded, SinkStream* buffer); + +// Adjusts |program| to look more like |model|. +// +Status Adjust(const AssemblyProgram& model, AssemblyProgram* program); + +} // namespace courgette + +#endif // COMPONENTS_COURGETTE_COURGETTE_H_
diff --git a/src/components/courgette/third_party/bsdiff/bsdiff.h b/src/components/courgette/third_party/bsdiff/bsdiff.h new file mode 100644 index 0000000..4abb860 --- /dev/null +++ b/src/components/courgette/third_party/bsdiff/bsdiff.h
@@ -0,0 +1,107 @@ +// Copyright 2003, 2004 Colin Percival +// All rights reserved +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted providing that the following conditions +// are met: +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +// OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +// IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// +// For the terms under which this work may be distributed, please see +// the adjoining file "LICENSE". +// +// Changelog: +// 2005-04-26 - Define the header as a C structure, add a CRC32 checksum to +// the header, and make all the types 32-bit. +// --Benjamin Smedberg <benjamin@smedbergs.us> +// 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> + +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_COURGETTE_THIRD_PARTY_BSDIFF_BSDIFF_H_ +#define COMPONENTS_COURGETTE_THIRD_PARTY_BSDIFF_BSDIFF_H_ + +#include <stdint.h> + +#include "base/files/file.h" +#include "base/files/file_util.h" + +namespace courgette { +class SourceStream; +class SinkStream; +} // namespace courgette + +namespace bsdiff { + +enum BSDiffStatus { + OK = 0, + MEM_ERROR = 1, + CRC_ERROR = 2, + READ_ERROR = 3, + UNEXPECTED_ERROR = 4, + WRITE_ERROR = 5 +}; + +// Creates a binary patch. +// +BSDiffStatus CreateBinaryPatch(courgette::SourceStream* old_stream, + courgette::SourceStream* new_stream, + courgette::SinkStream* patch_stream); + +// Applies the given patch file to a given source file. This method validates +// the CRC of the original file stored in the patch file, before applying the +// patch to it. +// +BSDiffStatus ApplyBinaryPatch(courgette::SourceStream* old_stream, + courgette::SourceStream* patch_stream, + courgette::SinkStream* new_stream); + +// As above, but simply takes base::Files. +BSDiffStatus ApplyBinaryPatch(base::File old_stream, + base::File patch_stream, + base::File 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. + +// The patch stream starts with a MBSPatchHeader. +typedef struct MBSPatchHeader_ { + char tag[8]; // Contains MBS_PATCH_HEADER_TAG. + uint32_t slen; // Length of the file to be patched. + uint32_t scrc32; // CRC32 of the file to be patched. + uint32_t dlen; // Length of the result file. +} MBSPatchHeader; + +// This is the value for the tag field. Must match length exactly, not counting +// null at end of string. +#define MBS_PATCH_HEADER_TAG "GBSDIF42" + +} // namespace bsdiff + +#endif // COMPONENTS_COURGETTE_THIRD_PARTY_BSDIFF_BSDIFF_H_