Index: src/effects/SkDisplacementMapEffect.cpp |
diff --git a/src/effects/SkDisplacementMapEffect.cpp b/src/effects/SkDisplacementMapEffect.cpp |
index 3722178c29863e6264f40c15a0b82539ce21ea49..2258c3234db7552216e5a2d3841a2591ec5f80e3 100644 |
--- a/src/effects/SkDisplacementMapEffect.cpp |
+++ b/src/effects/SkDisplacementMapEffect.cpp |
@@ -126,6 +126,20 @@ void computeDisplacement(SkDisplacementMapEffect::ChannelSelectorType xChannelSe |
} |
} |
+bool ChannelSelectorTypeIsValid(SkDisplacementMapEffect::ChannelSelectorType channelSelector) { |
+ switch (channelSelector) { |
+ case SkDisplacementMapEffect::kUnknown_ChannelSelectorType: |
+ case SkDisplacementMapEffect::kR_ChannelSelectorType: |
+ case SkDisplacementMapEffect::kG_ChannelSelectorType: |
+ case SkDisplacementMapEffect::kB_ChannelSelectorType: |
+ case SkDisplacementMapEffect::kA_ChannelSelectorType: |
+ return true; |
+ default: |
+ break; |
+ } |
+ return false; |
+} |
+ |
} // end namespace |
/////////////////////////////////////////////////////////////////////////////// |
@@ -152,6 +166,9 @@ SkDisplacementMapEffect::SkDisplacementMapEffect(SkFlattenableReadBuffer& buffer |
fXChannelSelector = (SkDisplacementMapEffect::ChannelSelectorType) buffer.readInt(); |
fYChannelSelector = (SkDisplacementMapEffect::ChannelSelectorType) buffer.readInt(); |
fScale = buffer.readScalar(); |
+ buffer.validate(ChannelSelectorTypeIsValid(fXChannelSelector) && |
+ ChannelSelectorTypeIsValid(fYChannelSelector) && |
+ SkScalarIsFinite(fScale)); |
} |
void SkDisplacementMapEffect::flatten(SkFlattenableWriteBuffer& buffer) const { |