]> jfr.im git - yt-dlp.git/commitdiff
[jsinterp] Handle `NaN` in bitwise operators
authorpukkandan <redacted>
Fri, 19 May 2023 21:27:59 +0000 (02:57 +0530)
committerpukkandan <redacted>
Fri, 19 May 2023 22:37:17 +0000 (04:07 +0530)
Closes #6131

test/test_jsinterp.py
test/test_youtube_signature.py
yt_dlp/jsinterp.py

index 3283657d7005d6830dd937b933e915086b364549..26711502a44c1429d290eb75163e2d94e413fc42 100644 (file)
@@ -445,6 +445,16 @@ def test_bitwise_operators_overflow(self):
         jsi = JSInterpreter('function x(){return 1236566549 << 5}')
         self.assertEqual(jsi.call_function('x'), 915423904)
 
+    def test_bitwise_operators_typecast(self):
+        jsi = JSInterpreter('function x(){return null << 5}')
+        self.assertEqual(jsi.call_function('x'), 0)
+
+        jsi = JSInterpreter('function x(){return undefined >> 5}')
+        self.assertEqual(jsi.call_function('x'), 0)
+
+        jsi = JSInterpreter('function x(){return 42 << NaN}')
+        self.assertEqual(jsi.call_function('x'), 42)
+
     def test_negative(self):
         jsi = JSInterpreter("function f(){return 2    *    -2.0;}")
         self.assertEqual(jsi.call_function('f'), -4)
index e2b3f0870ddaa08166c25d947cae53a7f75cca4e..13120d97f8ad6106be948d800387c0ae7429f324 100644 (file)
         'https://www.youtube.com/s/player/6f20102c/player_ias.vflset/en_US/base.js',
         'lE8DhoDmKqnmJJ', 'pJTTX6XyJP2BYw',
     ),
+    (
+        'https://www.youtube.com/s/player/cfa9e7cb/player_ias.vflset/en_US/base.js',
+        'aCi3iElgd2kq0bxVbQ', 'QX1y8jGb2IbZ0w',
+    ),
 ]
 
 
index 5571ecfeb1b692ae8e9f76cef337e778d8f64dec..965b1c0f2980bb90cd0ad72c6636eea07b796967 100644 (file)
 
 def _js_bit_op(op):
     def zeroise(x):
-        return 0 if x in (None, JS_Undefined) else x
+        if x in (None, JS_Undefined):
+            return 0
+        with contextlib.suppress(TypeError):
+            if math.isnan(x):  # NB: NaN cannot be checked by membership
+                return 0
+        return x
 
     def wrapped(a, b):
         return op(zeroise(a), zeroise(b)) & 0xffffffff