Skip to content

Commit 1b0b660

Browse files
leegn4asaghul
authored andcommitted
Fix UAF in fast array delete
1 parent c2cd743 commit 1b0b660

2 files changed

Lines changed: 17 additions & 10 deletions

File tree

quickjs.c

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9815,16 +9815,6 @@ static int delete_property(JSContext *ctx, JSObject *p, JSAtom atom)
98159815
if (p->class_id == JS_CLASS_ARRAY ||
98169816
p->class_id == JS_CLASS_ARGUMENTS ||
98179817
p->class_id == JS_CLASS_MAPPED_ARGUMENTS) {
9818-
/* Special case deleting the last element of a fast Array */
9819-
if (idx == p->u.array.count - 1) {
9820-
if (p->class_id == JS_CLASS_MAPPED_ARGUMENTS) {
9821-
free_var_ref(ctx->rt, p->u.array.u.var_refs[idx]);
9822-
} else {
9823-
JS_FreeValue(ctx, p->u.array.u.values[idx]);
9824-
}
9825-
p->u.array.count = idx;
9826-
return true;
9827-
}
98289818
if (convert_fast_array_to_array(ctx, p))
98299819
return -1;
98309820
goto redo;

tests/bug1430.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import { assert } from "./assert.js";
2+
3+
const arr = [{ x: 0 }, { x: 1 }];
4+
5+
delete arr[1];
6+
7+
assert(arr.length, 2);
8+
assert(1 in arr, false);
9+
assert(arr[1], undefined);
10+
11+
arr.push({ y: 2 });
12+
13+
assert(arr.length, 3);
14+
assert(1 in arr, false);
15+
assert(2 in arr, true);
16+
assert(arr[1], undefined);
17+
assert(arr[2].y, 2);

0 commit comments

Comments
 (0)