summaryrefslogtreecommitdiffstats
path: root/Source/WebKit2/Platform/IPC/unix/ConnectionUnix.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebKit2/Platform/IPC/unix/ConnectionUnix.cpp')
-rw-r--r--Source/WebKit2/Platform/IPC/unix/ConnectionUnix.cpp76
1 files changed, 33 insertions, 43 deletions
diff --git a/Source/WebKit2/Platform/IPC/unix/ConnectionUnix.cpp b/Source/WebKit2/Platform/IPC/unix/ConnectionUnix.cpp
index c39086113..71f2e252f 100644
--- a/Source/WebKit2/Platform/IPC/unix/ConnectionUnix.cpp
+++ b/Source/WebKit2/Platform/IPC/unix/ConnectionUnix.cpp
@@ -135,10 +135,8 @@ private:
void Connection::platformInitialize(Identifier identifier)
{
m_socketDescriptor = identifier;
- m_readBuffer.resize(messageMaxSize);
- m_readBufferSize = 0;
- m_fileDescriptors.resize(attachmentMaxAmount);
- m_fileDescriptorsSize = 0;
+ m_readBuffer.reserveInitialCapacity(messageMaxSize);
+ m_fileDescriptors.reserveInitialCapacity(attachmentMaxAmount);
#if PLATFORM(QT)
m_socketNotifier = 0;
@@ -193,7 +191,7 @@ private:
bool Connection::processMessage()
{
- if (m_readBufferSize < sizeof(MessageInfo))
+ if (m_readBuffer.size() < sizeof(MessageInfo))
return false;
uint8_t* messageData = m_readBuffer.data();
@@ -202,7 +200,7 @@ bool Connection::processMessage()
messageData += sizeof(messageInfo);
size_t messageLength = sizeof(MessageInfo) + messageInfo.attachmentCount() * sizeof(AttachmentInfo) + (messageInfo.isMessageBodyIsOutOfLine() ? 0 : messageInfo.bodySize());
- if (m_readBufferSize < messageLength)
+ if (m_readBuffer.size() < messageLength)
return false;
size_t attachmentFileDescriptorCount = 0;
@@ -283,25 +281,25 @@ bool Connection::processMessage()
processIncomingMessage(WTFMove(decoder));
- if (m_readBufferSize > messageLength) {
- memmove(m_readBuffer.data(), m_readBuffer.data() + messageLength, m_readBufferSize - messageLength);
- m_readBufferSize -= messageLength;
+ if (m_readBuffer.size() > messageLength) {
+ memmove(m_readBuffer.data(), m_readBuffer.data() + messageLength, m_readBuffer.size() - messageLength);
+ m_readBuffer.shrink(m_readBuffer.size() - messageLength);
} else
- m_readBufferSize = 0;
+ m_readBuffer.shrink(0);
if (attachmentFileDescriptorCount) {
- if (m_fileDescriptorsSize > attachmentFileDescriptorCount) {
- memmove(m_fileDescriptors.data(), m_fileDescriptors.data() + attachmentFileDescriptorCount, (m_fileDescriptorsSize - attachmentFileDescriptorCount) * sizeof(int));
- m_fileDescriptorsSize -= attachmentFileDescriptorCount;
+ if (m_fileDescriptors.size() > attachmentFileDescriptorCount) {
+ memmove(m_fileDescriptors.data(), m_fileDescriptors.data() + attachmentFileDescriptorCount, (m_fileDescriptors.size() - attachmentFileDescriptorCount) * sizeof(int));
+ m_fileDescriptors.shrink(m_fileDescriptors.size() - attachmentFileDescriptorCount);
} else
- m_fileDescriptorsSize = 0;
+ m_fileDescriptors.shrink(0);
}
return true;
}
-static ssize_t readBytesFromSocket(int socketDescriptor, uint8_t* buffer, int count, int* fileDescriptors, size_t* fileDescriptorsCount)
+static ssize_t readBytesFromSocket(int socketDescriptor, Vector<uint8_t>& buffer, Vector<int>& fileDescriptors)
{
struct msghdr message;
memset(&message, 0, sizeof(message));
@@ -314,8 +312,10 @@ static ssize_t readBytesFromSocket(int socketDescriptor, uint8_t* buffer, int co
memset(attachmentDescriptorBuffer.get(), 0, sizeof(char) * message.msg_controllen);
message.msg_control = attachmentDescriptorBuffer.get();
- iov[0].iov_base = buffer;
- iov[0].iov_len = count;
+ size_t previousBufferSize = buffer.size();
+ buffer.grow(buffer.capacity());
+ iov[0].iov_base = buffer.data() + previousBufferSize;
+ iov[0].iov_len = buffer.size() - previousBufferSize;
message.msg_iov = iov;
message.msg_iovlen = 1;
@@ -327,33 +327,29 @@ static ssize_t readBytesFromSocket(int socketDescriptor, uint8_t* buffer, int co
if (errno == EINTR)
continue;
+ buffer.shrink(previousBufferSize);
return -1;
}
- bool found = false;
struct cmsghdr* controlMessage;
for (controlMessage = CMSG_FIRSTHDR(&message); controlMessage; controlMessage = CMSG_NXTHDR(&message, controlMessage)) {
if (controlMessage->cmsg_level == SOL_SOCKET && controlMessage->cmsg_type == SCM_RIGHTS) {
- *fileDescriptorsCount = (controlMessage->cmsg_len - CMSG_LEN(0)) / sizeof(int);
- memcpy(fileDescriptors, CMSG_DATA(controlMessage), sizeof(int) * *fileDescriptorsCount);
-
- for (size_t i = 0; i < *fileDescriptorsCount; ++i) {
- while (fcntl(fileDescriptors[i], F_SETFD, FD_CLOEXEC) == -1) {
- if (errno != EINTR) {
- ASSERT_NOT_REACHED();
- break;
- }
+ size_t previousFileDescriptorsSize = fileDescriptors.size();
+ size_t fileDescriptorsCount = (controlMessage->cmsg_len - CMSG_LEN(0)) / sizeof(int);
+ fileDescriptors.grow(fileDescriptors.size() + fileDescriptorsCount);
+ memcpy(fileDescriptors.data() + previousFileDescriptorsSize, CMSG_DATA(controlMessage), sizeof(int) * fileDescriptorsCount);
+
+ for (size_t i = 0; i < fileDescriptorsCount; ++i) {
+ if (!setCloseOnExec(fileDescriptors[previousFileDescriptorsSize + i])) {
+ ASSERT_NOT_REACHED();
+ break;
}
}
-
- found = true;
break;
}
}
- if (!found)
- *fileDescriptorsCount = 0;
-
+ buffer.shrink(previousBufferSize + bytesRead);
return bytesRead;
}
@@ -367,10 +363,7 @@ void Connection::readyReadHandler()
#endif
while (true) {
- size_t fileDescriptorsCount = 0;
- size_t bytesToRead = m_readBuffer.size() - m_readBufferSize;
- ssize_t bytesRead = readBytesFromSocket(m_socketDescriptor, m_readBuffer.data() + m_readBufferSize, bytesToRead,
- m_fileDescriptors.data() + m_fileDescriptorsSize, &fileDescriptorsCount);
+ ssize_t bytesRead = readBytesFromSocket(m_socketDescriptor, m_readBuffer, m_fileDescriptors);
if (bytesRead < 0) {
// EINTR was already handled by readBytesFromSocket.
@@ -384,9 +377,6 @@ void Connection::readyReadHandler()
return;
}
- m_readBufferSize += bytesRead;
- m_fileDescriptorsSize += fileDescriptorsCount;
-
if (!bytesRead) {
connectionDidClose();
return;
@@ -586,14 +576,14 @@ Connection::SocketPair Connection::createPlatformConnection(unsigned options)
if (options & SetCloexecOnServer) {
// Don't expose the child socket to the parent process.
- while (fcntl(sockets[1], F_SETFD, FD_CLOEXEC) == -1)
- RELEASE_ASSERT(errno != EINTR);
+ if (!setCloseOnExec(sockets[1]))
+ RELEASE_ASSERT_NOT_REACHED();
}
if (options & SetCloexecOnClient) {
// Don't expose the parent socket to potential future children.
- while (fcntl(sockets[0], F_SETFD, FD_CLOEXEC) == -1)
- RELEASE_ASSERT(errno != EINTR);
+ if (!setCloseOnExec(sockets[0]))
+ RELEASE_ASSERT_NOT_REACHED();
}
SocketPair socketPair = { sockets[0], sockets[1] };