-
Notifications
You must be signed in to change notification settings - Fork 6.8k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
serial: Check for detached buffers when writing
This change adds check in SerialPortUnderlyingSink::WriteData() to ensure that the V8BufferSource being written to the Mojo data pipe has not been detached since it was passed to the WritableStream. Bug: 1267627 Change-Id: I63d48584eb0be1c1d87c27115900aa5c17931fcf Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3269348 Commit-Queue: Reilly Grant <reillyg@chromium.org> Auto-Submit: Reilly Grant <reillyg@chromium.org> Reviewed-by: Hongchan Choi <hongchan@chromium.org> Cr-Commit-Position: refs/heads/main@{#940631}
- Loading branch information
Showing
3 changed files
with
64 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
48 changes: 48 additions & 0 deletions
48
...d_party/blink/web_tests/external/wpt/serial/serialPort_writable_detachBuffer.https.any.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,48 @@ | ||
// META: script=/resources/test-only-api.js | ||
// META: script=/serial/resources/common.js | ||
// META: script=resources/automation.js | ||
|
||
function detachBuffer(buffer) { | ||
const channel = new MessageChannel(); | ||
channel.port1.postMessage('', [buffer]); | ||
} | ||
|
||
serial_test(async (t, fake) => { | ||
const {port, fakePort} = await getFakeSerialPort(fake); | ||
await port.open({baudRate: 9600, bufferSize: 64}); | ||
|
||
const writer = port.writable.getWriter(); | ||
const data = new Uint8Array(64); | ||
detachBuffer(data.buffer); | ||
|
||
// Writing a detached buffer is equivalent to writing an empty buffer so this | ||
// should trivially succeed. | ||
await writer.write(data); | ||
writer.releaseLock(); | ||
|
||
await port.close(); | ||
}, 'Writing a detached buffer is safe'); | ||
|
||
serial_test(async (t, fake) => { | ||
const {port, fakePort} = await getFakeSerialPort(fake); | ||
// Select a buffer size smaller than the amount of data transferred. | ||
await port.open({baudRate: 9600, bufferSize: 64}); | ||
|
||
// Start writing a buffer much larger than bufferSize above so that it can't | ||
// all be transfered in a single operation. | ||
const writer = port.writable.getWriter(); | ||
const data = new Uint8Array(1024); | ||
const promise = writer.write(data); | ||
writer.releaseLock(); | ||
|
||
// Read half of the written data and then detach the buffer. | ||
await fakePort.readable(); | ||
await fakePort.readWithLength(data.byteLength / 2); | ||
detachBuffer(data.buffer); | ||
|
||
// When the buffer is detached its length becomes zero and so the write should | ||
// succeed but it is undefined how much data was written before that happened. | ||
await promise; | ||
|
||
await port.close(); | ||
}, 'Detaching a buffer while writing is safe'); |