Skip to content

NullPointerException in TextDrawable.Draw, seemingly from a race condition in ComponentHost$InterleavedDispatchDraw #927

@cable729

Description

@cable729

Version

We are using quite an old version: v2021.10.25

Description

Stack trace:

12-27 22:03:35.873 E AndroidRuntime: java.lang.NullPointerException: Attempt to invoke virtual method 'int android.graphics.Canvas.save()' on a null object reference
12-27 22:03:35.873 E AndroidRuntime:    at com.facebook.litho.widget.TextDrawable.draw(TextDrawable.java:120)
12-27 22:03:35.873 E AndroidRuntime:    at com.facebook.litho.ComponentHost$InterleavedDispatchDraw.drawNext(ComponentHost.java:1406)
12-27 22:03:35.873 E AndroidRuntime:    at com.facebook.litho.ComponentHost$InterleavedDispatchDraw.-$$Nest$mdrawNext(ComponentHost.java:0)
12-27 22:03:35.873 E AndroidRuntime:    at com.facebook.litho.ComponentHost.getChildDrawingOrder(ComponentHost.java:800)
12-27 22:03:35.873 E AndroidRuntime:    at android.view.ViewGroup.getAndVerifyPreorderedIndex(ViewGroup.java:2097)
12-27 22:03:35.873 E AndroidRuntime:    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4287)
12-27 22:03:35.873 E AndroidRuntime:    at com.facebook.litho.ComponentHost.dispatchDraw(ComponentHost.java:749)
12-27 22:03:35.873 E AndroidRuntime:    at android.view.View.draw(View.java:23220)

Now, TextDrawable.draw(Canvas) is being passed a null canvas from ComponentHost$InterleavedDispatchDraw.-$$Nest$mdrawNext. That method checks that mcanvas != null, otherwise it returns. The only thing setting mCanvas to null is ComponentHost$InterleavedDispatchDraw.-$$Nest$mend. So it seems another thread is calling end() while drawNext() is in process.

Possible Fixes

  • Should end() call isRunning() and abort if it's still running? If so, callers would have to retry `end()
  • Should InterleavedDispatchDraw synchronize itself?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions