// Copyright (c) 2015 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.

#include "ipc/mojo/ipc_mojo_handle_attachment.h"

#include "ipc/ipc_message_attachment_set.h"
#include "third_party/mojo/src/mojo/edk/embedder/embedder.h"

namespace IPC {
namespace internal {

MojoHandleAttachment::MojoHandleAttachment(mojo::ScopedHandle handle)
    : handle_(handle.Pass()) {
}

MojoHandleAttachment::~MojoHandleAttachment() {
}

MessageAttachment::Type MojoHandleAttachment::GetType() const {
  return TYPE_MOJO_HANDLE;
}

#if defined(OS_POSIX)
base::PlatformFile MojoHandleAttachment::TakePlatformFile() {
  mojo::embedder::ScopedPlatformHandle platform_handle;
  MojoResult unwrap_result = mojo::embedder::PassWrappedPlatformHandle(
      handle_.release().value(), &platform_handle);
  if (unwrap_result != MOJO_RESULT_OK) {
    LOG(ERROR) << "Pipe failed to covert handles. Closing: " << unwrap_result;
    return -1;
  }

  return platform_handle.release().fd;
}
#endif  // OS_POSIX

mojo::ScopedHandle MojoHandleAttachment::TakeHandle() {
  return handle_.Pass();
}

}  // namespace internal
}  // namespace IPC

// Copyright (c) 2015 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.

#include "ipc/mojo/ipc_mojo_handle_attachment.h"

#include "ipc/ipc_message_attachment_set.h"
#include "third_party/mojo/src/mojo/edk/embedder/embedder.h"

namespace IPC {
namespace internal {

MojoHandleAttachment::MojoHandleAttachment(mojo::ScopedHandle handle)
    : handle_(handle.Pass()) {
}

MojoHandleAttachment::~MojoHandleAttachment() {
}

MessageAttachment::Type MojoHandleAttachment::GetType() const {
  return TYPE_MOJO_HANDLE;
}

#if defined(OS_POSIX)
base::PlatformFile MojoHandleAttachment::TakePlatformFile() {
  mojo::embedder::ScopedPlatformHandle platform_handle;
  MojoResult unwrap_result = mojo::embedder::PassWrappedPlatformHandle(
      handle_.get().value(), &platform_handle);
  handle_.reset();
  if (unwrap_result != MOJO_RESULT_OK) {
    LOG(ERROR) << "Pipe failed to covert handles. Closing: " << unwrap_result;
    return -1;
  }

  return platform_handle.release().fd;
}
#endif  // OS_POSIX

mojo::ScopedHandle MojoHandleAttachment::TakeHandle() {
  return handle_.Pass();
}

}  // namespace internal
}  // namespace IPC

Fix leak of PlatformHandleDispatchers in Mojo IPC
Fix leak of PlatformHandleDispatchers in Mojo IPC

PassWrappedPlatformHandle does not close the MojoHandle.
The destructor of ScopedHandleBase will however close it.
The problem with this code was that it called release()
on the ScopedHandle, preventing the destructor from being
called, and thus also the MojoHandle from being closed.

This leaves the PlatformHandleDispatcher associated with
the MojoHandle alive in mojo::system::Core::handle_table_

By calling reset() instead the MojoHandle is closed, and
the leak is fixed.

R=morrita@chromium.org, viettrungluu@chromium.org, agl@chromium.org

BUG=None

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

Cr-Commit-Position: 972c6d2dc6dd5efdad1377c0d224e03eb8f276f7@{#334197}
