Skip to content

Commit daa400b

Browse files
sortiecommit-bot@chromium.org
authored andcommitted
[sdk] Fix all uses of the view() constructor to always use offsetInBytes.
The list being viewed can sometimes itself be a sublist view, but the default view() constructor doesn't take that into account, and instead the caller needs to be aware of the case. This change makes all such uses use offsetInBytes, even in cases that's not needed, so it's trivial to audit that it's always used correctly. In the cases it's not needed, it just gets the value 0 and it's a no-operation. In the cases it's needed, it fixes a bug, such as in _WebSocketProtocolTransformer.add(). Closes #39589 Change-Id: I6e9bd5510f48ce378bdec2c64b56fe789dfb27ac Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/127165 Reviewed-by: Lasse R.H. Nielsen <lrn@google.com> Commit-Queue: Jonas Termansen <sortie@google.com>
1 parent 0dc6d59 commit daa400b

File tree

14 files changed

+55
-38
lines changed

14 files changed

+55
-38
lines changed

sdk/lib/_http/http_impl.dart

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -89,15 +89,16 @@ class _CopyingBytesBuilder implements BytesBuilder {
8989

9090
Uint8List takeBytes() {
9191
if (_length == 0) return _emptyList;
92-
var buffer = new Uint8List.view(_buffer.buffer, 0, _length);
92+
var buffer =
93+
new Uint8List.view(_buffer.buffer, _buffer.offsetInBytes, _length);
9394
clear();
9495
return buffer;
9596
}
9697

9798
Uint8List toBytes() {
9899
if (_length == 0) return _emptyList;
99100
return new Uint8List.fromList(
100-
new Uint8List.view(_buffer.buffer, 0, _length));
101+
new Uint8List.view(_buffer.buffer, _buffer.offsetInBytes, _length));
101102
}
102103

103104
int get length => _length;
@@ -1276,7 +1277,8 @@ class _HttpGZipSink extends ByteConversionSink {
12761277

12771278
void addSlice(List<int> chunk, int start, int end, bool isLast) {
12781279
if (chunk is Uint8List) {
1279-
_consume(new Uint8List.view(chunk.buffer, start, end - start));
1280+
_consume(new Uint8List.view(
1281+
chunk.buffer, chunk.offsetInBytes + start, end - start));
12801282
} else {
12811283
_consume(chunk.sublist(start, end - start));
12821284
}
@@ -1512,8 +1514,8 @@ class _HttpOutgoing implements StreamConsumer<List<int>> {
15121514
if (_gzip) {
15131515
_gzipAdd = socket.add;
15141516
if (_gzipBufferLength > 0) {
1515-
_gzipSink.add(
1516-
new Uint8List.view(_gzipBuffer.buffer, 0, _gzipBufferLength));
1517+
_gzipSink.add(new Uint8List.view(_gzipBuffer.buffer,
1518+
_gzipBuffer.offsetInBytes, _gzipBufferLength));
15171519
}
15181520
_gzipBuffer = null;
15191521
_gzipSink.close();
@@ -1523,7 +1525,8 @@ class _HttpOutgoing implements StreamConsumer<List<int>> {
15231525
}
15241526
// Add any remaining data in the buffer.
15251527
if (_length > 0) {
1526-
socket.add(new Uint8List.view(_buffer.buffer, 0, _length));
1528+
socket.add(
1529+
new Uint8List.view(_buffer.buffer, _buffer.offsetInBytes, _length));
15271530
}
15281531
// Clear references, for better GC.
15291532
_buffer = null;
@@ -1584,7 +1587,8 @@ class _HttpOutgoing implements StreamConsumer<List<int>> {
15841587
return;
15851588
}
15861589
if (chunk.length > _gzipBuffer.length - _gzipBufferLength) {
1587-
add(new Uint8List.view(_gzipBuffer.buffer, 0, _gzipBufferLength));
1590+
add(new Uint8List.view(
1591+
_gzipBuffer.buffer, _gzipBuffer.offsetInBytes, _gzipBufferLength));
15881592
_gzipBuffer = new Uint8List(_OUTGOING_BUFFER_SIZE);
15891593
_gzipBufferLength = 0;
15901594
}
@@ -1602,15 +1606,15 @@ class _HttpOutgoing implements StreamConsumer<List<int>> {
16021606
if (_buffer != null) {
16031607
// If _buffer is not null, we have not written the header yet. Write
16041608
// it now.
1605-
add(new Uint8List.view(_buffer.buffer, 0, _length));
1609+
add(new Uint8List.view(_buffer.buffer, _buffer.offsetInBytes, _length));
16061610
_buffer = null;
16071611
_length = 0;
16081612
}
16091613
add(chunk);
16101614
return;
16111615
}
16121616
if (chunk.length > _buffer.length - _length) {
1613-
add(new Uint8List.view(_buffer.buffer, 0, _length));
1617+
add(new Uint8List.view(_buffer.buffer, _buffer.offsetInBytes, _length));
16141618
_buffer = new Uint8List(_OUTGOING_BUFFER_SIZE);
16151619
_length = 0;
16161620
}

sdk/lib/_http/websocket_impl.dart

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,8 @@ class _WebSocketProtocolTransformer extends StreamTransformerBase<List<int>,
219219
_unmask(index, payloadLength, buffer);
220220
}
221221
// Control frame and data frame share _payloads.
222-
_payload.add(new Uint8List.view(buffer.buffer, index, payloadLength));
222+
_payload.add(new Uint8List.view(
223+
buffer.buffer, buffer.offsetInBytes + index, payloadLength));
223224
index += payloadLength;
224225
if (_isControlFrame()) {
225226
if (_remainingPayloadBytes == 0) _controlFrameEnd();
@@ -261,8 +262,8 @@ class _WebSocketProtocolTransformer extends StreamTransformerBase<List<int>,
261262
mask = (mask << 8) | _maskingBytes[(_unmaskingIndex + i) & 3];
262263
}
263264
Int32x4 blockMask = new Int32x4(mask, mask, mask, mask);
264-
Int32x4List blockBuffer =
265-
new Int32x4List.view(buffer.buffer, index, blockCount);
265+
Int32x4List blockBuffer = new Int32x4List.view(
266+
buffer.buffer, buffer.offsetInBytes + index, blockCount);
266267
for (int i = 0; i < blockBuffer.length; i++) {
267268
blockBuffer[i] ^= blockMask;
268269
}
@@ -822,7 +823,7 @@ class _WebSocketOutgoingTransformer
822823
}
823824
Int32x4 blockMask = new Int32x4(mask, mask, mask, mask);
824825
Int32x4List blockBuffer =
825-
new Int32x4List.view(list.buffer, 0, blockCount);
826+
new Int32x4List.view(list.buffer, list.offsetInBytes, blockCount);
826827
for (int i = 0; i < blockBuffer.length; i++) {
827828
blockBuffer[i] ^= blockMask;
828829
}

sdk/lib/convert/base64.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -404,7 +404,8 @@ class _BufferCachingBase64Encoder extends _Base64Encoder {
404404
bufferCache = Uint8List(bufferLength);
405405
}
406406
// Return a view of the buffer, so it has the requested length.
407-
return Uint8List.view(bufferCache.buffer, 0, bufferLength);
407+
return Uint8List.view(
408+
bufferCache.buffer, bufferCache.offsetInBytes, bufferLength);
408409
}
409410
}
410411

sdk/lib/io/bytes_builder.dart

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -140,15 +140,16 @@ class _CopyingBytesBuilder implements BytesBuilder {
140140

141141
Uint8List takeBytes() {
142142
if (_length == 0) return _emptyList;
143-
var buffer = new Uint8List.view(_buffer.buffer, 0, _length);
143+
var buffer =
144+
new Uint8List.view(_buffer.buffer, _buffer.offsetInBytes, _length);
144145
clear();
145146
return buffer;
146147
}
147148

148149
Uint8List toBytes() {
149150
if (_length == 0) return _emptyList;
150151
return new Uint8List.fromList(
151-
new Uint8List.view(_buffer.buffer, 0, _length));
152+
new Uint8List.view(_buffer.buffer, _buffer.offsetInBytes, _length));
152153
}
153154

154155
int get length => _length;

sdk/lib/io/data_transformer.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -554,7 +554,8 @@ class _BufferSink extends ByteConversionSink {
554554
void addSlice(List<int> chunk, int start, int end, bool isLast) {
555555
if (chunk is Uint8List) {
556556
Uint8List list = chunk;
557-
builder.add(new Uint8List.view(list.buffer, start, end - start));
557+
builder.add(new Uint8List.view(
558+
list.buffer, list.offsetInBytes + start, end - start));
558559
} else {
559560
builder.add(chunk.sublist(start, end));
560561
}

sdk/lib/io/file_system_entity.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -664,7 +664,8 @@ abstract class FileSystemEntity {
664664
}
665665
Uint8List nonNullTerminated = l;
666666
if (l.last == 0) {
667-
nonNullTerminated = new Uint8List.view(l.buffer, 0, l.length - 1);
667+
nonNullTerminated =
668+
new Uint8List.view(l.buffer, l.offsetInBytes, l.length - 1);
668669
}
669670
return utf8.decode(nonNullTerminated, allowMalformed: true);
670671
}

sdk/lib/io/socket.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -451,7 +451,7 @@ class RawSocketOption {
451451
value = 0;
452452
}
453453
final Uint8List list = Uint8List(4);
454-
final buffer = ByteData.view(list.buffer);
454+
final buffer = ByteData.view(list.buffer, list.offsetInBytes);
455455
buffer.setInt32(0, value);
456456
return RawSocketOption(level, option, list);
457457
}

sdk_nnbd/lib/_http/http_impl.dart

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -89,15 +89,16 @@ class _CopyingBytesBuilder implements BytesBuilder {
8989

9090
Uint8List takeBytes() {
9191
if (_length == 0) return _emptyList;
92-
var buffer = new Uint8List.view(_buffer.buffer, 0, _length);
92+
var buffer =
93+
new Uint8List.view(_buffer.buffer, _buffer.offsetInBytes, _length);
9394
clear();
9495
return buffer;
9596
}
9697

9798
Uint8List toBytes() {
9899
if (_length == 0) return _emptyList;
99100
return new Uint8List.fromList(
100-
new Uint8List.view(_buffer.buffer, 0, _length));
101+
new Uint8List.view(_buffer.buffer, _buffer.offsetInBytes, _length));
101102
}
102103

103104
int get length => _length;
@@ -1276,7 +1277,8 @@ class _HttpGZipSink extends ByteConversionSink {
12761277

12771278
void addSlice(List<int> chunk, int start, int end, bool isLast) {
12781279
if (chunk is Uint8List) {
1279-
_consume(new Uint8List.view(chunk.buffer, start, end - start));
1280+
_consume(new Uint8List.view(
1281+
chunk.buffer, chunk.offsetInBytes + start, end - start));
12801282
} else {
12811283
_consume(chunk.sublist(start, end - start));
12821284
}
@@ -1512,8 +1514,8 @@ class _HttpOutgoing implements StreamConsumer<List<int>> {
15121514
if (_gzip) {
15131515
_gzipAdd = socket.add;
15141516
if (_gzipBufferLength > 0) {
1515-
_gzipSink.add(
1516-
new Uint8List.view(_gzipBuffer.buffer, 0, _gzipBufferLength));
1517+
_gzipSink.add(new Uint8List.view(_gzipBuffer.buffer,
1518+
_gzipBuffer.offsetInBytes, _gzipBufferLength));
15171519
}
15181520
_gzipBuffer = null;
15191521
_gzipSink.close();
@@ -1523,7 +1525,8 @@ class _HttpOutgoing implements StreamConsumer<List<int>> {
15231525
}
15241526
// Add any remaining data in the buffer.
15251527
if (_length > 0) {
1526-
socket.add(new Uint8List.view(_buffer.buffer, 0, _length));
1528+
socket.add(
1529+
new Uint8List.view(_buffer.buffer, _buffer.offsetInBytes, _length));
15271530
}
15281531
// Clear references, for better GC.
15291532
_buffer = null;
@@ -1584,7 +1587,8 @@ class _HttpOutgoing implements StreamConsumer<List<int>> {
15841587
return;
15851588
}
15861589
if (chunk.length > _gzipBuffer.length - _gzipBufferLength) {
1587-
add(new Uint8List.view(_gzipBuffer.buffer, 0, _gzipBufferLength));
1590+
add(new Uint8List.view(
1591+
_gzipBuffer.buffer, _gzipBuffer.offsetInBytes, _gzipBufferLength));
15881592
_gzipBuffer = new Uint8List(_OUTGOING_BUFFER_SIZE);
15891593
_gzipBufferLength = 0;
15901594
}
@@ -1602,15 +1606,15 @@ class _HttpOutgoing implements StreamConsumer<List<int>> {
16021606
if (_buffer != null) {
16031607
// If _buffer is not null, we have not written the header yet. Write
16041608
// it now.
1605-
add(new Uint8List.view(_buffer.buffer, 0, _length));
1609+
add(new Uint8List.view(_buffer.buffer, _buffer.offsetInBytes, _length));
16061610
_buffer = null;
16071611
_length = 0;
16081612
}
16091613
add(chunk);
16101614
return;
16111615
}
16121616
if (chunk.length > _buffer.length - _length) {
1613-
add(new Uint8List.view(_buffer.buffer, 0, _length));
1617+
add(new Uint8List.view(_buffer.buffer, _buffer.offsetInBytes, _length));
16141618
_buffer = new Uint8List(_OUTGOING_BUFFER_SIZE);
16151619
_length = 0;
16161620
}

sdk_nnbd/lib/_http/websocket_impl.dart

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,8 @@ class _WebSocketProtocolTransformer extends StreamTransformerBase<List<int>,
219219
_unmask(index, payloadLength, buffer);
220220
}
221221
// Control frame and data frame share _payloads.
222-
_payload.add(new Uint8List.view(buffer.buffer, index, payloadLength));
222+
_payload.add(new Uint8List.view(
223+
buffer.buffer, buffer.offsetInBytes + index, payloadLength));
223224
index += payloadLength;
224225
if (_isControlFrame()) {
225226
if (_remainingPayloadBytes == 0) _controlFrameEnd();
@@ -261,8 +262,8 @@ class _WebSocketProtocolTransformer extends StreamTransformerBase<List<int>,
261262
mask = (mask << 8) | _maskingBytes[(_unmaskingIndex + i) & 3];
262263
}
263264
Int32x4 blockMask = new Int32x4(mask, mask, mask, mask);
264-
Int32x4List blockBuffer =
265-
new Int32x4List.view(buffer.buffer, index, blockCount);
265+
Int32x4List blockBuffer = new Int32x4List.view(
266+
buffer.buffer, buffer.offsetInBytes + index, blockCount);
266267
for (int i = 0; i < blockBuffer.length; i++) {
267268
blockBuffer[i] ^= blockMask;
268269
}
@@ -822,7 +823,7 @@ class _WebSocketOutgoingTransformer
822823
}
823824
Int32x4 blockMask = new Int32x4(mask, mask, mask, mask);
824825
Int32x4List blockBuffer =
825-
new Int32x4List.view(list.buffer, 0, blockCount);
826+
new Int32x4List.view(list.buffer, list.offsetInBytes, blockCount);
826827
for (int i = 0; i < blockBuffer.length; i++) {
827828
blockBuffer[i] ^= blockMask;
828829
}

sdk_nnbd/lib/convert/base64.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -411,7 +411,7 @@ class _BufferCachingBase64Encoder extends _Base64Encoder {
411411
throw "unreachable";
412412
}
413413
// Return a view of the buffer, so it has the requested length.
414-
return Uint8List.view(buffer.buffer, 0, bufferLength);
414+
return Uint8List.view(buffer.buffer, buffer.offsetInBytes, bufferLength);
415415
}
416416
}
417417

0 commit comments

Comments
 (0)