From dce86de8e79d91952c7b21f3bd63bcb1b9f9e7e9 Mon Sep 17 00:00:00 2001 From: Andrew Knight Date: Fri, 5 Apr 2013 15:14:46 +0300 Subject: ANGLE: Avoid memory copies on buffers when data is null With data=0, ANGLE can crash when setting the buffer data. As this should be a legal operation, don't perform a memcpy when data is null. Change-Id: I3fa1260482549b1da50d7a68001a65decb98f258 Reviewed-by: Friedemann Kleint --- ...-memory-copies-on-buffers-when-data-is-nu.patch | 72 ++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 src/angle/patches/0009-ANGLE-Avoid-memory-copies-on-buffers-when-data-is-nu.patch (limited to 'src/angle') diff --git a/src/angle/patches/0009-ANGLE-Avoid-memory-copies-on-buffers-when-data-is-nu.patch b/src/angle/patches/0009-ANGLE-Avoid-memory-copies-on-buffers-when-data-is-nu.patch new file mode 100644 index 0000000000..cecff5c0e8 --- /dev/null +++ b/src/angle/patches/0009-ANGLE-Avoid-memory-copies-on-buffers-when-data-is-nu.patch @@ -0,0 +1,72 @@ +From cde4cd6155791355872f635491630c21c791e7f4 Mon Sep 17 00:00:00 2001 +From: Andrew Knight +Date: Fri, 5 Apr 2013 15:11:59 +0300 +Subject: [PATCH] ANGLE: Avoid memory copies on buffers when data is null + +With data=0, ANGLE can crash when setting the buffer data. As this +should be a legal operation, don't perform a memcpy when data is null. + +Change-Id: I3fa1260482549b1da50d7a68001a65decb98f258 +--- + src/3rdparty/angle/src/libGLESv2/renderer/BufferStorage11.cpp | 22 ++++++++++++++++------ + src/3rdparty/angle/src/libGLESv2/renderer/BufferStorage9.cpp | 3 ++- + 2 files changed, 18 insertions(+), 7 deletions(-) + +diff --git a/src/3rdparty/angle/src/libGLESv2/renderer/BufferStorage11.cpp b/src/3rdparty/angle/src/libGLESv2/renderer/BufferStorage11.cpp +index 4c37bdb..7fe9e6b 100644 +--- a/src/3rdparty/angle/src/libGLESv2/renderer/BufferStorage11.cpp ++++ b/src/3rdparty/angle/src/libGLESv2/renderer/BufferStorage11.cpp +@@ -182,7 +182,8 @@ void BufferStorage11::setData(const void* data, unsigned int size, unsigned int + return gl::error(GL_OUT_OF_MEMORY); + } + +- memcpy(mappedResource.pData, data, size); ++ if (data) ++ memcpy(mappedResource.pData, data, size); + + context->Unmap(mStagingBuffer, 0); + } +@@ -211,12 +212,21 @@ void BufferStorage11::setData(const void* data, unsigned int size, unsigned int + mBufferSize = 0; + } + +- D3D11_SUBRESOURCE_DATA initialData; +- initialData.pSysMem = data; +- initialData.SysMemPitch = size; +- initialData.SysMemSlicePitch = 0; + +- result = device->CreateBuffer(&bufferDesc, &initialData, &mBuffer); ++ if (data) ++ { ++ D3D11_SUBRESOURCE_DATA initialData; ++ initialData.pSysMem = data; ++ initialData.SysMemPitch = size; ++ initialData.SysMemSlicePitch = 0; ++ ++ result = device->CreateBuffer(&bufferDesc, &initialData, &mBuffer); ++ } ++ else ++ { ++ result = device->CreateBuffer(&bufferDesc, NULL, &mBuffer); ++ } ++ + if (FAILED(result)) + { + return gl::error(GL_OUT_OF_MEMORY); +diff --git a/src/3rdparty/angle/src/libGLESv2/renderer/BufferStorage9.cpp b/src/3rdparty/angle/src/libGLESv2/renderer/BufferStorage9.cpp +index 7fc14fc..4468461 100644 +--- a/src/3rdparty/angle/src/libGLESv2/renderer/BufferStorage9.cpp ++++ b/src/3rdparty/angle/src/libGLESv2/renderer/BufferStorage9.cpp +@@ -54,7 +54,8 @@ void BufferStorage9::setData(const void* data, unsigned int size, unsigned int o + } + + mSize = std::max(mSize, offset + size); +- memcpy(reinterpret_cast(mMemory) + offset, data, size); ++ if (data) ++ memcpy(reinterpret_cast(mMemory) + offset, data, size); + } + + void BufferStorage9::clear() +-- +1.8.1.msysgit.1 + -- cgit v1.2.3