Changeset 176762 in webkit
- Timestamp:
- Dec 3, 2014 4:16:38 PM (9 years ago)
- Location:
- trunk/Source/WebKit2
- Files:
-
- 12 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebKit2/ChangeLog
r176753 r176762 1 2014-12-03 Commit Queue <commit-queue@webkit.org> 2 3 Unreviewed, rolling out r176452 and r176559. 4 https://bugs.webkit.org/show_bug.cgi?id=139239 5 6 Broke iOS (Requested by andersca on #webkit). 7 8 Reverted changesets: 9 10 "Remove alignment code from IPC coders" 11 https://bugs.webkit.org/show_bug.cgi?id=138963 12 http://trac.webkit.org/changeset/176452 13 14 "[WK2] SecComp buildfix after r176452" 15 https://bugs.webkit.org/show_bug.cgi?id=139081 16 http://trac.webkit.org/changeset/176559 17 1 18 2014-12-03 Tim Horton <timothy_horton@apple.com> 2 19 -
trunk/Source/WebKit2/Platform/IPC/ArgumentCoders.cpp
r176452 r176762 58 58 uint32_t length = string.length(); 59 59 encoder << length; 60 encoder.encodeFixedLengthData(reinterpret_cast<const uint8_t*>(string.data()), length );60 encoder.encodeFixedLengthData(reinterpret_cast<const uint8_t*>(string.data()), length, 1); 61 61 } 62 62 … … 81 81 char* buffer; 82 82 CString string = CString::newUninitialized(length, buffer); 83 if (!decoder.decodeFixedLengthData(reinterpret_cast<uint8_t*>(buffer), length ))83 if (!decoder.decodeFixedLengthData(reinterpret_cast<uint8_t*>(buffer), length, 1)) 84 84 return false; 85 85 … … 103 103 104 104 if (is8Bit) 105 encoder.encodeFixedLengthData(reinterpret_cast<const uint8_t*>(string.characters8()), length * sizeof(LChar) );105 encoder.encodeFixedLengthData(reinterpret_cast<const uint8_t*>(string.characters8()), length * sizeof(LChar), alignof(LChar)); 106 106 else 107 encoder.encodeFixedLengthData(reinterpret_cast<const uint8_t*>(string.characters16()), length * sizeof(UChar) );107 encoder.encodeFixedLengthData(reinterpret_cast<const uint8_t*>(string.characters16()), length * sizeof(UChar), alignof(UChar)); 108 108 } 109 109 … … 119 119 CharacterType* buffer; 120 120 String string = String::createUninitialized(length, buffer); 121 if (!decoder.decodeFixedLengthData(reinterpret_cast<uint8_t*>(buffer), length * sizeof(CharacterType) ))121 if (!decoder.decodeFixedLengthData(reinterpret_cast<uint8_t*>(buffer), length * sizeof(CharacterType), alignof(CharacterType))) 122 122 return false; 123 123 -
trunk/Source/WebKit2/Platform/IPC/ArgumentCoders.h
r176452 r176762 42 42 static void encode(ArgumentEncoder& encoder, const T& t) 43 43 { 44 encoder.encodeFixedLengthData(reinterpret_cast<const uint8_t*>(&t), sizeof(T) );44 encoder.encodeFixedLengthData(reinterpret_cast<const uint8_t*>(&t), sizeof(T), alignof(T)); 45 45 } 46 46 47 47 static bool decode(ArgumentDecoder& decoder, T& t) 48 48 { 49 return decoder.decodeFixedLengthData(reinterpret_cast<uint8_t*>(&t), sizeof(T) );49 return decoder.decodeFixedLengthData(reinterpret_cast<uint8_t*>(&t), sizeof(T), alignof(T)); 50 50 } 51 51 }; … … 179 179 { 180 180 encoder << static_cast<uint64_t>(vector.size()); 181 encoder.encodeFixedLengthData(reinterpret_cast<const uint8_t*>(vector.data()), vector.size() * sizeof(T) );181 encoder.encodeFixedLengthData(reinterpret_cast<const uint8_t*>(vector.data()), vector.size() * sizeof(T), alignof(T)); 182 182 } 183 183 … … 199 199 temp.resize(size); 200 200 201 decoder.decodeFixedLengthData(reinterpret_cast<uint8_t*>(temp.data()), size * sizeof(T) );201 decoder.decodeFixedLengthData(reinterpret_cast<uint8_t*>(temp.data()), size * sizeof(T), alignof(T)); 202 202 203 203 vector.swap(temp); -
trunk/Source/WebKit2/Platform/IPC/ArgumentDecoder.cpp
r176452 r176762 57 57 } 58 58 59 static inline uint8_t* roundUpToAlignment(uint8_t* ptr, unsigned alignment) 60 { 61 // Assert that the alignment is a power of 2. 62 ASSERT(alignment && !(alignment & (alignment - 1))); 63 64 uintptr_t alignmentMask = alignment - 1; 65 return reinterpret_cast<uint8_t*>((reinterpret_cast<uintptr_t>(ptr) + alignmentMask) & ~alignmentMask); 66 } 67 59 68 void ArgumentDecoder::initialize(const uint8_t* buffer, size_t bufferSize) 60 69 { … … 63 72 ASSERT(!(reinterpret_cast<uintptr_t>(m_buffer) % alignof(uint64_t))); 64 73 65 m_bufferPos ition= m_buffer;74 m_bufferPos = m_buffer; 66 75 m_bufferEnd = m_buffer + bufferSize; 67 76 memcpy(m_buffer, buffer, bufferSize); 68 77 } 69 78 70 bool ArgumentDecoder::bufferIsLargeEnoughToContain(size_t size) const 71 { 72 return m_buffer + size <= m_bufferEnd; 73 } 74 75 bool ArgumentDecoder::decodeFixedLengthData(uint8_t* data, size_t size) 76 { 77 if (!bufferIsLargeEnoughToContain(size)) 78 return false; 79 80 memcpy(data, m_bufferPosition, size); 81 m_bufferPosition += size; 79 static inline bool alignedBufferIsLargeEnoughToContain(const uint8_t* alignedPosition, const uint8_t* bufferEnd, size_t size) 80 { 81 return bufferEnd >= alignedPosition && static_cast<size_t>(bufferEnd - alignedPosition) >= size; 82 } 83 84 bool ArgumentDecoder::alignBufferPosition(unsigned alignment, size_t size) 85 { 86 uint8_t* alignedPosition = roundUpToAlignment(m_bufferPos, alignment); 87 if (!alignedBufferIsLargeEnoughToContain(alignedPosition, m_bufferEnd, size)) { 88 // We've walked off the end of this buffer. 89 markInvalid(); 90 return false; 91 } 92 93 m_bufferPos = alignedPosition; 94 return true; 95 } 96 97 bool ArgumentDecoder::bufferIsLargeEnoughToContain(unsigned alignment, size_t size) const 98 { 99 return alignedBufferIsLargeEnoughToContain(roundUpToAlignment(m_bufferPos, alignment), m_bufferEnd, size); 100 } 101 102 bool ArgumentDecoder::decodeFixedLengthData(uint8_t* data, size_t size, unsigned alignment) 103 { 104 if (!alignBufferPosition(alignment, size)) 105 return false; 106 107 memcpy(data, m_bufferPos, size); 108 m_bufferPos += size; 82 109 83 110 return true; … … 90 117 return false; 91 118 92 if (! bufferIsLargeEnoughToContain(size))93 return false; 94 95 uint8_t* data = m_bufferPos ition;96 m_bufferPos ition+= size;119 if (!alignBufferPosition(1, size)) 120 return false; 121 122 uint8_t* data = m_bufferPos; 123 m_bufferPos += size; 97 124 98 125 dataReference = DataReference(data, size); … … 101 128 102 129 template<typename Type> 103 bool ArgumentDecoder::decodeNumber(Type& value) 104 { 105 if (!bufferIsLargeEnoughToContain(sizeof(Type))) 106 return false; 107 108 memcpy(&value, m_bufferPosition, sizeof(Type)); 109 m_bufferPosition += sizeof(Type); 110 111 return true; 130 static void decodeValueFromBuffer(Type& value, uint8_t*& bufferPosition) 131 { 132 memcpy(&value, bufferPosition, sizeof(value)); 133 bufferPosition += sizeof(Type); 112 134 } 113 135 114 136 bool ArgumentDecoder::decode(bool& result) 115 137 { 116 return decodeNumber(result); 138 if (!alignBufferPosition(sizeof(result), sizeof(result))) 139 return false; 140 141 decodeValueFromBuffer(result, m_bufferPos); 142 return true; 117 143 } 118 144 119 145 bool ArgumentDecoder::decode(uint8_t& result) 120 146 { 121 return decodeNumber(result); 147 if (!alignBufferPosition(sizeof(result), sizeof(result))) 148 return false; 149 150 decodeValueFromBuffer(result, m_bufferPos); 151 return true; 122 152 } 123 153 124 154 bool ArgumentDecoder::decode(uint16_t& result) 125 155 { 126 return decodeNumber(result); 156 if (!alignBufferPosition(sizeof(result), sizeof(result))) 157 return false; 158 159 decodeValueFromBuffer(result, m_bufferPos); 160 return true; 127 161 } 128 162 129 163 bool ArgumentDecoder::decode(uint32_t& result) 130 164 { 131 return decodeNumber(result); 165 if (!alignBufferPosition(sizeof(result), sizeof(result))) 166 return false; 167 168 decodeValueFromBuffer(result, m_bufferPos); 169 return true; 132 170 } 133 171 134 172 bool ArgumentDecoder::decode(uint64_t& result) 135 173 { 136 return decodeNumber(result); 174 if (!alignBufferPosition(sizeof(result), sizeof(result))) 175 return false; 176 177 decodeValueFromBuffer(result, m_bufferPos); 178 return true; 137 179 } 138 180 139 181 bool ArgumentDecoder::decode(int32_t& result) 140 182 { 141 return decodeNumber(result); 183 if (!alignBufferPosition(sizeof(result), sizeof(result))) 184 return false; 185 186 decodeValueFromBuffer(result, m_bufferPos); 187 return true; 142 188 } 143 189 144 190 bool ArgumentDecoder::decode(int64_t& result) 145 191 { 146 return decodeNumber(result); 192 if (!alignBufferPosition(sizeof(result), sizeof(result))) 193 return false; 194 195 decodeValueFromBuffer(result, m_bufferPos); 196 return true; 147 197 } 148 198 149 199 bool ArgumentDecoder::decode(float& result) 150 200 { 151 return decodeNumber(result); 201 if (!alignBufferPosition(sizeof(result), sizeof(result))) 202 return false; 203 204 decodeValueFromBuffer(result, m_bufferPos); 205 return true; 152 206 } 153 207 154 208 bool ArgumentDecoder::decode(double& result) 155 209 { 156 return decodeNumber(result); 210 if (!alignBufferPosition(sizeof(result), sizeof(result))) 211 return false; 212 213 decodeValueFromBuffer(result, m_bufferPos); 214 return true; 157 215 } 158 216 -
trunk/Source/WebKit2/Platform/IPC/ArgumentDecoder.h
r176452 r176762 43 43 size_t length() const { return m_bufferEnd - m_buffer; } 44 44 45 bool isInvalid() const { return m_bufferPos ition> m_bufferEnd; }46 void markInvalid() { m_bufferPos ition= m_bufferEnd + 1; }45 bool isInvalid() const { return m_bufferPos > m_bufferEnd; } 46 void markInvalid() { m_bufferPos = m_bufferEnd + 1; } 47 47 48 bool decodeFixedLengthData(uint8_t*, size_t );48 bool decodeFixedLengthData(uint8_t*, size_t, unsigned alignment); 49 49 50 50 // The data in the data reference here will only be valid for the lifetime of the ArgumentDecoder object. … … 81 81 return false; 82 82 83 return bufferIsLargeEnoughToContain( numElements * sizeof(T));83 return bufferIsLargeEnoughToContain(alignof(T), numElements * sizeof(T)); 84 84 } 85 85 … … 97 97 void initialize(const uint8_t* buffer, size_t bufferSize); 98 98 99 bool bufferIsLargeEnoughToContain(size_t) const;100 template <typename Type> bool decodeNumber(Type& value);99 bool alignBufferPosition(unsigned alignment, size_t size); 100 bool bufferIsLargeEnoughToContain(unsigned alignment, size_t size) const; 101 101 102 102 private: 103 103 uint8_t* m_buffer; 104 uint8_t* m_bufferPos ition;104 uint8_t* m_bufferPos; 105 105 uint8_t* m_bufferEnd; 106 106 -
trunk/Source/WebKit2/Platform/IPC/ArgumentEncoder.cpp
r176452 r176762 58 58 ArgumentEncoder::ArgumentEncoder() 59 59 : m_buffer(m_inlineBuffer) 60 , m_bufferPointer(m_inlineBuffer) 60 61 , m_bufferSize(0) 61 62 , m_bufferCapacity(sizeof(m_inlineBuffer)) … … 103 104 } 104 105 105 uint8_t* ArgumentEncoder::grow(size_t size) 106 { 107 size_t position = m_bufferSize; 108 reserve(m_bufferSize + size); 109 110 m_bufferSize += size; 111 112 return m_buffer + position; 113 } 114 115 void ArgumentEncoder::encodeFixedLengthData(const uint8_t* data, size_t size) 116 { 117 uint8_t* buffer = grow(size); 106 uint8_t* ArgumentEncoder::grow(unsigned alignment, size_t size) 107 { 108 size_t alignedSize = roundUpToAlignment(m_bufferSize, alignment); 109 reserve(alignedSize + size); 110 111 m_bufferSize = alignedSize + size; 112 m_bufferPointer = m_buffer + alignedSize + size; 113 114 return m_buffer + alignedSize; 115 } 116 117 void ArgumentEncoder::encodeFixedLengthData(const uint8_t* data, size_t size, unsigned alignment) 118 { 119 ASSERT(!(reinterpret_cast<uintptr_t>(data) % alignment)); 120 121 uint8_t* buffer = grow(alignment, size); 118 122 memcpy(buffer, data, size); 119 123 } … … 122 126 { 123 127 encode(static_cast<uint64_t>(dataReference.size())); 124 encodeFixedLengthData(dataReference.data(), dataReference.size() );128 encodeFixedLengthData(dataReference.data(), dataReference.size(), 1); 125 129 } 126 130 127 131 template<typename Type> 128 void ArgumentEncoder::encodeNumber(Type value) 129 { 130 uint8_t* bufferPosition = grow(sizeof(Type)); 132 static void copyValueToBuffer(Type value, uint8_t* bufferPosition) 133 { 131 134 memcpy(bufferPosition, &value, sizeof(Type)); 132 135 } 133 136 134 void ArgumentEncoder::encode(bool value) 135 { 136 encodeNumber(value); 137 } 138 139 void ArgumentEncoder::encode(uint8_t value) 140 { 141 encodeNumber(value); 142 } 143 144 void ArgumentEncoder::encode(uint16_t value) 145 { 146 encodeNumber(value); 147 } 148 149 void ArgumentEncoder::encode(uint32_t value) 150 { 151 encodeNumber(value); 152 } 153 154 void ArgumentEncoder::encode(uint64_t value) 155 { 156 encodeNumber(value); 157 } 158 159 void ArgumentEncoder::encode(int32_t value) 160 { 161 encodeNumber(value); 162 } 163 164 void ArgumentEncoder::encode(int64_t value) 165 { 166 encodeNumber(value); 167 } 168 169 void ArgumentEncoder::encode(float value) 170 { 171 encodeNumber(value); 172 } 173 174 void ArgumentEncoder::encode(double value) 175 { 176 encodeNumber(value); 137 void ArgumentEncoder::encode(bool n) 138 { 139 uint8_t* buffer = grow(sizeof(n), sizeof(n)); 140 copyValueToBuffer(n, buffer); 141 } 142 143 void ArgumentEncoder::encode(uint8_t n) 144 { 145 uint8_t* buffer = grow(sizeof(n), sizeof(n)); 146 copyValueToBuffer(n, buffer); 147 } 148 149 void ArgumentEncoder::encode(uint16_t n) 150 { 151 uint8_t* buffer = grow(sizeof(n), sizeof(n)); 152 copyValueToBuffer(n, buffer); 153 } 154 155 void ArgumentEncoder::encode(uint32_t n) 156 { 157 uint8_t* buffer = grow(sizeof(n), sizeof(n)); 158 copyValueToBuffer(n, buffer); 159 } 160 161 void ArgumentEncoder::encode(uint64_t n) 162 { 163 uint8_t* buffer = grow(sizeof(n), sizeof(n)); 164 copyValueToBuffer(n, buffer); 165 } 166 167 void ArgumentEncoder::encode(int32_t n) 168 { 169 uint8_t* buffer = grow(sizeof(n), sizeof(n)); 170 copyValueToBuffer(n, buffer); 171 } 172 173 void ArgumentEncoder::encode(int64_t n) 174 { 175 uint8_t* buffer = grow(sizeof(n), sizeof(n)); 176 copyValueToBuffer(n, buffer); 177 } 178 179 void ArgumentEncoder::encode(float n) 180 { 181 uint8_t* buffer = grow(sizeof(n), sizeof(n)); 182 copyValueToBuffer(n, buffer); 183 } 184 185 void ArgumentEncoder::encode(double n) 186 { 187 uint8_t* buffer = grow(sizeof(n), sizeof(n)); 188 copyValueToBuffer(n, buffer); 177 189 } 178 190 -
trunk/Source/WebKit2/Platform/IPC/ArgumentEncoder.h
r176452 r176762 42 42 virtual ~ArgumentEncoder(); 43 43 44 void encodeFixedLengthData(const uint8_t*, size_t );44 void encodeFixedLengthData(const uint8_t*, size_t, unsigned alignment); 45 45 void encodeVariableLengthByteArray(const DataReference&); 46 46 … … 63 63 } 64 64 65 constuint8_t* buffer() const { return m_buffer; }65 uint8_t* buffer() const { return m_buffer; } 66 66 size_t bufferSize() const { return m_bufferSize; } 67 67 … … 69 69 Vector<Attachment> releaseAttachments(); 70 70 void reserve(size_t); 71 72 protected:73 uint8_t* mutableBuffer() { return m_buffer; }74 71 75 72 private: … … 83 80 void encode(float); 84 81 void encode(double); 85 template<typename Type> void encodeNumber(Type);86 82 87 uint8_t* grow( size_t);83 uint8_t* grow(unsigned alignment, size_t size); 88 84 89 85 uint8_t m_inlineBuffer[512]; 86 90 87 uint8_t* m_buffer; 91 88 uint8_t* m_bufferPointer; 89 92 90 size_t m_bufferSize; 93 91 size_t m_bufferCapacity; -
trunk/Source/WebKit2/Platform/IPC/DataReference.cpp
r176452 r176762 52 52 while (position < bufferSize) { 53 53 unsigned bytesToWrite = m_buffer->getSomeData(partialData, position); 54 encoder.encodeFixedLengthData(reinterpret_cast<const uint8_t*>(partialData), bytesToWrite );54 encoder.encodeFixedLengthData(reinterpret_cast<const uint8_t*>(partialData), bytesToWrite, 1); 55 55 position += bytesToWrite; 56 56 } -
trunk/Source/WebKit2/Platform/IPC/MessageEncoder.cpp
r176452 r176762 52 52 { 53 53 if (isSyncMessage) 54 * mutableBuffer() |= SyncMessage;54 *buffer() |= SyncMessage; 55 55 else 56 * mutableBuffer() &= ~SyncMessage;56 *buffer() &= ~SyncMessage; 57 57 } 58 58 … … 60 60 { 61 61 if (shouldDispatchMessageWhenWaitingForSyncReply) 62 * mutableBuffer() |= DispatchMessageWhenWaitingForSyncReply;62 *buffer() |= DispatchMessageWhenWaitingForSyncReply; 63 63 else 64 * mutableBuffer() &= ~DispatchMessageWhenWaitingForSyncReply;64 *buffer() &= ~DispatchMessageWhenWaitingForSyncReply; 65 65 } 66 66 -
trunk/Source/WebKit2/Platform/IPC/mac/ConnectionMac.mm
r176452 r176762 328 328 mach_msg_descriptor_t* descriptor = reinterpret_cast<mach_msg_descriptor_t*>(descriptorData); 329 329 330 descriptor->out_of_line.address = const_cast<uint8_t*>(encoder->buffer());330 descriptor->out_of_line.address = encoder->buffer(); 331 331 descriptor->out_of_line.size = encoder->bufferSize(); 332 332 descriptor->out_of_line.copy = MACH_MSG_VIRTUAL_COPY; -
trunk/Source/WebKit2/Platform/IPC/unix/ConnectionUnix.cpp
r176452 r176762 515 515 516 516 if (!messageInfo.isMessageBodyIsOutOfLine() && encoder->bufferSize()) { 517 iov[iovLength].iov_base = reinterpret_cast<void*>( const_cast<uint8_t*>(encoder->buffer()));517 iov[iovLength].iov_base = reinterpret_cast<void*>(encoder->buffer()); 518 518 iov[iovLength].iov_len = encoder->bufferSize(); 519 519 ++iovLength; -
trunk/Source/WebKit2/Shared/linux/SeccompFilters/SeccompBroker.cpp
r176559 r176762 206 206 m_socketLock.lock(); 207 207 208 if (sendMessage(m_socket, reinterpret_cast<void*>(const_cast<uint8_t*>(encoder->buffer())), encoder->bufferSize()) < 0)208 if (sendMessage(m_socket, encoder->buffer(), encoder->bufferSize()) < 0) 209 209 CRASH(); 210 210 … … 341 341 342 342 // The client is down, the broker should go away. 343 if (sendMessage(socket, reinterpret_cast<void*>(const_cast<uint8_t*>(encoder->buffer())), encoder->bufferSize(), fd) < 0)343 if (sendMessage(socket, encoder->buffer(), encoder->bufferSize(), fd) < 0) 344 344 exit(EXIT_SUCCESS); 345 345 }
Note: See TracChangeset
for help on using the changeset viewer.