Handle errors in JSON.parse triggered by Proxies (#4134)

Fixes: #4130

JerryScript-DCO-1.0-Signed-off-by: Peter Gal pgal.usz@partner.samsung.com
This commit is contained in:
Péter Gál
2020-08-14 08:25:43 +02:00
committed by GitHub
parent 8964a2bd18
commit 9d586fea76
3 changed files with 172 additions and 49 deletions
+88
View File
@@ -0,0 +1,88 @@
// Copyright JS Foundation and other contributors, http://js.foundation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
/* Test JSON parse [[delete]] with Array */
var badDeleteArray = new Proxy([0], {
deleteProperty: function() {
throw "My Super Error A";
}
});
try {
JSON.parse('[0,0]', function() { this[1] = badDeleteArray; });
} catch (ex) {
assert(ex === "My Super Error A");
}
/* Test JSON parse [[delete]] with Objects */
var badDeleteObj = new Proxy([0], {
deleteProperty: function() {
throw "My Super Error B";
}
});
try {
JSON.parse('[0,0]', function() { this[1] = badDeleteObj; });
} catch (ex) {
assert(ex === "My Super Error B");
}
/* Test JSON parse property define with Array */
var badDefineArray = new Proxy([null], {
defineProperty: function(_, name) {
throw "My Super Error C";
}
});
try {
JSON.parse('["first", null]', function(_, value) {
if (value === 'first') {
this[1] = badDefineArray;
}
return value;
});
} catch (ex) {
assert(ex === "My Super Error C");
}
/* Test JSON parse property define with Object */
var badDefineObj = new Proxy({0: null}, {
defineProperty: function(_, name) {
throw "My Super Error D";
}
});
try {
JSON.parse('["first", null]', function(_, value) {
if (value === 'first') {
this[1] = badDefineObj;
}
return value;
});
} catch (ex) {
assert(ex === "My Super Error D");
}
/* Test JSON parse keys call */
var badKeys = new Proxy({}, {
ownKeys: function() {
throw "My Super Error E";
}
});
try {
JSON.parse('[0,0]', function() { this[1] = badKeys; });
} catch (ex) {
assert(ex === "My Super Error E");
}