Changeset 91016 in webkit


Ignore:
Timestamp:
Jul 14, 2011 10:52:53 AM (13 years ago)
Author:
Carlos Garcia Campos
Message:

Reviewed by Anders Carlsson.

[UNIX] Allow sending null handles in messages
https://bugs.webkit.org/show_bug.cgi?id=60621

Only valid file descriptors are now sent using sendmsg() control
messages, and instead of sending a list of attachment sizes we now
send a list of AttachmentInfo structs. AttachmentInfo contains
information about the attachments including the size for
MappedMemory attachmens and whether the attachment is null or not.

  • Platform/CoreIPC/unix/ConnectionUnix.cpp:

(CoreIPC::AttachmentInfo::AttachmentInfo): New class containing
information about the attachments sent.
(CoreIPC::AttachmentInfo::setType): Set the attachment type.
(CoreIPC::AttachmentInfo::getType): Return the attachment type.
(CoreIPC::AttachmentInfo::setSize): Set the size for MappedMemory attachments.
(CoreIPC::AttachmentInfo::getSize): Get the size for MappedMemory attachments.
(CoreIPC::AttachmentInfo::setNull): Set attachment as null, it
contains an invalid file descriptor, so the receiver shouldn't
expect a file desriptor for this attachment.
(CoreIPC::AttachmentInfo::isNull): Return whether attachment is
null, it contains an invalid file descriptor.
(CoreIPC::Connection::processMessage):
(CoreIPC::Connection::sendOutgoingMessage):

Location:
trunk/Source/WebKit2
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit2/ChangeLog

    r91015 r91016  
     12011-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
    1292011-07-14  Carlos Garcia Campos  <cgarcia@igalia.com>
    230
  • trunk/Source/WebKit2/Platform/CoreIPC/unix/ConnectionUnix.cpp

    r89433 r91016  
    22 * Copyright (C) 2010 Apple Inc. All rights reserved.
    33 * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies)
     4 * Copyright (C) 2011 Igalia S.L.
    45 *
    56 * Redistribution and use in source and binary forms, with or without
     
    9091};
    9192
     93class AttachmentInfo {
     94public:
     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
     120private:
     121    Attachment::Type m_type;
     122    size_t m_size;
     123    bool m_isNull;
     124};
     125
    92126void Connection::platformInitialize(Identifier identifier)
    93127{
     
    170204    messageData += sizeof(messageInfo);
    171205
    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());
    173207    if (m_readBufferSize < messageLength)
    174208        return false;
     
    178212    RefPtr<WebKit::SharedMemory> oolMessageBody;
    179213
    180     int attachmentCount = messageInfo.attachmentCount();
     214    size_t attachmentFileDescriptorCount = 0;
     215    size_t attachmentCount = messageInfo.attachmentCount();
    181216    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        }
    185232
    186233        if (messageInfo.isMessageBodyOOL())
    187234            attachmentCount--;
    188235
    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        }
    191256
    192257        if (messageInfo.isMessageBodyOOL()) {
    193258            ASSERT(messageInfo.bodySize());
    194259
    195             WebKit::SharedMemory::Handle handle;
    196             handle.adoptFromAttachment(m_fileDescriptors[attachmentCount], attachmentSizes[attachmentCount]);
    197             if (handle.isNull()) {
     260            if (attachmentInfo[attachmentCount].isNull()) {
    198261                ASSERT_NOT_REACHED();
    199262                return false;
    200263            }
     264
     265            WebKit::SharedMemory::Handle handle;
     266            handle.adoptFromAttachment(m_fileDescriptors[attachmentFileDescriptorCount - 1], attachmentInfo[attachmentCount].getSize());
    201267
    202268            oolMessageBody = WebKit::SharedMemory::create(handle, WebKit::SharedMemory::ReadOnly);
     
    228294        m_readBufferSize = 0;
    229295
    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);
    233299            memmove(m_fileDescriptors.data(), m_fileDescriptors.data() + fileDescriptorsLength, m_fileDescriptorsSize - fileDescriptorsLength);
    234300            m_fileDescriptorsSize -= fileDescriptorsLength;
     
    388454
    389455    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();
    391457    if (messageSizeWithBodyInline > messageMaxSize && arguments->bufferSize()) {
    392458        RefPtr<WebKit::SharedMemory> oolMessageBody = WebKit::SharedMemory::create(arguments->bufferSize());
     
    417483    iov[0].iov_len = sizeof(messageInfo);
    418484
    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;
    422488    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));
    432489        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();
    441535        ++iovLength;
    442536    }
Note: See TracChangeset for help on using the changeset viewer.