• Veselin Georgiev's avatar
    Fix SIGBUS due to unaligned access · 748a652f
    Veselin Georgiev authored
    Update RAPIDJSON_ALIGN() to always align on an 8-byte boundary
    unless otherwise overridden.
    
    On some platforms (such as ARM), 64-bit items (such as doubles and
    64-bit integers) must be aligned to an 8 byte address, even though the
    architecture is only 32-bits. On these platforms, MemoryPoolAllocator
    must match the malloc() behavior and return a 8 byte aligned allocation.
    This eliminates any alignment issues that may occur at the expense of
    additional memory overhead.
    
    Failure to do so caused a SIGBUS signal when calling
    GenericValue::SetNull(). The size of the data_ member of the
    GenericValue class is 16 bytes in 32-bit mode and its constructor
    requires an 8-byte aligned access.
    
    While parsing a JSON formatted string using Document::ParseStream(), a
    stack object containing GenericValue items was constructed. Since the
    stack was 8-byte aligned, the constructor calls would succeed. When the
    lifetime of the object ends, SetObjectRaw() is invoked. This triggered
    an allocation with 4-byte alignment to which the previously 8-byte
    aligned GenericValue array was copied. After this, any call to a
    GenericValue API that triggered the constructor and thus the placement
    new operation on the Data type member would trigger a SIGBUS.
    Signed-off-by: 's avatarVeselin Georgiev <veselin.georgiev@garmin.com>
    Signed-off-by: 's avatarJoshua Watt <Joshua.Watt@garmin.com>
    748a652f
Name
Last commit
Last update
CMakeModules Loading commit data...
bin Loading commit data...
contrib/natvis Loading commit data...
doc Loading commit data...
docker/debian Loading commit data...
example Loading commit data...
include/rapidjson Loading commit data...
test Loading commit data...
thirdparty Loading commit data...
.gitattributes Loading commit data...
.gitignore Loading commit data...
.gitmodules Loading commit data...
.travis.yml Loading commit data...
CHANGELOG.md Loading commit data...
CMakeLists.txt Loading commit data...
RapidJSON.pc.in Loading commit data...
RapidJSONConfig.cmake.in Loading commit data...
RapidJSONConfigVersion.cmake.in Loading commit data...
appveyor.yml Loading commit data...
include_dirs.js Loading commit data...
library.json Loading commit data...
license.txt Loading commit data...
package.json Loading commit data...
rapidjson.autopkg Loading commit data...
readme.md Loading commit data...
readme.zh-cn.md Loading commit data...
travis-doxygen.sh Loading commit data...