Skip to content

Instantly share code, notes, and snippets.

@pluswave
Created July 16, 2014 10:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save pluswave/5c064b5f2cc18413e6cd to your computer and use it in GitHub Desktop.
Save pluswave/5c064b5f2cc18413e6cd to your computer and use it in GitHub Desktop.
Quick and Dirty fix for alignment issue on ARM/MIPS platform for Webkit2/qt5.3.1
diff --git a/qtwebkit/Source/WebKit2/Platform/CoreIPC/ArgumentEncoder.cpp b/qtwebkit/Source/WebKit2/Platform/CoreIPC/ArgumentEncoder.cpp
index 43246f4..bdbc2f1 100644
--- a/qtwebkit/Source/WebKit2/Platform/CoreIPC/ArgumentEncoder.cpp
+++ b/qtwebkit/Source/WebKit2/Platform/CoreIPC/ArgumentEncoder.cpp
@@ -61,17 +61,18 @@ PassOwnPtr<ArgumentEncoder> ArgumentEncoder::create()
}
ArgumentEncoder::ArgumentEncoder()
- : m_buffer(m_inlineBuffer)
- , m_bufferPointer(m_inlineBuffer)
+ : m_initialBuffer(m_inlineBuffer)
+ , m_buffer( (uint8_t*) ( ((uintptr_t)(m_inlineBuffer + 7 )) & ~7) )
+ , m_bufferPointer(m_buffer)
, m_bufferSize(0)
- , m_bufferCapacity(sizeof(m_inlineBuffer))
+ , m_bufferCapacity(sizeof(m_inlineBuffer) - (uint32_t)(m_buffer - m_inlineBuffer))
{
}
ArgumentEncoder::~ArgumentEncoder()
{
- if (m_buffer != m_inlineBuffer)
- freeBuffer(m_buffer, m_bufferCapacity);
+ if (m_initialBuffer != m_inlineBuffer)
+ freeBuffer(m_initialBuffer, m_bufferCapacity + (uint32_t)(m_buffer - m_initialBuffer));
#if !USE(UNIX_DOMAIN_SOCKETS)
// FIXME: We need to dispose of the attachments in cases of failure.
@@ -95,17 +96,19 @@ uint8_t* ArgumentEncoder::grow(unsigned alignment, size_t size)
while (newCapacity < alignedSize + size)
newCapacity *= 2;
- uint8_t* newBuffer = static_cast<uint8_t*>(allocBuffer(newCapacity));
- if (!newBuffer)
+ uint8_t* newInitialBuffer = static_cast<uint8_t*>(allocBuffer(newCapacity + 8));
+ if (!newInitialBuffer)
CRASH();
+ uint8_t* newBuffer = (uint8_t*)(((uintptr_t) newInitialBuffer + 7 ) & ~7 );
memcpy(newBuffer, m_buffer, m_bufferSize);
- if (m_buffer != m_inlineBuffer)
- freeBuffer(m_buffer, m_bufferCapacity);
+ if (m_initialBuffer != m_inlineBuffer)
+ freeBuffer(m_initialBuffer, m_bufferCapacity + (uint32_t)(m_buffer - m_initialBuffer));
+ m_initialBuffer = newInitialBuffer;
m_buffer = newBuffer;
- m_bufferCapacity = newCapacity;
+ m_bufferCapacity = newCapacity + 8 - (uint32_t)(m_buffer - m_initialBuffer);
}
m_bufferSize = alignedSize + size;
diff --git a/qtwebkit/Source/WebKit2/Platform/CoreIPC/ArgumentEncoder.h b/qtwebkit/Source/WebKit2/Platform/CoreIPC/ArgumentEncoder.h
index 72be12a..b3c99c9 100644
--- a/qtwebkit/Source/WebKit2/Platform/CoreIPC/ArgumentEncoder.h
+++ b/qtwebkit/Source/WebKit2/Platform/CoreIPC/ArgumentEncoder.h
@@ -85,8 +85,9 @@ private:
uint8_t* grow(unsigned alignment, size_t size);
- uint8_t m_inlineBuffer[512];
+ uint8_t m_inlineBuffer[512+8];
+ uint8_t* m_initialBuffer; // condition: m_initialbuffer <= m_bufer <= m_initialbuffer + 7, m_buffer & 7 == 0
uint8_t* m_buffer;
uint8_t* m_bufferPointer;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment