Avoid out of bounds reads from OffscreenCanvas SkImage. At Xperi we have some tests which check OffscreenCanvas corner case usage. The problematic tests create 100x50 px image fill it with some color and then try reading canvas image data which is either outside of image bounds, ex 1x1 pixel from (x,y)==(-10,-10), or some coordinates within the image, but with negative width and height. This seems to be the correct behavior according to the specification. Until recently Chromium did always pass those tests without problems. In M123 however when a specific set of reads happen any consecutive reads from outside of bounds return a rect that seems to contain some random data. I haven't been able to establish if this is random noise, or if we somehow manage to read renderer process memory. What is really interesting about this case is that the invalid out of bounds reads that can't possibly read any pixels from the underlying SkImage does actually descend into skia code responsible for reading pixels. Skia complains about this and it seems it should fail to read anything, or at least claims it failed to read anything and we get a bunch of texture read error logs. I think this is one of the main problems here. The validation of inputs for this edge case should be done in the blink canvas code. What is the point of reading from the image if we know it can't succeed in the first place? This patch adds an extra readback rect validation step and in case the validation fails, it returns zero initialized output image buffer. This is what the code used to return after the cavas image readback failed. The problem can be reproduced using WPT tests: * 2d.imageData.get.source.negative.html * 2d.imageData.get.source.outside.html The trick is to load the one after the other in the same renderer process instance. Running them individually works, but when both are run in the same instance the "outside" test fails after being loaded after "negative" one. Bug: 346852663 Change-Id: I4cd37bc4c31088a9ddbdf5aa90082a06cef5d2fe Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5633434 Reviewed-by: Justin Novosad <junov@chromium.org> Commit-Queue: Justin Novosad <junov@chromium.org> Cr-Commit-Position: refs/heads/main@{#1317336}
Chromium is an open-source browser project that aims to build a safer, faster, and more stable way for all users to experience the web.
The project's web site is https://www.chromium.org.
To check out the source code locally, don't use git clone! Instead, follow the instructions on how to get the code.
Documentation in the source is rooted in docs/README.md.
Learn how to Get Around the Chromium Source Code Directory Structure.
For historical reasons, there are some small top level directories. Now the guidance is that new top level directories are for product (e.g. Chrome, Android WebView, Ash). Even if these products have multiple executables, the code should be in subdirectories of the product.
If you found a bug, please file it at https://crbug.com/new.