Commit c66681be by Jonah Ryan-Davis

Wrap Xcb reply call for error handling

The reply function for xcb_get_geometry was called without handling errors, causing a null-dereference in the fuzzer. These calls should be wrapped and handled safely. Bug: chromium:1080987 Change-Id: Ie1377909b68375fa9bc6eb54bdcbfda0627fd680 Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/45068 Presubmit-Ready: Jonah Ryan-Davis <jonahr@google.com> Reviewed-by: 's avatarAlexis Hétu <sugoi@google.com> Reviewed-by: 's avatarNicolas Capens <nicolascapens@google.com> Kokoro-Result: kokoro <noreply+kokoro@google.com> Tested-by: 's avatarJonah Ryan-Davis <jonahr@google.com>
parent 64da65bd
...@@ -87,6 +87,24 @@ private: ...@@ -87,6 +87,24 @@ private:
LibXcb libXcb; LibXcb libXcb;
VkExtent2D getWindowSize(xcb_connection_t *connection, xcb_window_t window)
{
VkExtent2D windowExtent = { 0, 0 };
xcb_generic_error_t *error = nullptr;
auto geom = libXcb->xcb_get_geometry_reply(connection, libXcb->xcb_get_geometry(connection, window), &error);
if(error)
{
free(error);
}
else
{
windowExtent.width = static_cast<uint32_t>(geom->width);
windowExtent.height = static_cast<uint32_t>(geom->height);
}
free(geom);
return windowExtent;
}
} // anonymous namespace } // anonymous namespace
namespace vk { namespace vk {
...@@ -110,9 +128,7 @@ void XcbSurfaceKHR::getSurfaceCapabilities(VkSurfaceCapabilitiesKHR *pSurfaceCap ...@@ -110,9 +128,7 @@ void XcbSurfaceKHR::getSurfaceCapabilities(VkSurfaceCapabilitiesKHR *pSurfaceCap
{ {
SurfaceKHR::getSurfaceCapabilities(pSurfaceCapabilities); SurfaceKHR::getSurfaceCapabilities(pSurfaceCapabilities);
auto geom = libXcb->xcb_get_geometry_reply(connection, libXcb->xcb_get_geometry(connection, window), nullptr); VkExtent2D extent = getWindowSize(connection, window);
VkExtent2D extent = { static_cast<uint32_t>(geom->width), static_cast<uint32_t>(geom->height) };
free(geom);
pSurfaceCapabilities->currentExtent = extent; pSurfaceCapabilities->currentExtent = extent;
pSurfaceCapabilities->minImageExtent = extent; pSurfaceCapabilities->minImageExtent = extent;
...@@ -144,9 +160,7 @@ VkResult XcbSurfaceKHR::present(PresentImage *image) ...@@ -144,9 +160,7 @@ VkResult XcbSurfaceKHR::present(PresentImage *image)
auto it = graphicsContexts.find(image); auto it = graphicsContexts.find(image);
if(it != graphicsContexts.end()) if(it != graphicsContexts.end())
{ {
auto geom = libXcb->xcb_get_geometry_reply(connection, libXcb->xcb_get_geometry(connection, window), nullptr); VkExtent2D windowExtent = getWindowSize(connection, window);
VkExtent2D windowExtent = { static_cast<uint32_t>(geom->width), static_cast<uint32_t>(geom->height) };
free(geom);
VkExtent3D extent = image->getImage()->getMipLevelExtent(VK_IMAGE_ASPECT_COLOR_BIT, 0); VkExtent3D extent = image->getImage()->getMipLevelExtent(VK_IMAGE_ASPECT_COLOR_BIT, 0);
if(windowExtent.width != extent.width || windowExtent.height != extent.height) if(windowExtent.width != extent.width || windowExtent.height != extent.height)
......
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