Index: base/posix/unix_domain_socket_linux_unittest.cc |
diff --git a/base/posix/unix_domain_socket_linux_unittest.cc b/base/posix/unix_domain_socket_linux_unittest.cc |
index d3082d315713d6906da5ed9dbd4a06b2f29e5a57..7b2e2af23328fb8184b024afcfaf44d6f4c0cc5c 100644 |
--- a/base/posix/unix_domain_socket_linux_unittest.cc |
+++ b/base/posix/unix_domain_socket_linux_unittest.cc |
@@ -134,6 +134,28 @@ TEST(UnixDomainSocketTest, RecvPidWithMaxDescriptors) { |
ASSERT_EQ(getpid(), sender_pid); |
} |
+// Check that RecvMsgWithPid doesn't DCHECK fail when reading EOF from a |
+// disconnected socket. |
+TEST(UnixDomianSocketTest, RecvPidDisconnectedSocket) { |
+ int fds[2]; |
+ ASSERT_EQ(0, socketpair(AF_UNIX, SOCK_SEQPACKET, 0, fds)); |
+ base::ScopedFD recv_sock(fds[0]); |
+ base::ScopedFD send_sock(fds[1]); |
+ |
+ ASSERT_TRUE(UnixDomainSocket::EnableReceiveProcessId(recv_sock.get())); |
+ |
+ send_sock.reset(); |
+ |
+ char ch; |
+ base::ProcessId sender_pid; |
+ ScopedVector<base::ScopedFD> recv_fds; |
+ const ssize_t nread = UnixDomainSocket::RecvMsgWithPid( |
+ recv_sock.get(), &ch, sizeof(ch), &recv_fds, &sender_pid); |
+ ASSERT_EQ(0, nread); |
+ ASSERT_EQ(-1, sender_pid); |
+ ASSERT_EQ(0U, recv_fds.size()); |
+} |
+ |
} // namespace |
} // namespace base |