Bug 1265394 - Handle infinite values in SetPosition and SetOrientation; r=padenot draft
authorDan Minor <dminor@mozilla.com>
Tue, 05 Jul 2016 14:29:59 -0400
changeset 384581 d09616b16b05e975cd814f065e37ecbe1887f492
parent 384172 49cf9fdc009c41fb2c0fecad4ac2eb4e305c6541
child 524737 b5b63e25ffd98dd47e60f1a095ce03424e8b7090
push id22308
push userdminor@mozilla.com
push dateWed, 06 Jul 2016 16:58:07 +0000
reviewerspadenot
bugs1265394
milestone50.0a1
Bug 1265394 - Handle infinite values in SetPosition and SetOrientation; r=padenot Passing infinite values into an AudioParam will trigger an assert in debug builds. Returning early here mimics the non-debug behaviour of refusing to insert an event with an infinite value. MozReview-Commit-ID: BaAtiAnh1s
dom/media/webaudio/PannerNode.h
--- a/dom/media/webaudio/PannerNode.h
+++ b/dom/media/webaudio/PannerNode.h
@@ -7,16 +7,17 @@
 #ifndef PannerNode_h_
 #define PannerNode_h_
 
 #include "AudioNode.h"
 #include "mozilla/dom/PannerNodeBinding.h"
 #include "ThreeDPoint.h"
 #include "mozilla/WeakPtr.h"
 #include "WebAudioUtils.h"
+#include <limits>
 #include <set>
 
 namespace mozilla {
 namespace dom {
 
 class AudioContext;
 class AudioBufferSourceNode;
 
@@ -64,24 +65,34 @@ public:
   void SetDistanceModel(DistanceModelType aDistanceModel)
   {
     mDistanceModel = aDistanceModel;
     SendInt32ParameterToStream(DISTANCE_MODEL, int32_t(mDistanceModel));
   }
 
   void SetPosition(double aX, double aY, double aZ)
   {
+    if (fabs(aX) > std::numeric_limits<float>::max() ||
+        fabs(aY) > std::numeric_limits<float>::max() ||
+        fabs(aZ) > std::numeric_limits<float>::max()) {
+      return;
+    }
     mPositionX->SetValue(aX);
     mPositionY->SetValue(aY);
     mPositionZ->SetValue(aZ);
     SendThreeDPointParameterToStream(POSITION, ConvertAudioParamTo3DP(mPositionX, mPositionY, mPositionZ));
   }
 
   void SetOrientation(double aX, double aY, double aZ)
   {
+    if (fabs(aX) > std::numeric_limits<float>::max() ||
+        fabs(aY) > std::numeric_limits<float>::max() ||
+        fabs(aZ) > std::numeric_limits<float>::max()) {
+      return;
+    }
     mOrientationX->SetValue(aX);
     mOrientationY->SetValue(aY);
     mOrientationZ->SetValue(aZ);
     SendThreeDPointParameterToStream(ORIENTATION, ConvertAudioParamTo3DP(mOrientationX, mOrientationY, mOrientationZ));
   }
 
   void SetVelocity(double aX, double aY, double aZ)
   {