crashpad/util/linux/scoped_ptrace_attach.h
Joshua Peraza 20cbfa4971 linux: Use mmap for attachments in PtraceBroker
The broker attempts to use sbrk() to allocate memory to track ptrace
attachments. If the process failed due to an OOM, this system call might
fail, the broker falls back to saving attachments on the stack, and then
overruns the stack.

This change updates the broker to use sys_mmap() instead of sbrk(),
which is expected to work at least as well. If sys_mmap() fails or
the first mapped page is exhausted, further attachments fail without
attempting to save them to the stack.

Bug: chromium:1128441
Change-Id: Ibffaa986403adaf3178ee77e6d210053fbf60f26
Reviewed-on: https://chromium-review.googlesource.com/c/crashpad/crashpad/+/2488280
Reviewed-by: Mark Mentovai <mark@chromium.org>
Commit-Queue: Joshua Peraza <jperaza@chromium.org>
2020-12-03 23:24:55 +00:00

71 lines
2.4 KiB
C++

// Copyright 2017 The Crashpad Authors. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#ifndef CRASHPAD_UTIL_LINUX_SCOPED_PTRACE_ATTACH_H_
#define CRASHPAD_UTIL_LINUX_SCOPED_PTRACE_ATTACH_H_
#include <sys/types.h>
#include "base/macros.h"
namespace crashpad {
//! \brief Attaches to the process with process ID \a pid and blocks until the
//! target process has stopped by calling `waitpid()`.
//!
//! \param pid The process ID of the process to attach to.
//! \param can_log Whether this function may log messages on failure.
//! \return `true` on success. `false` on failure with a message logged if \a
//! can_log is `true`.
bool PtraceAttach(pid_t pid, bool can_log = true);
//! \brief Detaches the process with process ID \a pid. The process must
//! already be ptrace attached.
//!
//! \param pid The process ID of the process to detach.
//! \param can_log Whether this function may log messages on failure.
//! \return `true` on success. `false` on failure with a message logged if \a
//! ca_log is `true `true`
bool PtraceDetach(pid_t pid, bool can_log = true);
//! \brief Maintains a `ptrace()` attachment to a process.
//!
//! On destruction, the process will be detached.
class ScopedPtraceAttach {
public:
ScopedPtraceAttach();
~ScopedPtraceAttach();
//! \brief Detaches from the process by calling `ptrace()`.
//!
//! \return `true` on success. `false` on failure, with a message logged.
bool Reset();
//! \brief Detaches from any previously attached process, attaches to the
//! process with process ID \a pid, and blocks until the target process
//! has stopped by calling `waitpid()`.
//!
//! \return `true` on success. `false` on failure, with a message logged.
bool ResetAttach(pid_t pid);
private:
pid_t pid_;
DISALLOW_COPY_AND_ASSIGN(ScopedPtraceAttach);
};
} // namespace crashpad
#endif // CRASHPAD_UTIL_LINUX_SCOPED_PTRACE_ATTACH_H_