static already_AddRefed<SharedMemory> ReadSegment(const IPC::Message& aDescriptor, Shmem::id_t* aId, size_t* aNBytes, size_t aExtraSize) { if (SHMEM_CREATED_MESSAGE_TYPE != aDescriptor.type()) { NS_ERROR("expected 'shmem created' message"); return nullptr; } SharedMemory::SharedMemoryType type; PickleIterator iter(aDescriptor); if (!ShmemCreated::ReadInfo(&aDescriptor, &iter, aId, aNBytes, &type)) { return nullptr; } RefPtr<SharedMemory> segment = NewSegment(type); if (!segment) { return nullptr; } if (!segment->ReadHandle(&aDescriptor, &iter)) { NS_ERROR("trying to open invalid handle"); return nullptr; } aDescriptor.EndRead(iter); size_t size = SharedMemory::PageAlignedSize(*aNBytes + aExtraSize); if (!segment->Map(size)) { return nullptr; } // close the handle to the segment after it is mapped segment->CloseHandle(); return segment.forget(); }
static bool Read(const IPC::Message& aMsg, TransportDescriptor* aDescriptor, ProcessId* aOtherProcess, ProtocolId* aProtocol) { void* iter = nullptr; if (!IPC::ReadParam(&aMsg, &iter, aDescriptor) || !IPC::ReadParam(&aMsg, &iter, aOtherProcess) || !IPC::ReadParam(&aMsg, &iter, reinterpret_cast<uint32_t*>(aProtocol))) { return false; } aMsg.EndRead(iter); return true; }