Commit 860af7a2 by Cody Northrop Committed by Commit Bot

Capture/Replay: Use aligned offsets for binary data

Traces that populate data by reading from unaligned memory addresses can crash. This CL ensures each offset is 16-byte aligned. TBR: jmadill@chromium.org,nguyenmh@google.com Test: angle_perftests --gtest_filter="*Trace*" Bug: b/150458446 Change-Id: I721999426772fa2f94fe39600d330a15eacc2794 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2222847Reviewed-by: 's avatarCody Northrop <cnorthrop@google.com> Commit-Queue: Cody Northrop <cnorthrop@google.com>
parent b947498b
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
#include "sys/stat.h" #include "sys/stat.h"
#include "common/mathutil.h"
#include "common/system_utils.h" #include "common/system_utils.h"
#include "libANGLE/Context.h" #include "libANGLE/Context.h"
#include "libANGLE/Fence.h" #include "libANGLE/Fence.h"
...@@ -49,6 +50,8 @@ constexpr char kFrameEndVarName[] = "ANGLE_CAPTURE_FRAME_END"; ...@@ -49,6 +50,8 @@ constexpr char kFrameEndVarName[] = "ANGLE_CAPTURE_FRAME_END";
constexpr char kCaptureLabel[] = "ANGLE_CAPTURE_LABEL"; constexpr char kCaptureLabel[] = "ANGLE_CAPTURE_LABEL";
constexpr char kCompression[] = "ANGLE_CAPTURE_COMPRESSION"; constexpr char kCompression[] = "ANGLE_CAPTURE_COMPRESSION";
constexpr size_t kBinaryAlignment = 16;
#if defined(ANGLE_PLATFORM_ANDROID) #if defined(ANGLE_PLATFORM_ANDROID)
constexpr char kAndroidCaptureEnabled[] = "debug.angle.capture.enabled"; constexpr char kAndroidCaptureEnabled[] = "debug.angle.capture.enabled";
...@@ -411,7 +414,8 @@ void WriteBinaryParamReplay(DataCounters *counters, ...@@ -411,7 +414,8 @@ void WriteBinaryParamReplay(DataCounters *counters,
else else
{ {
// Store in binary file if data are not of type string or enum // Store in binary file if data are not of type string or enum
size_t offset = binaryData->size(); // Round up to 16-byte boundary for cross ABI safety
size_t offset = rx::roundUp(binaryData->size(), kBinaryAlignment);
binaryData->resize(offset + data.size()); binaryData->resize(offset + data.size());
memcpy(binaryData->data() + offset, data.data(), data.size()); memcpy(binaryData->data() + offset, data.data(), data.size());
out << "reinterpret_cast<" << ParamTypeToString(overrideType) << ">(&gBinaryData[" << offset out << "reinterpret_cast<" << ParamTypeToString(overrideType) << ">(&gBinaryData[" << offset
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment