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}
1 file changed
tree: 9727542424600456fc777b76c4ef1820155cd2a9
  1. android_webview/
  2. apps/
  3. ash/
  4. base/
  5. build/
  6. build_overrides/
  7. buildtools/
  8. cc/
  9. chrome/
  10. chromecast/
  11. chromeos/
  12. codelabs/
  13. components/
  14. content/
  15. courgette/
  16. crypto/
  17. dbus/
  18. device/
  19. docs/
  20. extensions/
  21. fuchsia_web/
  22. gin/
  23. google_apis/
  24. google_update/
  25. gpu/
  26. headless/
  27. infra/
  28. ios/
  29. ipc/
  30. media/
  31. mojo/
  32. native_client_sdk/
  33. net/
  34. pdf/
  35. ppapi/
  36. printing/
  37. remoting/
  38. rlz/
  39. sandbox/
  40. services/
  41. skia/
  42. sql/
  43. storage/
  44. styleguide/
  45. testing/
  46. third_party/
  47. tools/
  48. ui/
  49. url/
  50. webkit/
  51. .clang-format
  52. .clang-tidy
  53. .clangd
  54. .eslintrc.js
  55. .git-blame-ignore-revs
  56. .gitallowed
  57. .gitattributes
  58. .gitignore
  59. .gitmodules
  60. .gn
  61. .mailmap
  62. .rustfmt.toml
  63. .vpython3
  64. .yapfignore
  65. ATL_OWNERS
  66. AUTHORS
  67. BUILD.gn
  68. CODE_OF_CONDUCT.md
  69. codereview.settings
  70. CPPLINT.cfg
  71. DEPS
  72. DIR_METADATA
  73. LICENSE
  74. LICENSE.chromium_os
  75. OWNERS
  76. PRESUBMIT.py
  77. PRESUBMIT_test.py
  78. PRESUBMIT_test_mocks.py
  79. README.md
  80. WATCHLISTS
README.md

Logo Chromium

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.