Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(771)

Unified Diff: src/js/harmony-atomics.js

Issue 1676613002: [Atomics] Fix atomic access index validation (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: merge master Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | src/js/prologue.js » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/js/harmony-atomics.js
diff --git a/src/js/harmony-atomics.js b/src/js/harmony-atomics.js
index b861a2a47188c498fa202ef085c1013fa49bc17f..9f80227426b41f106d34bf1604702be0ad2ae377 100644
--- a/src/js/harmony-atomics.js
+++ b/src/js/harmony-atomics.js
@@ -12,12 +12,14 @@
// Imports
var GlobalObject = global.Object;
+var MakeRangeError;
var MakeTypeError;
var MaxSimple;
var toStringTagSymbol = utils.ImportNow("to_string_tag_symbol");
utils.Import(function(from) {
MakeTypeError = from.MakeTypeError;
+ MakeRangeError = from.MakeRangeError;
MaxSimple = from.MaxSimple;
});
@@ -37,14 +39,24 @@ function CheckSharedInteger32TypedArray(ia) {
}
}
+// https://tc39.github.io/ecmascript_sharedmem/shmem.html#Atomics.ValidateAtomicAccess
+function ValidateIndex(index, length) {
+ var numberIndex = TO_NUMBER(index);
+ var accessIndex = TO_INTEGER(numberIndex);
+ if (numberIndex !== accessIndex) {
+ throw MakeRangeError(kInvalidAtomicAccessIndex);
+ }
+ if (accessIndex < 0 || accessIndex >= length) {
+ throw MakeRangeError(kInvalidAtomicAccessIndex);
+ }
+ return accessIndex;
+}
+
//-------------------------------------------------------------------
function AtomicsCompareExchangeJS(sta, index, oldValue, newValue) {
CheckSharedIntegerTypedArray(sta);
- index = TO_INTEGER(index);
- if (index < 0 || index >= %_TypedArrayGetLength(sta)) {
- return UNDEFINED;
- }
+ index = ValidateIndex(index, %_TypedArrayGetLength(sta));
oldValue = TO_NUMBER(oldValue);
newValue = TO_NUMBER(newValue);
return %_AtomicsCompareExchange(sta, index, oldValue, newValue);
@@ -52,79 +64,55 @@ function AtomicsCompareExchangeJS(sta, index, oldValue, newValue) {
function AtomicsLoadJS(sta, index) {
CheckSharedIntegerTypedArray(sta);
- index = TO_INTEGER(index);
- if (index < 0 || index >= %_TypedArrayGetLength(sta)) {
- return UNDEFINED;
- }
+ index = ValidateIndex(index, %_TypedArrayGetLength(sta));
return %_AtomicsLoad(sta, index);
}
function AtomicsStoreJS(sta, index, value) {
CheckSharedIntegerTypedArray(sta);
- index = TO_INTEGER(index);
- if (index < 0 || index >= %_TypedArrayGetLength(sta)) {
- return UNDEFINED;
- }
+ index = ValidateIndex(index, %_TypedArrayGetLength(sta));
value = TO_NUMBER(value);
return %_AtomicsStore(sta, index, value);
}
function AtomicsAddJS(ia, index, value) {
CheckSharedIntegerTypedArray(ia);
- index = TO_INTEGER(index);
- if (index < 0 || index >= %_TypedArrayGetLength(ia)) {
- return UNDEFINED;
- }
+ index = ValidateIndex(index, %_TypedArrayGetLength(ia));
value = TO_NUMBER(value);
return %_AtomicsAdd(ia, index, value);
}
function AtomicsSubJS(ia, index, value) {
CheckSharedIntegerTypedArray(ia);
- index = TO_INTEGER(index);
- if (index < 0 || index >= %_TypedArrayGetLength(ia)) {
- return UNDEFINED;
- }
+ index = ValidateIndex(index, %_TypedArrayGetLength(ia));
value = TO_NUMBER(value);
return %_AtomicsSub(ia, index, value);
}
function AtomicsAndJS(ia, index, value) {
CheckSharedIntegerTypedArray(ia);
- index = TO_INTEGER(index);
- if (index < 0 || index >= %_TypedArrayGetLength(ia)) {
- return UNDEFINED;
- }
+ index = ValidateIndex(index, %_TypedArrayGetLength(ia));
value = TO_NUMBER(value);
return %_AtomicsAnd(ia, index, value);
}
function AtomicsOrJS(ia, index, value) {
CheckSharedIntegerTypedArray(ia);
- index = TO_INTEGER(index);
- if (index < 0 || index >= %_TypedArrayGetLength(ia)) {
- return UNDEFINED;
- }
+ index = ValidateIndex(index, %_TypedArrayGetLength(ia));
value = TO_NUMBER(value);
return %_AtomicsOr(ia, index, value);
}
function AtomicsXorJS(ia, index, value) {
CheckSharedIntegerTypedArray(ia);
- index = TO_INTEGER(index);
- if (index < 0 || index >= %_TypedArrayGetLength(ia)) {
- return UNDEFINED;
- }
+ index = ValidateIndex(index, %_TypedArrayGetLength(ia));
value = TO_NUMBER(value);
return %_AtomicsXor(ia, index, value);
}
function AtomicsExchangeJS(ia, index, value) {
CheckSharedIntegerTypedArray(ia);
- index = TO_INTEGER(index);
- if (index < 0 || index >= %_TypedArrayGetLength(ia)) {
- return UNDEFINED;
- }
+ index = ValidateIndex(index, %_TypedArrayGetLength(ia));
value = TO_NUMBER(value);
return %_AtomicsExchange(ia, index, value);
}
@@ -137,10 +125,7 @@ function AtomicsIsLockFreeJS(size) {
function AtomicsFutexWaitJS(ia, index, value, timeout) {
CheckSharedInteger32TypedArray(ia);
- index = TO_INTEGER(index);
- if (index < 0 || index >= %_TypedArrayGetLength(ia)) {
- return UNDEFINED;
- }
+ index = ValidateIndex(index, %_TypedArrayGetLength(ia));
if (IS_UNDEFINED(timeout)) {
timeout = INFINITY;
} else {
@@ -156,20 +141,17 @@ function AtomicsFutexWaitJS(ia, index, value, timeout) {
function AtomicsFutexWakeJS(ia, index, count) {
CheckSharedInteger32TypedArray(ia);
- index = TO_INTEGER(index);
- if (index < 0 || index >= %_TypedArrayGetLength(ia)) {
- return UNDEFINED;
- }
+ index = ValidateIndex(index, %_TypedArrayGetLength(ia));
count = MaxSimple(0, TO_INTEGER(count));
return %AtomicsFutexWake(ia, index, count);
}
function AtomicsFutexWakeOrRequeueJS(ia, index1, count, value, index2) {
CheckSharedInteger32TypedArray(ia);
- index1 = TO_INTEGER(index1);
+ index1 = ValidateIndex(index1, %_TypedArrayGetLength(ia));
count = MaxSimple(0, TO_INTEGER(count));
value = TO_INT32(value);
- index2 = TO_INTEGER(index2);
+ index2 = ValidateIndex(index2, %_TypedArrayGetLength(ia));
if (index1 < 0 || index1 >= %_TypedArrayGetLength(ia) ||
index2 < 0 || index2 >= %_TypedArrayGetLength(ia)) {
return UNDEFINED;
« no previous file with comments | « no previous file | src/js/prologue.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698