Changeset 91016 in webkit
- Timestamp:
- Jul 14, 2011 10:52:53 AM (13 years ago)
- Location:
- trunk/Source/WebKit2
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebKit2/ChangeLog
r91015 r91016 1 2011-07-14 Carlos Garcia Campos <cgarcia@igalia.com> 2 3 Reviewed by Anders Carlsson. 4 5 [UNIX] Allow sending null handles in messages 6 https://bugs.webkit.org/show_bug.cgi?id=60621 7 8 Only valid file descriptors are now sent using sendmsg() control 9 messages, and instead of sending a list of attachment sizes we now 10 send a list of AttachmentInfo structs. AttachmentInfo contains 11 information about the attachments including the size for 12 MappedMemory attachmens and whether the attachment is null or not. 13 14 * Platform/CoreIPC/unix/ConnectionUnix.cpp: 15 (CoreIPC::AttachmentInfo::AttachmentInfo): New class containing 16 information about the attachments sent. 17 (CoreIPC::AttachmentInfo::setType): Set the attachment type. 18 (CoreIPC::AttachmentInfo::getType): Return the attachment type. 19 (CoreIPC::AttachmentInfo::setSize): Set the size for MappedMemory attachments. 20 (CoreIPC::AttachmentInfo::getSize): Get the size for MappedMemory attachments. 21 (CoreIPC::AttachmentInfo::setNull): Set attachment as null, it 22 contains an invalid file descriptor, so the receiver shouldn't 23 expect a file desriptor for this attachment. 24 (CoreIPC::AttachmentInfo::isNull): Return whether attachment is 25 null, it contains an invalid file descriptor. 26 (CoreIPC::Connection::processMessage): 27 (CoreIPC::Connection::sendOutgoingMessage): 28 1 29 2011-07-14 Carlos Garcia Campos <cgarcia@igalia.com> 2 30 -
trunk/Source/WebKit2/Platform/CoreIPC/unix/ConnectionUnix.cpp
r89433 r91016 2 2 * Copyright (C) 2010 Apple Inc. All rights reserved. 3 3 * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies) 4 * Copyright (C) 2011 Igalia S.L. 4 5 * 5 6 * Redistribution and use in source and binary forms, with or without … … 90 91 }; 91 92 93 class AttachmentInfo { 94 public: 95 AttachmentInfo() 96 : m_type(Attachment::Uninitialized) 97 , m_size(0) 98 , m_isNull(false) 99 { 100 } 101 102 void setType(Attachment::Type type) { m_type = type; } 103 Attachment::Type getType() { return m_type; } 104 void setSize(size_t size) 105 { 106 ASSERT(m_type == Attachment::MappedMemoryType); 107 m_size = size; 108 } 109 110 size_t getSize() 111 { 112 ASSERT(m_type == Attachment::MappedMemoryType); 113 return m_size; 114 } 115 116 // The attachment is not null unless explicitly set. 117 void setNull() { m_isNull = true; } 118 bool isNull() { return m_isNull; } 119 120 private: 121 Attachment::Type m_type; 122 size_t m_size; 123 bool m_isNull; 124 }; 125 92 126 void Connection::platformInitialize(Identifier identifier) 93 127 { … … 170 204 messageData += sizeof(messageInfo); 171 205 172 size_t messageLength = sizeof(MessageInfo) + messageInfo.attachmentCount() * sizeof( size_t) + (messageInfo.isMessageBodyOOL() ? 0 : messageInfo.bodySize());206 size_t messageLength = sizeof(MessageInfo) + messageInfo.attachmentCount() * sizeof(AttachmentInfo) + (messageInfo.isMessageBodyOOL() ? 0 : messageInfo.bodySize()); 173 207 if (m_readBufferSize < messageLength) 174 208 return false; … … 178 212 RefPtr<WebKit::SharedMemory> oolMessageBody; 179 213 180 int attachmentCount = messageInfo.attachmentCount(); 214 size_t attachmentFileDescriptorCount = 0; 215 size_t attachmentCount = messageInfo.attachmentCount(); 181 216 if (attachmentCount) { 182 OwnArrayPtr<size_t> attachmentSizes = adoptArrayPtr(new size_t[attachmentCount]); 183 memcpy(attachmentSizes.get(), messageData, sizeof(size_t) * attachmentCount); 184 messageData += sizeof(size_t) * attachmentCount; 217 OwnArrayPtr<AttachmentInfo> attachmentInfo = adoptArrayPtr(new AttachmentInfo[attachmentCount]); 218 memcpy(attachmentInfo.get(), messageData, sizeof(AttachmentInfo) * attachmentCount); 219 messageData += sizeof(AttachmentInfo) * attachmentCount; 220 221 for (size_t i = 0; i < attachmentCount; ++i) { 222 switch (attachmentInfo[i].getType()) { 223 case Attachment::MappedMemoryType: 224 case Attachment::SocketType: 225 if (!attachmentInfo[i].isNull()) 226 attachmentFileDescriptorCount++; 227 case Attachment::Uninitialized: 228 default: 229 break; 230 } 231 } 185 232 186 233 if (messageInfo.isMessageBodyOOL()) 187 234 attachmentCount--; 188 235 189 for (int i = 0; i < attachmentCount; ++i) 190 attachments.append(Attachment(m_fileDescriptors[i], attachmentSizes[i])); 236 size_t fdIndex = 0; 237 for (size_t i = 0; i < attachmentCount; ++i) { 238 int fd = -1; 239 switch (attachmentInfo[i].getType()) { 240 case Attachment::MappedMemoryType: 241 if (!attachmentInfo[i].isNull()) 242 fd = m_fileDescriptors[fdIndex++]; 243 attachments.append(Attachment(fd, attachmentInfo[i].getSize())); 244 break; 245 case Attachment::SocketType: 246 if (!attachmentInfo[i].isNull()) 247 fd = m_fileDescriptors[fdIndex++]; 248 attachments.append(Attachment(fd)); 249 break; 250 case Attachment::Uninitialized: 251 attachments.append(Attachment()); 252 default: 253 break; 254 } 255 } 191 256 192 257 if (messageInfo.isMessageBodyOOL()) { 193 258 ASSERT(messageInfo.bodySize()); 194 259 195 WebKit::SharedMemory::Handle handle; 196 handle.adoptFromAttachment(m_fileDescriptors[attachmentCount], attachmentSizes[attachmentCount]); 197 if (handle.isNull()) { 260 if (attachmentInfo[attachmentCount].isNull()) { 198 261 ASSERT_NOT_REACHED(); 199 262 return false; 200 263 } 264 265 WebKit::SharedMemory::Handle handle; 266 handle.adoptFromAttachment(m_fileDescriptors[attachmentFileDescriptorCount - 1], attachmentInfo[attachmentCount].getSize()); 201 267 202 268 oolMessageBody = WebKit::SharedMemory::create(handle, WebKit::SharedMemory::ReadOnly); … … 228 294 m_readBufferSize = 0; 229 295 230 if ( messageInfo.attachmentCount()) {231 if (m_fileDescriptorsSize > messageInfo.attachmentCount()) {232 size_t fileDescriptorsLength = messageInfo.attachmentCount()* sizeof(int);296 if (attachmentFileDescriptorCount) { 297 if (m_fileDescriptorsSize > attachmentFileDescriptorCount) { 298 size_t fileDescriptorsLength = attachmentFileDescriptorCount * sizeof(int); 233 299 memmove(m_fileDescriptors.data(), m_fileDescriptors.data() + fileDescriptorsLength, m_fileDescriptorsSize - fileDescriptorsLength); 234 300 m_fileDescriptorsSize -= fileDescriptorsLength; … … 388 454 389 455 MessageInfo messageInfo(messageID, arguments->bufferSize(), attachments.size()); 390 size_t messageSizeWithBodyInline = sizeof(messageInfo) + (attachments.size() * sizeof( size_t)) + arguments->bufferSize();456 size_t messageSizeWithBodyInline = sizeof(messageInfo) + (attachments.size() * sizeof(AttachmentInfo)) + arguments->bufferSize(); 391 457 if (messageSizeWithBodyInline > messageMaxSize && arguments->bufferSize()) { 392 458 RefPtr<WebKit::SharedMemory> oolMessageBody = WebKit::SharedMemory::create(arguments->bufferSize()); … … 417 483 iov[0].iov_len = sizeof(messageInfo); 418 484 419 OwnArrayPtr< char> attachmentFDBuffer = adoptArrayPtr(new char[CMSG_SPACE(sizeof(int) * attachments.size())]);420 OwnArrayPtr<size_t> attachmentSizes = adoptArrayPtr(new size_t[attachments.size()]); 421 485 OwnArrayPtr<AttachmentInfo> attachmentInfo = adoptArrayPtr(new AttachmentInfo[attachments.size()]); 486 487 size_t attachmentFDBufferLength = 0; 422 488 if (!attachments.isEmpty()) { 423 message.msg_control = attachmentFDBuffer.get();424 message.msg_controllen = sizeof(char) * CMSG_SPACE(sizeof(int) * attachments.size());425 426 struct cmsghdr* cmsg = CMSG_FIRSTHDR(&message);427 cmsg->cmsg_level = SOL_SOCKET;428 cmsg->cmsg_type = SCM_RIGHTS;429 cmsg->cmsg_len = CMSG_LEN(sizeof(int) * attachments.size());430 431 int* fdptr = reinterpret_cast<int*>(CMSG_DATA(cmsg));432 489 for (size_t i = 0; i < attachments.size(); ++i) { 433 attachmentSizes[i] = attachments[i].size(); 434 fdptr[i] = attachments[i].fileDescriptor(); 435 } 436 437 message.msg_controllen = cmsg->cmsg_len; 438 439 iov[iovLength].iov_base = attachmentSizes.get(); 440 iov[iovLength].iov_len = sizeof(size_t) * attachments.size(); 490 if (attachments[i].fileDescriptor() != -1) 491 attachmentFDBufferLength++; 492 } 493 } 494 OwnArrayPtr<char> attachmentFDBuffer = adoptArrayPtr(new char[CMSG_SPACE(sizeof(int) * attachmentFDBufferLength)]); 495 496 if (!attachments.isEmpty()) { 497 int* fdPtr = 0; 498 499 if (attachmentFDBufferLength) { 500 message.msg_control = attachmentFDBuffer.get(); 501 message.msg_controllen = CMSG_SPACE(sizeof(int) * attachmentFDBufferLength); 502 memset(message.msg_control, 0, message.msg_controllen); 503 504 struct cmsghdr* cmsg = CMSG_FIRSTHDR(&message); 505 cmsg->cmsg_level = SOL_SOCKET; 506 cmsg->cmsg_type = SCM_RIGHTS; 507 cmsg->cmsg_len = CMSG_LEN(sizeof(int) * attachmentFDBufferLength); 508 509 fdPtr = reinterpret_cast<int*>(CMSG_DATA(cmsg)); 510 } 511 512 int fdIndex = 0; 513 for (size_t i = 0; i < attachments.size(); ++i) { 514 attachmentInfo[i].setType(attachments[i].type()); 515 516 switch (attachments[i].type()) { 517 case Attachment::MappedMemoryType: 518 attachmentInfo[i].setSize(attachments[i].size()); 519 // Fall trhough, set file descriptor or null. 520 case Attachment::SocketType: 521 if (attachments[i].fileDescriptor() != -1) { 522 ASSERT(fdPtr); 523 fdPtr[fdIndex++] = attachments[i].fileDescriptor(); 524 } else 525 attachmentInfo[i].setNull(); 526 break; 527 case Attachment::Uninitialized: 528 default: 529 break; 530 } 531 } 532 533 iov[iovLength].iov_base = attachmentInfo.get(); 534 iov[iovLength].iov_len = sizeof(AttachmentInfo) * attachments.size(); 441 535 ++iovLength; 442 536 }
Note: See TracChangeset
for help on using the changeset viewer.