Changeset 176398 in webkit
- Timestamp:
- Nov 20, 2014 9:32:04 AM (9 years ago)
- Location:
- trunk/Source/WebKit2
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebKit2/ChangeLog
r176385 r176398 1 2014-11-20 Antti Koivisto <antti@apple.com> 2 3 Remove alignment code from cache coders 4 https://bugs.webkit.org/show_bug.cgi?id=138927 5 6 Reviewed by Anders Carlsson. 7 8 Alignment code doesn't do anything useful, wastes space and produces wrong results 9 if the encoder and decoder buffers don't have the same 8-byte alignment. 10 11 * NetworkProcess/cache/NetworkCacheDecoder.cpp: 12 (WebKit::NetworkCacheDecoder::NetworkCacheDecoder): 13 (WebKit::NetworkCacheDecoder::bufferIsLargeEnoughToContain): 14 (WebKit::NetworkCacheDecoder::decodeFixedLengthData): 15 (WebKit::NetworkCacheDecoder::decodeNumber): 16 (WebKit::roundUpToAlignment): Deleted. 17 (WebKit::alignedBufferIsLargeEnoughToContain): Deleted. 18 (WebKit::NetworkCacheDecoder::alignBufferPosition): Deleted. 19 * NetworkProcess/cache/NetworkCacheDecoder.h: 20 (WebKit::NetworkCacheDecoder::currentOffset): 21 (WebKit::NetworkCacheDecoder::isInvalid): 22 (WebKit::NetworkCacheDecoder::markInvalid): 23 (WebKit::NetworkCacheDecoder::bufferIsLargeEnoughToContain): 24 * NetworkProcess/cache/NetworkCacheEncoder.cpp: 25 (WebKit::NetworkCacheEncoder::grow): 26 (WebKit::NetworkCacheEncoder::encodeFixedLengthData): 27 (WebKit::NetworkCacheEncoder::encodeNumber): 28 (WebKit::roundUpToAlignment): Deleted. 29 * NetworkProcess/cache/NetworkCacheEncoder.h: 30 1 31 2014-11-20 Csaba Osztrogonác <ossy@webkit.org> 2 32 -
trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheDecoder.cpp
r175748 r176398 35 35 NetworkCacheDecoder::NetworkCacheDecoder(const uint8_t* buffer, size_t bufferSize) 36 36 : m_buffer(buffer) 37 , m_bufferPos (buffer)37 , m_bufferPosition(buffer) 38 38 , m_bufferEnd(buffer + bufferSize) 39 39 , m_checksum(0) … … 45 45 } 46 46 47 static inline uint8_t* roundUpToAlignment(const uint8_t* ptr, unsigned alignment) 47 bool NetworkCacheDecoder::bufferIsLargeEnoughToContain(size_t size) const 48 48 { 49 // Assert that the alignment is a power of 2. 50 ASSERT(alignment && !(alignment & (alignment - 1))); 51 52 uintptr_t alignmentMask = alignment - 1; 53 return reinterpret_cast<uint8_t*>((reinterpret_cast<uintptr_t>(ptr) + alignmentMask) & ~alignmentMask); 49 return m_bufferPosition + size <= m_bufferEnd; 54 50 } 55 51 56 static inline bool alignedBufferIsLargeEnoughToContain(const uint8_t* alignedPosition, const uint8_t* bufferEnd, size_t size)52 bool NetworkCacheDecoder::decodeFixedLengthData(uint8_t* data, size_t size) 57 53 { 58 return bufferEnd >= alignedPosition && static_cast<size_t>(bufferEnd - alignedPosition) >= size; 59 } 60 61 bool NetworkCacheDecoder::alignBufferPosition(unsigned alignment, size_t size) 62 { 63 uint8_t* alignedPosition = roundUpToAlignment(m_bufferPos, alignment); 64 if (!alignedBufferIsLargeEnoughToContain(alignedPosition, m_bufferEnd, size)) { 65 // We've walked off the end of this buffer. 66 markInvalid(); 67 return false; 68 } 69 70 m_bufferPos = alignedPosition; 71 return true; 72 } 73 74 bool NetworkCacheDecoder::bufferIsLargeEnoughToContain(unsigned alignment, size_t size) const 75 { 76 return alignedBufferIsLargeEnoughToContain(roundUpToAlignment(m_bufferPos, alignment), m_bufferEnd, size); 77 } 78 79 bool NetworkCacheDecoder::decodeFixedLengthData(uint8_t* data, size_t size, unsigned alignment) 80 { 81 if (!alignBufferPosition(alignment, size)) 54 if (!bufferIsLargeEnoughToContain(size)) 82 55 return false; 83 56 84 memcpy(data, m_bufferPos , size);85 m_bufferPos += size;57 memcpy(data, m_bufferPosition, size); 58 m_bufferPosition += size; 86 59 87 60 NetworkCacheEncoder::updateChecksumForData(m_checksum, data, size); … … 92 65 bool NetworkCacheDecoder::decodeNumber(Type& value) 93 66 { 94 if (! alignBufferPosition(sizeof(value),sizeof(value)))67 if (!bufferIsLargeEnoughToContain(sizeof(value))) 95 68 return false; 96 69 97 memcpy(&value, m_bufferPos , sizeof(value));98 m_bufferPos += sizeof(Type);70 memcpy(&value, m_bufferPosition, sizeof(value)); 71 m_bufferPosition += sizeof(Type); 99 72 100 73 NetworkCacheEncoder::updateChecksumForNumber(m_checksum, value); -
trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheDecoder.h
r175748 r176398 40 40 41 41 size_t length() const { return m_bufferEnd - m_buffer; } 42 size_t currentOffset() const { return m_bufferPos - m_buffer; }42 size_t currentOffset() const { return m_bufferPosition - m_buffer; } 43 43 44 bool isInvalid() const { return m_bufferPos > m_bufferEnd; }45 void markInvalid() { m_bufferPos = m_bufferEnd + 1; }44 bool isInvalid() const { return m_bufferPosition > m_bufferEnd; } 45 void markInvalid() { m_bufferPosition = m_bufferEnd + 1; } 46 46 47 47 bool verifyChecksum(); 48 48 49 bool decodeFixedLengthData(uint8_t*, size_t , unsigned alignment);49 bool decodeFixedLengthData(uint8_t*, size_t); 50 50 51 51 bool decode(bool&); … … 84 84 return false; 85 85 86 return bufferIsLargeEnoughToContain( alignof(T),numElements * sizeof(T));86 return bufferIsLargeEnoughToContain(numElements * sizeof(T)); 87 87 } 88 88 89 89 private: 90 bool alignBufferPosition(unsigned alignment, size_t); 91 bool bufferIsLargeEnoughToContain(unsigned alignment, size_t) const; 90 bool bufferIsLargeEnoughToContain(size_t) const; 92 91 template<typename Type> bool decodeNumber(Type&); 93 92 94 93 const uint8_t* m_buffer; 95 const uint8_t* m_bufferPos ;94 const uint8_t* m_bufferPosition; 96 95 const uint8_t* m_bufferEnd; 97 96 -
trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheEncoder.cpp
r175748 r176398 40 40 } 41 41 42 static inline size_t roundUpToAlignment(size_t value, unsigned alignment)42 uint8_t* NetworkCacheEncoder::grow(size_t size) 43 43 { 44 return ((value + alignment - 1) / alignment) * alignment; 45 } 46 47 uint8_t* NetworkCacheEncoder::grow(unsigned alignment, size_t size) 48 { 49 size_t alignedSize = roundUpToAlignment(m_buffer.size(), alignment); 50 51 m_buffer.grow(alignedSize + size); 52 53 return m_buffer.data() + alignedSize; 44 uint8_t* position = m_buffer.data() + m_buffer.size(); 45 m_buffer.grow(m_buffer.size() + size); 46 return position; 54 47 } 55 48 … … 62 55 } 63 56 64 void NetworkCacheEncoder::encodeFixedLengthData(const uint8_t* data, size_t size , unsigned alignment)57 void NetworkCacheEncoder::encodeFixedLengthData(const uint8_t* data, size_t size) 65 58 { 66 ASSERT(!(reinterpret_cast<uintptr_t>(data) % alignment));67 68 59 updateChecksumForData(m_checksum, data, size); 69 60 70 uint8_t* buffer = grow( alignment,size);61 uint8_t* buffer = grow(size); 71 62 memcpy(buffer, data, size); 72 63 } … … 75 66 void NetworkCacheEncoder::encodeNumber(Type value) 76 67 { 77 uint8_t* buffer = grow(sizeof(Type), sizeof(Type));78 79 68 NetworkCacheEncoder::updateChecksumForNumber(m_checksum, value); 80 69 70 uint8_t* buffer = grow(sizeof(Type)); 81 71 memcpy(buffer, &value, sizeof(Type)); 82 72 } -
trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheEncoder.h
r175748 r176398 46 46 47 47 void encodeChecksum(); 48 void encodeFixedLengthData(const uint8_t*, size_t , unsigned alignment);48 void encodeFixedLengthData(const uint8_t*, size_t); 49 49 50 50 template<typename T> void encodeEnum(T t) … … 85 85 template<typename Type> void encodeNumber(Type); 86 86 87 uint8_t* grow( unsigned alignment,size_t);87 uint8_t* grow(size_t); 88 88 89 89 template <typename Type> struct Salt;
Note: See TracChangeset
for help on using the changeset viewer.