1
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2024-11-23 15:16:54 -05:00

fix possible range issues for copyBytes in io/util (denoland/deno_std#146)

Original: 2081f03a07
This commit is contained in:
Max Graey 2019-01-22 05:56:35 +02:00 committed by Ryan Dahl
parent d710f9427a
commit 41829f3e2b
3 changed files with 38 additions and 0 deletions

View file

@ -4,6 +4,7 @@ import { Buffer, Reader } from "deno";
// from `src`. // from `src`.
// Returns the number of bytes copied. // Returns the number of bytes copied.
export function copyBytes(dst: Uint8Array, src: Uint8Array, off = 0): number { export function copyBytes(dst: Uint8Array, src: Uint8Array, off = 0): number {
off = Math.max(0, Math.min(off, dst.byteLength));
const r = dst.byteLength - off; const r = dst.byteLength - off;
if (src.byteLength > r) { if (src.byteLength > r) {
src = src.subarray(0, r); src = src.subarray(0, r);

36
io/util_test.ts Normal file
View file

@ -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));
});

View file

@ -14,6 +14,7 @@ import "fs/path/resolve_test.ts";
import "fs/path/zero_length_strings_test.ts"; import "fs/path/zero_length_strings_test.ts";
import "io/bufio_test.ts"; import "io/bufio_test.ts";
import "io/ioutil_test.ts"; import "io/ioutil_test.ts";
import "io/util_test.ts";
import "http/http_test.ts"; import "http/http_test.ts";
import "http/file_server_test.ts"; import "http/file_server_test.ts";
import "log/test.ts"; import "log/test.ts";