From c427c2df427f477eb1214d8ff3fdfad36e191a6c Mon Sep 17 00:00:00 2001 From: binaryta Date: Mon, 10 Dec 2018 05:38:30 +0900 Subject: [PATCH] Add TooLarge error code for buffers (#1298) In collaboration with @yushimatenjin --- js/buffer.ts | 6 +++++- js/buffer_test.ts | 21 ++++++++++++++++++++- src/msg.fbs | 1 + 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/js/buffer.ts b/js/buffer.ts index 4e9cd6eb..9e06eecd 100644 --- a/js/buffer.ts +++ b/js/buffer.ts @@ -6,6 +6,7 @@ import { Reader, Writer, ReadResult } from "./io"; import { assert } from "./util"; import { TextDecoder } from "./text_encoding"; +import { DenoError, ErrorKind } from "./errors"; // MIN_READ is the minimum ArrayBuffer size passed to a read call by // buffer.ReadFrom. As long as the Buffer has at least MIN_READ bytes beyond @@ -170,7 +171,10 @@ export class Buffer implements Reader, Writer { // don't spend all our time copying. copyBytes(this.buf, this.buf.subarray(this.off)); } else if (c > MAX_SIZE - c - n) { - throw Error("ErrTooLarge"); // TODO DenoError(TooLarge) + throw new DenoError( + ErrorKind.TooLarge, + "The buffer cannot be grown beyond the maximum size." + ); } else { // Not enough space anywhere, we need to allocate. const buf = new Uint8Array(2 * c + n); diff --git a/js/buffer_test.ts b/js/buffer_test.ts index 58668de2..2683b386 100644 --- a/js/buffer_test.ts +++ b/js/buffer_test.ts @@ -1,9 +1,9 @@ import { Buffer, readAll } from "deno"; +import * as deno from "deno"; // This code has been ported almost directly from Go's src/bytes/buffer_test.go // Copyright 2009 The Go Authors. All rights reserved. BSD license. // https://github.com/golang/go/blob/master/LICENSE import { assert, assertEqual, test } from "./test_util.ts"; - // N controls how many iterations of certain checks are performed. const N = 100; let testBytes: Uint8Array | null; @@ -130,6 +130,25 @@ test(async function bufferLargeByteWrites() { check(buf, ""); }); +test(async function bufferTooLargeByteWrites() { + init(); + const tmp = new Uint8Array(72); + const growLen = Number.MAX_VALUE; + const xBytes = repeat("x", 0); + const buf = new Buffer(xBytes.buffer as ArrayBuffer); + const { nread, eof } = await buf.read(tmp); + + let err; + try { + buf.grow(growLen); + } catch (e) { + err = e; + } + + assertEqual(err.kind, deno.ErrorKind.TooLarge); + assertEqual(err.name, "TooLarge"); +}); + test(async function bufferLargeByteReads() { init(); const buf = new Buffer(); diff --git a/src/msg.fbs b/src/msg.fbs index d6bbc220..ecfb9e50 100644 --- a/src/msg.fbs +++ b/src/msg.fbs @@ -105,6 +105,7 @@ enum ErrorKind: byte { HttpCanceled, HttpParse, HttpOther, + TooLarge, } table Cwd {} -- GitLab