// Copyright (c) 2006, Google Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
//     * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
//     * 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.
//     * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "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 COPYRIGHT
// OWNER OR CONTRIBUTORS 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.

// minidump_file_writer.cc: Minidump file writer implementation.
//
// See minidump_file_writer.h for documentation.

#include <fcntl.h>
#include <limits.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>

#include "client/minidump_file_writer-inl.h"
#include "common/linux/linux_libc_support.h"
#include "common/string_conversion.h"
#if defined(__linux__) && __linux__
#include "third_party/lss/linux_syscall_support.h"
#endif

#if defined(__ANDROID__)
#include <errno.h>

namespace {

bool g_need_ftruncate_workaround = false;
bool g_checked_need_ftruncate_workaround = false;

void CheckNeedsFTruncateWorkAround(int file) {
  if (g_checked_need_ftruncate_workaround) {
    return;
  }
  g_checked_need_ftruncate_workaround = true;

  // Attempt an idempotent truncate that chops off nothing and see if we
  // run into any sort of errors.
  off_t offset = sys_lseek(file, 0, SEEK_END);
  if (offset == -1) {
    // lseek failed. Don't apply work around. It's unlikely that we can write
    // to a minidump with either method.
    return;
  }

  int result = ftruncate(file, offset);
  if (result == -1 && errno == EACCES) {
    // It very likely that we are running into the kernel bug in M devices.
    // We are going to deploy the workaround for writing minidump files
    // without uses of ftruncate(). This workaround should be fine even
    // for kernels without the bug.
    // See http://crbug.com/542840 for more details.
    g_need_ftruncate_workaround = true;
  }
}

bool NeedsFTruncateWorkAround() {
  return g_need_ftruncate_workaround;
}

}  // namespace
#endif  // defined(__ANDROID__)

namespace google_breakpad {

const MDRVA MinidumpFileWriter::kInvalidMDRVA = static_cast<MDRVA>(-1);

MinidumpFileWriter::MinidumpFileWriter()
    : file_(-1),
      close_file_when_destroyed_(true),
      position_(0),
      size_(0) {
}

MinidumpFileWriter::~MinidumpFileWriter() {
  if (close_file_when_destroyed_)
    Close();
}

bool MinidumpFileWriter::Open(const char* path) {
  assert(file_ == -1);
#if defined(__linux__) && __linux__
  file_ = sys_open(path, O_WRONLY | O_CREAT | O_EXCL, 0600);
#else
  file_ = open(path, O_WRONLY | O_CREAT | O_EXCL, 0600);
#endif

  return file_ != -1;
}

void MinidumpFileWriter::SetFile(const int file) {
  assert(file_ == -1);
  file_ = file;
  close_file_when_destroyed_ = false;
#if defined(__ANDROID__)
  CheckNeedsFTruncateWorkAround(file);
#endif
}

bool MinidumpFileWriter::Close() {
  bool result = true;

  if (file_ != -1) {
#if defined(__ANDROID__)
    if (!NeedsFTruncateWorkAround() && ftruncate(file_, position_)) {
       return false;
    }
#else
    if (ftruncate(file_, position_)) {
       return false;
    }
#endif
#if defined(__linux__) && __linux__
    result = (sys_close(file_) == 0);
#else
    result = (close(file_) == 0);
#endif
    file_ = -1;
  }

  return result;
}

bool MinidumpFileWriter::CopyStringToMDString(const wchar_t* str,
                                              unsigned int length,
                                              TypedMDRVA<MDString>* mdstring) {
  bool result = true;
  if (sizeof(wchar_t) == sizeof(uint16_t)) {
    // Shortcut if wchar_t is the same size as MDString's buffer
    result = mdstring->Copy(str, mdstring->get()->length);
  } else {
    uint16_t out[2];
    int out_idx = 0;

    // Copy the string character by character
    while (length && result) {
      UTF32ToUTF16Char(*str, out);
      if (!out[0])
        return false;

      // Process one character at a time
      --length;
      ++str;

      // Append the one or two UTF-16 characters.  The first one will be non-
      // zero, but the second one may be zero, depending on the conversion from
      // UTF-32.
      int out_count = out[1] ? 2 : 1;
      size_t out_size = sizeof(uint16_t) * out_count;
      result = mdstring->CopyIndexAfterObject(out_idx, out, out_size);
      out_idx += out_count;
    }
  }
  return result;
}

bool MinidumpFileWriter::CopyStringToMDString(const char* str,
                                              unsigned int length,
                                              TypedMDRVA<MDString>* mdstring) {
  bool result = true;
  uint16_t out[2];
  int out_idx = 0;

  // Copy the string character by character
  while (length && result) {
    int conversion_count = UTF8ToUTF16Char(str, length, out);
    if (!conversion_count)
      return false;

    // Move the pointer along based on the nubmer of converted characters
    length -= conversion_count;
    str += conversion_count;

    // Append the one or two UTF-16 characters
    int out_count = out[1] ? 2 : 1;
    size_t out_size = sizeof(uint16_t) * out_count;
    result = mdstring->CopyIndexAfterObject(out_idx, out, out_size);
    out_idx += out_count;
  }
  return result;
}

template <typename CharType>
bool MinidumpFileWriter::WriteStringCore(const CharType* str,
                                         unsigned int length,
                                         MDLocationDescriptor* location) {
  assert(str);
  assert(location);
  // Calculate the mdstring length by either limiting to |length| as passed in
  // or by finding the location of the NULL character.
  unsigned int mdstring_length = 0;
  if (!length)
    length = INT_MAX;
  for (; mdstring_length < length && str[mdstring_length]; ++mdstring_length)
    ;

  // Allocate the string buffer
  TypedMDRVA<MDString> mdstring(this);
  if (!mdstring.AllocateObjectAndArray(mdstring_length + 1, sizeof(uint16_t)))
    return false;

  // Set length excluding the NULL and copy the string
  mdstring.get()->length =
      static_cast<uint32_t>(mdstring_length * sizeof(uint16_t));
  bool result = CopyStringToMDString(str, mdstring_length, &mdstring);

  // NULL terminate
  if (result) {
    uint16_t ch = 0;
    result = mdstring.CopyIndexAfterObject(mdstring_length, &ch, sizeof(ch));

    if (result)
      *location = mdstring.location();
  }

  return result;
}

bool MinidumpFileWriter::WriteString(const wchar_t* str, unsigned int length,
                                     MDLocationDescriptor* location) {
  return WriteStringCore(str, length, location);
}

bool MinidumpFileWriter::WriteString(const char* str, unsigned int length,
                                     MDLocationDescriptor* location) {
  return WriteStringCore(str, length, location);
}

bool MinidumpFileWriter::WriteMemory(const void* src, size_t size,
                                     MDMemoryDescriptor* output) {
  assert(src);
  assert(output);
  UntypedMDRVA mem(this);

  if (!mem.Allocate(size))
    return false;
  if (!mem.Copy(src, mem.size()))
    return false;

  output->start_of_memory_range = reinterpret_cast<uint64_t>(src);
  output->memory = mem.location();

  return true;
}

MDRVA MinidumpFileWriter::Allocate(size_t size) {
  assert(size);
  assert(file_ != -1);
#if defined(__ANDROID__)
  if (NeedsFTruncateWorkAround()) {
    // If ftruncate() is not available. We simply increase the size beyond the
    // current file size. sys_write() will expand the file when data is written
    // to it. Because we did not over allocate to fit memory pages, we also
    // do not need to ftruncate() the file once we are done.
    size_ += size;

    // We don't need to seek since the file is unchanged.
    MDRVA current_position = position_;
    position_ += static_cast<MDRVA>(size);
    return current_position;
  }
#endif
  size_t aligned_size = (size + 7) & ~7;  // 64-bit alignment

  if (position_ + aligned_size > size_) {
    size_t growth = aligned_size;
    size_t minimal_growth = getpagesize();

    // Ensure that the file grows by at least the size of a memory page
    if (growth < minimal_growth)
      growth = minimal_growth;

    size_t new_size = size_ + growth;
    if (ftruncate(file_, new_size) != 0)
      return kInvalidMDRVA;

    size_ = new_size;
  }

  MDRVA current_position = position_;
  position_ += static_cast<MDRVA>(aligned_size);

  return current_position;
}

bool MinidumpFileWriter::Copy(MDRVA position, const void* src, ssize_t size) {
  assert(src);
  assert(size);
  assert(file_ != -1);

  // Ensure that the data will fit in the allocated space
  if (static_cast<size_t>(size + position) > size_)
    return false;

  // Seek and write the data
#if defined(__linux__) && __linux__
  if (sys_lseek(file_, position, SEEK_SET) == static_cast<off_t>(position)) {
    if (sys_write(file_, src, size) == size) {
      return true;
    }
  }
#else
  if (lseek(file_, position, SEEK_SET) == static_cast<off_t>(position)) {
    if (write(file_, src, size) == size) {
      return true;
    }
  }
#endif
  return false;
}

bool UntypedMDRVA::Allocate(size_t size) {
  assert(size_ == 0);
  size_ = size;
  position_ = writer_->Allocate(size_);
  return position_ != MinidumpFileWriter::kInvalidMDRVA;
}

bool UntypedMDRVA::Copy(MDRVA pos, const void* src, size_t size) {
  assert(src);
  assert(size);
  assert(pos + size <= position_ + size_);
  return writer_->Copy(pos, src, size);
}

}  // namespace google_breakpad
