2424 Commits

Author SHA1 Message Date
Mark Mentovai
554e75422c MachMessageServer::Interface implementations: minor cleanups.
R=rsesek@chromium.org

Review URL: https://codereview.chromium.org/799463003
2014-12-15 14:47:47 -05:00
Mark Mentovai
dc22dc405d Fix run_tests to always run from the crashpad directory.
BUG=4
R=scottmg@chromium.org

Review URL: https://codereview.chromium.org/799073002
2014-12-12 17:16:11 -05:00
Scott Graham
5c59a1fa18 Roll mini_chromium to 001bf11...
And another roll to get to mini_chromium to HEAD.

R=mark@chromium.org
TBR=mark@chromium.org
BUG=crashpad:1

Review URL: https://codereview.chromium.org/799923005
2014-12-12 12:23:42 -08:00
Scott Graham
8d0e213213 Add test runner script for integration with the waterfall
R=mark@chromium.org

Review URL: https://codereview.chromium.org/800983002
2014-12-12 11:48:42 -08:00
Scott Graham
af07f4022b Move string16 and char16 in to base::
Needs to include roll with https://codereview.chromium.org/803593002/ included.

R=mark@chromium.org

Review URL: https://codereview.chromium.org/804593002
2014-12-12 11:06:09 -08:00
Scott Graham
1c4084fc2d Roll mini_chromium to 9427a67...
To pick up progress on compiling base on Windows.

TBR=mark@chromium.org
BUG=crashpad:1

Review URL: https://codereview.chromium.org/790343004
2014-12-11 16:31:40 -08:00
Scott Graham
f721df692e Revert 'Roll mini_chromium DEPS to a1fa3c5...'
mini_chromium rev broken, will fix and re-roll.

TBR=mark@chromium.org

Review URL: https://codereview.chromium.org/797553003
2014-12-11 14:41:51 -08:00
Scott Graham
c46dd63762 Roll mini_chromium DEPS to a1fa3c5...
Want to roll the mini_chromium changes in little chunks as the bot
doesn't otherwise build them, to avoid leaving something broken
for a while.

R=mark@chromium.org
TBR=mark@chromium.org
BUG=crashpad:1

Review URL: https://codereview.chromium.org/796113002
2014-12-11 14:33:34 -08:00
Mark Mentovai
508a33dc7a exc_server_variants: Templatize and use CompositeMachMessageServer.
The implementations for the exc and mach_exc subsystems were nearly
identical, and were a good target for templatization. The existing
split between exc and mach_exc was a good candidate for unification
based on CompositeMachMessageServer instead of the custom unification
previously done in UniversalMachMessageServer.

TEST=util_test ExcServerVariants.*
R=rsesek@chromium.org

Review URL: https://codereview.chromium.org/766193006
2014-12-11 14:29:42 -05:00
Mark Mentovai
302c87c6e5 Use GYP rules instead of actions to run mig.
TEST=util_test
R=rsesek@chromium.org

Review URL: https://codereview.chromium.org/793323003
2014-12-11 11:27:18 -05:00
Scott Graham
012ddc9752 win: Add compat header for sys/types.h
To add definition of ssize_t. Uses #include <../include/...> to
emulate #include_next, similar to the mac headers.

BUG=crashpad:1
R=mark@chromium.org

Review URL: https://codereview.chromium.org/793013002
2014-12-10 11:39:50 -08:00
Mark Mentovai
c874958fd0 MachMessageServer: eliminate argument redundancy.
MachMessageServer::Run()’s distinct |nonblocking| parameter is removed.
The information it formerly conveyed is now implied by the |timeout_ms|
parameter, which can accept two special values,
kMachMessageTimeoutNonblocking and kMachMessageTimeoutWaitIndefinitely.

TEST=client_test, snapshot_test, util_test
R=rsesek@chromium.org

Review URL: https://codereview.chromium.org/777993002
2014-12-10 11:11:21 -05:00
Mark Mentovai
22b2f0cad7 tools: Use hyphens instead of underscores for multi-word option names.
Option names like --mach-service are easier to type than --mach_service.
Command-line tools don’t necessarily have the most ergonomic interfaces
anyway, but this is an improvement.

R=rsesek@chromium.org

Review URL: https://codereview.chromium.org/774763006
2014-12-04 16:46:12 -05:00
Mark Mentovai
c83e773c33 Add CompositeMachMessageServer and its test.
TEST=util_test CompositeMachMessageServer*
R=rsesek@chromium.org

Review URL: https://codereview.chromium.org/781823002
2014-12-04 16:45:02 -05:00
Mark Mentovai
821ed8fe0f UniversalMachExcServer: eliminate multiple implementation inheritance.
UniversalMachExcServer provided both an interface and an implementation,
contrary to the other classes in the exc_server_variants family. This
was mostly done for reasons of economy in an already-large class family.
Unfortunately, this decision meant that it was impossible for other code
to use UniversalMachExcServer, which required that CatchMachException()
be implemented, and also extend another class without violating the
style guide’s prohibition of multiple implementation inheritance. This
became a problem in a lot of test code, which extended MachMultiprocess
and UniversalMachExcServer.

UniversalMachExcServer is now given its own nested Interface class,
which is a pure interface. All users of UniversalMachExcServer are
changed from “is-a” UniversalMachExcServer to “has-a”
UniversalMachExcServer and “is-a” UniversalMachExcServer::Interface.

TEST=client_test, snapshot_test, util_test
R=rsesek@chromium.org

Review URL: https://codereview.chromium.org/775943005
2014-12-04 10:18:24 -05:00
Mark Mentovai
86588c5526 MachMessageServer: scribble over memory allocations in debug mode.
This exposed a bug in the ExcClientVariants test, which was expecting
the memory used for new_state to be initialized with zeroes. In reality,
no guarantee of initialization is made. MIG “out” parameters are
strictly “out” and may contain garbage at function entry.

TEST=util_test
R=rsesek@chromium.org

Review URL: https://codereview.chromium.org/779633004
2014-12-03 18:24:27 -05:00
Mark Mentovai
9f520e3fbf MachMessageServer: add some DCHECKs.
These DCHECKs make sure that buffer sizes and message sizes are as
expected.

TEST=util_test MachMessageServer.*
R=rsesek@chromium.org

Review URL: https://codereview.chromium.org/781593003
2014-12-03 18:21:00 -05:00
Mark Mentovai
ef0b7cf6d5 Rewrite MachMessageServer::Run().
This method is now much more straightforward, easy to understand, and
maintainable.

There are no externally-visible changes.

TEST=util_test MachMessageServer.*
R=rsesek@chromium.org

Review URL: https://codereview.chromium.org/723853003
2014-12-03 16:45:48 -05:00
Mark Mentovai
8593b1aa55 ChildPortHandshake: 10.6 fix.
The F_SETNOSIGPIPE fcntl() command is not available on 10.6. Use
socketpair() instead of pipe(), so that the SO_NOSIGPIPE socket option
can be used.

TEST=util_test ChildPortHandshake.*
R=rsesek@chromium.org

Review URL: https://codereview.chromium.org/777573002
2014-12-03 13:42:06 -05:00
Mark Mentovai
eee9de7361 MachMessageWithDeadline(): 10.6 SDK fix.
In the pre-C++11 10.6 SDK, std::numeric_limits<>::max() is not marked
constexpr and cannot be used to initialize enum elements.

R=rsesek@chromium.org

Review URL: https://codereview.chromium.org/771183003
2014-12-02 18:37:31 -05:00
Mark Mentovai
dce497446e Add MachMessageWithDeadline() and supporting characters.
MachMessageWithDeadline() is a mach_msg() wrapper that deals with
deadlines instead of timeouts. It is a slight simplification of the
mach_msg() interface because the deadline parameter implies the timeout
option bits, and because the caller does not need to specify send_size
during sends as the message itself already carries this information.

TEST=util_test MachMessage.MachMessageDeadlineFromTimeout
R=rsesek@chromium.org

Review URL: https://codereview.chromium.org/773943002
2014-12-02 17:09:08 -05:00
Mark Mentovai
c0d5d87785 Move mach_message_util.* to mach_message.*.
A subsequent change will add MachMessageWithDeadline(), a mach_msg()
wrapper. Conceptually, it makes sense to include that function in this
file family. Since this file family now contains a mach_msg() wrapper,
it makes sense to rename it mach_message and lose the _util suffix.

R=rsesek@chromium.org

Review URL: https://codereview.chromium.org/772133004
2014-12-02 17:02:32 -05:00
Mark Mentovai
49f170e633 MachMessageServer: handle allocations more reasonably.
MachMessageServer was wasteful with allocations for request and reply
messages. It allocated new memory for each request receive and for each
reply send, and if it needed to resize an allocation for a request, it
would maintain two request allocations simultaneously. The new behavior
allocates memory for a new request only if it needs a different size
than for the previous request, and it never maintains two request
allocations simultaneously. Memory for a reply is allocated once per
method invocation and maintained, since this never needs to be resized.

One pass of the loop is now guaranteed, even if a caller specifies a
very small timeout that expires before attempting to receive a message.

An infinite looping bug that could occur when ignoring large messages
has also been fixed.

TEST=util_test MachMessageServer.*
R=rsesek@chromium.org

Review URL: https://codereview.chromium.org/759023004
2014-12-01 16:13:40 -05:00
Mark Mentovai
50726ac8d0 Undo a68594234262.
The buffer sizing logic was correct to start with. I don’t know why I
misread it. It should say “if this would resize to receive a large
message, use the entire allocation rounded up to full page size,
otherwise, only use the space expected for a message.”

TEST=util_test
R=rsesek@chromium.org

Review URL: https://codereview.chromium.org/760573003
2014-12-01 16:12:10 -05:00
Mark Mentovai
0437bc53b6 Pass Mach message trailers to server handler functions.
TEST=util_test ChildPortServer.*:ExcServerVariants.*:MachMessageUtil.*
R=rsesek@chromium.org

Review URL: https://codereview.chromium.org/755313004
2014-12-01 16:06:56 -05:00
Mark Mentovai
de5a6cdd6f ExcServerVariants test: use constructors to initialize test structures.
Previously, test structures were initialized with InitializeForTesting()
methods. A related code review suggested making these into constructors.

https://codereview.chromium.org/754123002/diff/40001/util/mach/child_port_server_test.cc#newcode53

This also cleans up the definitions of some structures that can simply
inherit from existing structures defined in system headers.

TEST=util_test ExcServerVariants.*
R=rsesek@chromium.org

Review URL: https://codereview.chromium.org/757113002
2014-11-25 15:06:42 -05:00
Mark Mentovai
d14fa0961a ExcServerVariants test: make the mock test port dispositions reflect reality.
These port dispositions were naïvely taken from excUser.c and
mach_excUser.c, but the local and remote portions were not swapped as
they would be upon receipt in a server. This swaps them to match how
they’d be visible in a server, and uses the port disposition name
aliases expected to be used in servers: MACH_MSG_TYPE_PORT_* instead of
MACH_MSG_TYPE_{MAKE,COPY,MOVE}_*.

TEST=util_test ExcServerVariants.*
R=rsesek@chromium.org

Review URL: https://codereview.chromium.org/755323002
2014-11-25 15:05:29 -05:00
Mark Mentovai
a685942342 MachMessageServer: invert the request buffer allocation logic.
The existing implementation used the same logic as is found in
mach_msg_server(), but that logic seems incorrect. When the caller wants
to retry a mach_msg() receive of a too-large message that returns
MACH_RCV_TOO_LARGE, there’s no harm in attempting the receive with a
larger buffer initially. On the other hand, if the caller does not want
to retry such mach_msg() receive attempts, it’s an indication that the
caller is expecting to be intolerant of too-large messages, and there’s
no need to attempt the receive with a buffer any larger than requested.

TEST=util_test
R=rsesek@chromium.org

Review URL: https://codereview.chromium.org/753363003
2014-11-25 15:04:31 -05:00
Mark Mentovai
306625dac4 MachMessageServer: don’t deal with MACH_SEND_TRAILER.
As documented, MACH_SEND_TRAILER would allow a sender to provide its own
message trailer instead of having the kernel append its own
kernel-generated trailer. This is a Mach feature that supports a network
of multiple Mach hosts, but even in that environment, the option is
restricted to use by privileged callers. In reality, MACH_SEND_TRAILER
has never been implemented in OS X.

The system’s mach_msg_server() family does consider the value of
MACH_SEND_TRAILER, but this is pointless. Any purported trailer set by a
server function would be ignored.

Maintaining this code gives the illusion that it’s functional, so it’s
being removed.

TEST=util_test MachMessageServer.*
R=rsesek@chromium.org

Review URL: https://codereview.chromium.org/736493007
2014-11-25 15:00:13 -05:00
Mark Mentovai
85c9318597 Add ChildPortHandshake and its test.
ChildPortHandshake is the most generic system yet to allow child
processes to provide their parents with Mach rights. These are
ordinarily expected to be send rights to the children’s own task ports,
or send rights to servers that the children hold receive rights to.

This updates DEPS to pull mini_chromium 1d3523dbda93, which includes
base::mac::ScopedMachPortSet.

TEST=util_test ChildPortHandshake.*
R=rsesek@chromium.org

Review URL: https://codereview.chromium.org/756603003
2014-11-25 14:56:05 -05:00
Mark Mentovai
79b4434c81 Add a ReceiveLarge parameter to MachMessageServer::Run().
Previously, MachMessageServer::Run() only provided two strategies for
dealing with large messages, indicated by mach_msg() returning
MACH_RCV_TOO_LARGE: the receive buffer could be reallocated and the
message received, or the entire function could return MACH_RCV_TOO_LARGE
to the caller. There are situations where an intermediate behavior might
be desirable. This intermediate behavior would allow the function to
continue waiting for another message without returning an error to the
caller or attempting to receive the large message. This is desirable
when dealing with fixed-sized messages and a receiver that might be sent
messages by unknown, possibly-malicious callers. This can happen when
the corresponding send right is published with the bootstrap server, for
example.

Existing users continue to request their existing behavior, typically
receiving an error when encountering a large message.
catch_exception_tool will use the new “ignore” behavior when running in
persistent mode.

TEST=util_test MachMessageServer.*
R=rsesek@chromium.org

Review URL: https://codereview.chromium.org/756803002
2014-11-25 14:48:44 -05:00
Mark Mentovai
04aaa36026 Add ChildPortServer, a MachMessageServer::Interface implementation for
the child_port subsystem.

Common routines shared with the ExcServer family of classes have been
moved to a new file, where they can be shared between different
MachMessageServer::Interface implementations.

TEST=util_test ChildPortServer.*:MachMessageUtil.*
R=rsesek@chromium.org

Review URL: https://codereview.chromium.org/754123002
2014-11-25 14:29:46 -05:00
Mark Mentovai
af1c7eb098 Add Logging{Read,Write}FD() and CheckedCloseFD().
R=rsesek@chromium.org

Review URL: https://codereview.chromium.org/756653004
2014-11-24 15:49:33 -05:00
Mark Mentovai
e9482a704d Add the child_port Mach subsystem.
R=rsesek@chromium.org

Review URL: https://codereview.chromium.org/752243002
2014-11-24 15:48:10 -05:00
Mark Mentovai
e4551e709c exc_server_variants: use DISALLOW_COPY_AND_ASSIGN.
TEST=util_test ExcServerVariants.*
R=rsesek@chromium.org

Review URL: https://codereview.chromium.org/753563003
2014-11-21 14:29:42 -05:00
Mark Mentovai
d0212ebaee Update gtest and gmock to the latest versions.
In b6a0183ccec7, gtest and gmock were held back at older versions with
limited C++11 support, because the then-current heads of each did not
work well in environments with C++11 language support but pre-C++11
library support. This is the environment that Chrome code for Mac builds
in. All necessary patches for this have been merged upstream, and this
has been corrected in the current released versions of gtest and gmock.

TEST=*
R=rsesek@chromium.org

Review URL: https://codereview.chromium.org/731473007
2014-11-19 11:37:26 -05:00
Mark Mentovai
d5b28d6236 Add comments in DropPrivileges() explaining the kernel bug further.
R=rsesek@chromium.org

Review URL: https://codereview.chromium.org/725303003
2014-11-17 12:24:38 -05:00
Mark Mentovai
09d3a6c695 Add the generate_dump tool.
R=rsesek@chromium.org

Review URL: https://codereview.chromium.org/727983002
2014-11-14 19:21:43 -05:00
Mark Mentovai
49d7fdba9a Add DropPrivileges().
DropPrivileges() is used in exception_port_tool, so that when it is
installed as a setuid executable, it only uses elevated privileges to
obtain a task port for its -p option, and then relinquishes those
privileges.

It is difficult to provide a test for this function, because it must be
running setuid or setgid in order to do anything interesting. However,
the function contains its own CHECKs to verify that it behaves properly.

R=rsesek@chromium.org

Review URL: https://codereview.chromium.org/727053002
2014-11-14 18:44:19 -05:00
Mark Mentovai
de3c46c6b3 Add TaskForPID().
This also transitions exception_port_tool to use TaskForPID(), so that
it can be safely used as a setuid executable without giving permission
to operate on any process on the system.

It is difficult to provide a test for this function, because it must be
running setuid root in order to do anything interesting.

R=rsesek@chromium.org

Review URL: https://codereview.chromium.org/728973002
2014-11-14 17:56:17 -05:00
Mark Mentovai
6812cec67e Move some parts of ProcessReader (in snapshot) to ProcessInfo (in util).
Also, move ProcessArgumentsForPID() into ProcessInfo.

This change prepares for a TaskForPID() implementation that’s capable of
operating correctly in a setuid root executable. TaskForPID() belongs in
util/mach, but for its permission checks, it must access some process
properties that were previously fetched by ProcessReader in snapshot.
util can’t depend on snapshot. The generic util-safe process information
bits (Is64Bit(), ProcessID(), ParentProcessID(), and StartTime()) are
moved from ProcessReader to ProcessInfo (in util), where the current
ProcessReader can use it (as it’s OK for snapshot to depend on util),
and the future TaskForPID() in util can also use it. ProcessInfo also
contains other methods that TaskForPID() will use, providing access to
the credentials that the target process holds. ProcessArgumentsForPID()
is related, and is also now a part of ProcessInfo.

TEST=snapshot_test, util_test
R=rsesek@chromium.org

Review URL: https://codereview.chromium.org/727973002
2014-11-14 17:54:42 -05:00
Mark Mentovai
360e441c53 Add MinidumpFileWriter::InitializeFromSnapshot() and its tests.
TEST=minidump_test MinidumpFileWriter.InitializeFromSnapshot*
R=rsesek@chromium.org

Review URL: https://codereview.chromium.org/703223003
2014-11-07 14:47:08 -05:00
Robert Sesek
e5048b3a80 In CompositeHTTPBodyStream, coalesce small GetBytesBuffer()s to better fill the buffer.
R=mark@chromium.org

Review URL: https://codereview.chromium.org/707223002
2014-11-07 12:08:14 -05:00
Mark Mentovai
9386a054e2 minidump: Use the crashpad::internal namespace more appropriately.
MinidumpLocationDescriptorListWriter and MinidumpRVAListWriter are
implementation details and should be in the crashpad::internal
namespace.

MinidumpUTF16StringListWriter and MinidumpUTF8StringListWriter are
accessible to outside code and should not be in this namespace.

TEST=minidump_test
R=rsesek@chromium.org

Review URL: https://codereview.chromium.org/699313007
2014-11-07 11:45:44 -05:00
Mark Mentovai
4a22225fc0 Add MinidumpCrashpadInfoWriter::InitializeFromSnapshot() and its test.
TEST=minidump_test MinidumpCrashpadInfoWriter.InitializeFromSnapshot
R=rsesek@chromium.org

Review URL: https://codereview.chromium.org/703353002
2014-11-07 11:38:13 -05:00
Mark Mentovai
3b1c5bd3b9 Doxygen: only generate documentation for [Objective-]C[++] files.
Doxygen was generating some pretty bogus-looking documentation for
the Python http_transport_test_server, making it look like a C++
namespace and generating mostly useless documentation:

http://docs.crashpad.googlecode.com/git/doxygen/annotated.html

R=rsesek@chromium.org

Review URL: https://codereview.chromium.org/706233003
2014-11-07 11:36:40 -05:00
Mark Mentovai
408262d58f Fix MinidumpMiscInfoWriter test compilation with 32-bit time_t.
This produced errors such as:
minidump_misc_info_writer_test.cc:665:32: error: non-constant-expression
cannot be narrowed from type 'uint32_t' (aka 'unsigned int') to
'__darwin_time_t' (aka 'long') in initializer list [-Wc++11-narrowing]
  const timeval kStartTime = { expect_misc_info.ProcessCreateTime, 0 };
                               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
minidump_misc_info_writer_test.cc:665:32: note: override this message by
inserting an explicit cast
  const timeval kStartTime = { expect_misc_info.ProcessCreateTime, 0 };
                               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                               static_cast<__darwin_time_t>(     )

TEST=minidump_test MinidumpMiscInfoWriter.InitializeFromSnapshot
R=rsesek@chromium.org

Review URL: https://codereview.chromium.org/711603002
2014-11-07 10:02:21 -05:00
Mark Mentovai
1d440d36d6 Add list_annotations to MinidumpModuleCrashpadInfo.
TEST=MinidumpModuleCrashpadInfoWriter.*
R=rsesek@chromium.org

Review URL: https://codereview.chromium.org/705153002
2014-11-07 10:01:17 -05:00
Mark Mentovai
6e97189d27 Add MinidumpStringListWriter and test.
TEST=minidump_test MinidumpStringWriter.*List
R=rsesek@chromium.org

Review URL: https://codereview.chromium.org/707003002
2014-11-07 09:57:07 -05:00
Mark Mentovai
a980409288 Add MinidumpRVAListWriter and test.
This will be used as the foundation for writing a list of
MinidumpUTF8String objects. MinidumpUTF8String (and UTF-16
MINIDUMP_STRING) objects are never referenced by
MINIDUMP_LOCATION_DESCRIPTOR because they carry their own lengths.
Instead, they are always referenced by RVA.

The list of MinidumpUTF8String objects will be used for the module
annotations vector.

TEST=minidump_test MinidumpRVAListWriter.*
R=rsesek@chromium.org

Review URL: https://codereview.chromium.org/704333002
2014-11-07 09:44:09 -05:00