diff options
| author | Max Graey <maxgraey@gmail.com> | 2019-01-22 05:56:35 +0200 |
|---|---|---|
| committer | Ryan Dahl <ry@tinyclouds.org> | 2019-01-21 21:56:35 -0600 |
| commit | 41829f3e2bd0b1c3af8b508dfafb1b5a17fe59b6 (patch) | |
| tree | 1588c7027b85bf9e0f711376036f479d192549b2 | |
| parent | d710f9427af35363fb7f9b82d09eae5bd8342a63 (diff) | |
fix possible range issues for copyBytes in io/util (denoland/deno_std#146)
Original: https://github.com/denoland/deno_std/commit/2081f03a0748dac0cf0ab7e6e2d7e427841aca22
| -rw-r--r-- | io/util.ts | 1 | ||||
| -rw-r--r-- | io/util_test.ts | 36 | ||||
| -rwxr-xr-x | test.ts | 1 |
3 files changed, 38 insertions, 0 deletions
diff --git a/io/util.ts b/io/util.ts index 3266e5018..185732b36 100644 --- a/io/util.ts +++ b/io/util.ts @@ -4,6 +4,7 @@ import { Buffer, Reader } from "deno"; // from `src`. // Returns the number of bytes copied. export function copyBytes(dst: Uint8Array, src: Uint8Array, off = 0): number { + off = Math.max(0, Math.min(off, dst.byteLength)); const r = dst.byteLength - off; if (src.byteLength > r) { src = src.subarray(0, r); diff --git a/io/util_test.ts b/io/util_test.ts new file mode 100644 index 000000000..7318d887c --- /dev/null +++ b/io/util_test.ts @@ -0,0 +1,36 @@ +import { test, assert } from "../testing/mod.ts"; +import { copyBytes } from "./util.ts"; + +test(function testCopyBytes() { + let dst = new Uint8Array(4); + + dst.fill(0); + let src = Uint8Array.of(1, 2); + let len = copyBytes(dst, src, 0); + assert(len === 2); + assert.equal(dst, Uint8Array.of(1, 2, 0, 0)); + + dst.fill(0); + src = Uint8Array.of(1, 2); + len = copyBytes(dst, src, 1); + assert(len === 2); + assert.equal(dst, Uint8Array.of(0, 1, 2, 0)); + + dst.fill(0); + src = Uint8Array.of(1, 2, 3, 4, 5); + len = copyBytes(dst, src); + assert(len === 4); + assert.equal(dst, Uint8Array.of(1, 2, 3, 4)); + + dst.fill(0); + src = Uint8Array.of(1, 2); + len = copyBytes(dst, src, 100); + assert(len === 0); + assert.equal(dst, Uint8Array.of(0, 0, 0, 0)); + + dst.fill(0); + src = Uint8Array.of(3, 4); + len = copyBytes(dst, src, -2); + assert(len === 2); + assert.equal(dst, Uint8Array.of(3, 4, 0, 0)); +}); @@ -14,6 +14,7 @@ import "fs/path/resolve_test.ts"; import "fs/path/zero_length_strings_test.ts"; import "io/bufio_test.ts"; import "io/ioutil_test.ts"; +import "io/util_test.ts"; import "http/http_test.ts"; import "http/file_server_test.ts"; import "log/test.ts"; |
