Fix a potential thread safety issue in VectorDrawable

Bug: 158839504
Bug: 185178568
Test: speculative
Change-Id: Id9f229f08fe5897dda25441fbaa15c98f8130de9
This commit is contained in:
John Reck
2021-04-22 16:55:09 -04:00
parent 0f311f7b28
commit 6edabc0301

View File

@@ -342,15 +342,19 @@ public class VectorDrawable extends Drawable {
private final Rect mTmpBounds = new Rect();
public VectorDrawable() {
this(new VectorDrawableState(null), null);
this(null, null);
}
/**
* The one constructor to rule them all. This is called by all public
* constructors to set the state and initialize local properties.
*/
private VectorDrawable(@NonNull VectorDrawableState state, @Nullable Resources res) {
mVectorState = state;
private VectorDrawable(@Nullable VectorDrawableState state, @Nullable Resources res) {
// As the mutable, not-thread-safe native instance is stored in VectorDrawableState, we
// need to always do a defensive copy even if mutate() isn't called. Otherwise
// draw() being called on 2 different VectorDrawable instances could still hit the same
// underlying native object.
mVectorState = new VectorDrawableState(state);
updateLocalState(res);
}