Skip to content

Commit

Permalink
src: fix napi_check_object_type_tag()
Browse files Browse the repository at this point in the history
This fixes a comparison failure occurring when the upper value of a
type tag is 0, or a type tag value is 0.

Signed-off-by: Daeyeon Jeong daeyeon.dev@gmail.com

PR-URL: #43788
Fixes: #43786
Reviewed-By: Michael Dawson <midawson@redhat.com>
Reviewed-By: Chengzhong Wu <legendecas@gmail.com>
  • Loading branch information
daeyeon authored and mhdawson committed Jul 14, 2022
1 parent 11d346f commit cc7d4ab
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 4 deletions.
12 changes: 10 additions & 2 deletions src/js_native_api_v8.cc
Original file line number Diff line number Diff line change
Expand Up @@ -2452,8 +2452,16 @@ napi_status NAPI_CDECL napi_check_object_type_tag(napi_env env,
napi_type_tag tag;
val.As<v8::BigInt>()->ToWordsArray(
&sign, &size, reinterpret_cast<uint64_t*>(&tag));
if (size == 2 && sign == 0)
*result = (tag.lower == type_tag->lower && tag.upper == type_tag->upper);
if (sign == 0) {
if (size == 2) {
*result =
(tag.lower == type_tag->lower && tag.upper == type_tag->upper);
} else if (size == 1) {
*result = (tag.lower == type_tag->lower && 0 == type_tag->upper);
} else if (size == 0) {
*result = (0 == type_tag->lower && 0 == type_tag->upper);
}
}
}

return GET_RETURN_STATUS(env);
Expand Down
9 changes: 9 additions & 0 deletions test/js-native-api/test_object/test.js
Original file line number Diff line number Diff line change
Expand Up @@ -163,14 +163,23 @@ assert.strictEqual(newObject.test_string, 'test string');
// Verify that objects can be type-tagged and type-tag-checked.
const obj1 = test_object.TypeTaggedInstance(0);
const obj2 = test_object.TypeTaggedInstance(1);
const obj3 = test_object.TypeTaggedInstance(2);
const obj4 = test_object.TypeTaggedInstance(3);

// Verify that type tags are correctly accepted.
assert.strictEqual(test_object.CheckTypeTag(0, obj1), true);
assert.strictEqual(test_object.CheckTypeTag(1, obj2), true);
assert.strictEqual(test_object.CheckTypeTag(2, obj3), true);
assert.strictEqual(test_object.CheckTypeTag(3, obj4), true);

// Verify that wrongly tagged objects are rejected.
assert.strictEqual(test_object.CheckTypeTag(0, obj2), false);
assert.strictEqual(test_object.CheckTypeTag(1, obj1), false);
assert.strictEqual(test_object.CheckTypeTag(0, obj3), false);
assert.strictEqual(test_object.CheckTypeTag(1, obj4), false);
assert.strictEqual(test_object.CheckTypeTag(2, obj4), false);
assert.strictEqual(test_object.CheckTypeTag(3, obj3), false);
assert.strictEqual(test_object.CheckTypeTag(4, obj3), false);

// Verify that untagged objects are rejected.
assert.strictEqual(test_object.CheckTypeTag(0, {}), false);
Expand Down
7 changes: 5 additions & 2 deletions test/js-native-api/test_object/test_object.c
Original file line number Diff line number Diff line change
Expand Up @@ -605,9 +605,12 @@ static napi_value TestSeal(napi_env env,
}

// We create two type tags. They are basically 128-bit UUIDs.
static const napi_type_tag type_tags[2] = {
static const napi_type_tag type_tags[5] = {
{ 0xdaf987b3cc62481a, 0xb745b0497f299531 },
{ 0xbb7936c374084d9b, 0xa9548d0762eeedb9 }
{ 0xbb7936c374084d9b, 0xa9548d0762eeedb9 },
{ 0xa5ed9ce2e4c00c38, 0 },
{ 0, 0 },
{ 0xa5ed9ce2e4c00c38, 0xdaf987b3cc62481a },
};

static napi_value
Expand Down

0 comments on commit cc7d4ab

Please sign in to comment.