summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMax Graey <maxgraey@gmail.com>2019-01-22 05:56:35 +0200
committerRyan Dahl <ry@tinyclouds.org>2019-01-21 21:56:35 -0600
commit41829f3e2bd0b1c3af8b508dfafb1b5a17fe59b6 (patch)
tree1588c7027b85bf9e0f711376036f479d192549b2
parentd710f9427af35363fb7f9b82d09eae5bd8342a63 (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.ts1
-rw-r--r--io/util_test.ts36
-rwxr-xr-xtest.ts1
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));
+});
diff --git a/test.ts b/test.ts
index 33a6f8d9b..b9fcd74e0 100755
--- a/test.ts
+++ b/test.ts
@@ -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";