Sat, 03 Jan 2015 20:18:00 +0100
Conditionally enable double key logic according to:
private browsing mode or privacy.thirdparty.isolate preference and
implement in GetCookieStringCommon and FindCookie where it counts...
With some reservations of how to convince FindCookie users to test
condition and pass a nullptr when disabling double key logic.
1 var a = [1,2,3,4,5];
3 // Basic overflow in hoisted condition.
4 function foo(x, n) {
5 var v = 0;
6 for (var i = 0; i < n; i++)
7 v += x[i];
8 return v;
9 }
10 for (var i = 0; i < 15; i++)
11 assertEq(foo(a, 5), 15);
12 assertEq(foo(a, 6), NaN);
14 // Basic underflow in hoisted condition.
15 function foo2(x, m, n) {
16 var v = 0;
17 for (var i = m; i < n; i++)
18 v += x[i];
19 return v;
20 }
21 for (var i = 0; i < 15; i++)
22 assertEq(foo2(a, 0, 5), 15);
23 assertEq(foo2(a, -1, 5), NaN);
25 // Overflow when hoisting consolidated condition.
26 function foo3(x, m, n) {
27 var v = 0;
28 for (var i = m; i < n; i++)
29 v += x[i] + x[i + 1] + x[i + 2];
30 return v;
31 }
32 for (var i = 0; i < 15; i++)
33 assertEq(foo3(a, 0, 3), 27);
34 assertEq(foo3(a, 0, 4), NaN);
36 // Underflow when hoisting consolidated condition.
37 function foo4(x, m, n) {
38 var v = 0;
39 for (var i = m; i < n; i++)
40 v += x[i] + x[i - 1] + x[i - 2];
41 return v;
42 }
43 for (var i = 0; i < 15; i++)
44 assertEq(foo4(a, 2, 5), 27);
45 assertEq(foo4(a, 0, 5), NaN);
47 // Underflow due to decreasing index.
48 function foo5(x, n) {
49 var v = 0;
50 for (var i = 0; i < n; i++) {
51 v += x[i];
52 if (n == 4)
53 i -= 2;
54 if (i == -5)
55 break;
56 }
57 return v;
58 }
59 for (var i = 0; i < 15; i++)
60 assertEq(foo5(a, 5), 15);
61 assertEq(foo5(a, 4), NaN);
63 // Overflow after access at constant offset.
64 function foo6(x, m, n) {
65 var v = 0;
66 for (var i = m; i < n; i++)
67 v += x[i + 10];
68 return v;
69 }
70 for (var i = 0; i < 15; i++)
71 assertEq(foo6(a, -10, -5), 15);
72 assertEq(foo6(a, -10, -4), NaN);
74 // Underflow after access at constant offset.
75 function foo7(x, m, n) {
76 var v = 0;
77 for (var i = m; i < n; i++)
78 v += x[i + 10];
79 return v;
80 }
81 for (var i = 0; i < 15; i++)
82 assertEq(foo7(a, -10, -5), 15);
83 assertEq(foo7(a, -11, -5), NaN);