Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Conversation

@cbracken
Copy link
Member

@cbracken cbracken commented Mar 6, 2021

In MakeSkSurfaceFromBackingStore and other places in embedder.cc, we
call a texture or framebuffer destruction callback without first
verifying it's non-null. This adds a check before such calls.

Currently fl_renderer_gl_create_backing_store() in the Linux GTK
embedder and ExternalTextureGL::PopulateTexture() in the Windows
embedder either explicitly or implicitly set a null destruction
callback.

This prevents a crash reported when running under OpenGL ES 2.0 reported
in flutter/flutter#76881. Note that while this prevents a
crash, it does not fix the regression reported in that bug.

Pre-launch Checklist

  • I read the Contributor Guide and followed the process outlined there for submitting PRs.
  • I read the Tree Hygiene wiki page, which explains my responsibilities.
  • I read and followed the Flutter Style Guide and the C++, Objective-C, Java style guides.
  • I listed at least one issue that this PR fixes in the description above.
  • I added new tests to check the change I am making or feature I am adding, or Hixie said the PR is test-exempt. See testing the engine for instructions on
    writing and running engine tests.
  • I updated/added relevant documentation (doc comments with ///).
  • I signed the CLA.
  • All existing and new tests are passing.
  • The reviewer has submitted any presubmit flakes in this PR using the engine presubmit flakes form before re-triggering the failure.

If you need help, consider asking for advice on the #hackers-new channel on Discord.

In MakeSkSurfaceFromBackingStore and other places in embedder.cc, we
call a texture or framebuffer destruction callback without first
verifying it's non-null. This adds a check before such calls.

Currently fl_renderer_gl_create_backing_store() in the Linux GTK
embedder and ExternalTextureGL::PopulateTexture() in the Windows
embedder either explicitly or implicitly set a null destruction
callback.

This prevents a crash reported when running under OpenGL ES 2.0 reported
in flutter/flutter#76881.

While this prevents the crash, it does not fix the underlying issue.
@flutter-dashboard
Copy link

It looks like this pull request may not have tests. Please make sure to add tests before merging. If you need an exemption to this rule, contact Hixie on the #hackers channel in Chat.

If you are not sure if you need tests, consider this rule of thumb: the purpose of a test is to make sure someone doesn't accidentally revert the fix. Ask yourself, is there anything in your PR that you feel it is important we not accidentally revert back to how it was before your fix?

Reviewers: Read the Tree Hygiene page and make sure this patch meets those guidelines before LGTMing.

@cbracken
Copy link
Member Author

cbracken commented Mar 6, 2021

@chinmaygarde any suggestions on what he most straightforward way to test this might be? Most of the tests in embedder_unittests_gl.cc are a lot more involved.

Copy link
Member

@chinmaygarde chinmaygarde left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Its hard to imagine when the caller might set this to nullptr as it would be a pretty massive leak. I suppose if the FBO is the default window bound framebuffer? Having a null check is fine. You can write a death test for this in embedder_unittests.

@cbracken
Copy link
Member Author

cbracken commented Mar 8, 2021

Yep. Noticed this in the Linux embedder initially. Looks like there may be a case in the Windows embedder as well. Both need separate fixes.

@cbracken cbracken merged commit 7764b5c into flutter:master Mar 9, 2021
@cbracken cbracken deleted the guard-null-dtor branch March 9, 2021 01:31
engine-flutter-autoroll added a commit to engine-flutter-autoroll/flutter that referenced this pull request Mar 9, 2021
fluttergithubbot pushed a commit to flutter/flutter that referenced this pull request Mar 9, 2021
cbracken added a commit that referenced this pull request Mar 10, 2021
While we no longer crash when the framebuffer destruction_callback is
null (patched in #24845) we should
bet setting one, even if it's a no-op containing a comment pointing to
where cleanup is implemented.
hjfreyer pushed a commit to hjfreyer/engine that referenced this pull request Mar 22, 2021
In MakeSkSurfaceFromBackingStore and other places in embedder.cc, we
call a texture or framebuffer destruction callback without first
verifying it's non-null. This adds a check before such calls.

Currently fl_renderer_gl_create_backing_store() in the Linux GTK
embedder and ExternalTextureGL::PopulateTexture() in the Windows
embedder either explicitly or implicitly set a null destruction
callback.

This prevents a crash reported when running under OpenGL ES 2.0 reported
in flutter/flutter#76881.

While this prevents the crash, it does not fix the underlying issue.
hjfreyer pushed a commit to hjfreyer/engine that referenced this pull request Mar 22, 2021
While we no longer crash when the framebuffer destruction_callback is
null (patched in flutter#24845) we should
bet setting one, even if it's a no-op containing a comment pointing to
where cleanup is implemented.
chriscraws pushed a commit to chriscraws/engine that referenced this pull request Mar 23, 2021
In MakeSkSurfaceFromBackingStore and other places in embedder.cc, we
call a texture or framebuffer destruction callback without first
verifying it's non-null. This adds a check before such calls.

Currently fl_renderer_gl_create_backing_store() in the Linux GTK
embedder and ExternalTextureGL::PopulateTexture() in the Windows
embedder either explicitly or implicitly set a null destruction
callback.

This prevents a crash reported when running under OpenGL ES 2.0 reported
in flutter/flutter#76881.

While this prevents the crash, it does not fix the underlying issue.
chriscraws pushed a commit to chriscraws/engine that referenced this pull request Mar 23, 2021
While we no longer crash when the framebuffer destruction_callback is
null (patched in flutter#24845) we should
bet setting one, even if it's a no-op containing a comment pointing to
where cleanup is implemented.
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants