diff --git a/src/Buffer.test.ts b/src/Buffer.test.ts index 32492ee0..0dcdd02d 100644 --- a/src/Buffer.test.ts +++ b/src/Buffer.test.ts @@ -3,7 +3,7 @@ * @license MIT */ -import { assert } from 'chai'; +import { assert, expect } from 'chai'; import { ITerminal } from './Types'; import { Buffer, DEFAULT_ATTR, CHAR_DATA_CHAR_INDEX } from './Buffer'; import { CircularList } from './common/CircularList'; @@ -514,4 +514,35 @@ describe('Buffer', () => { } }); }); + describe('BufferStringIterator', function(): void { + it('iterator does not ovrflow buffer limits', function(): void { + const terminal = new TestTerminal({rows: 5, cols: 10, scrollback: 5}); + const data = [ + 'aaaaaaaaaa', + 'aaaaaaaaa\n', + 'aaaaaaaaaa', + 'aaaaaaaaa\n', + 'aaaaaaaaaa', + 'aaaaaaaaaa', + 'aaaaaaaaaa', + 'aaaaaaaaa\n', + 'aaaaaaaaaa', + 'aaaaaaaaaa' + ]; + terminal.writeSync(data.join('')); + // brute force test with insane values + expect(() => { + for (let overscan = 0; overscan < 20; ++overscan) { + for (let start = -10; start < 20; ++start) { + for (let end = -10; end < 20; ++end) { + const it = terminal.buffer.iterator(false, start, end, overscan, overscan); + while (it.hasNext()) { + it.next(); + } + } + } + } + }).to.not.throw(); + }); + }); }); diff --git a/src/Buffer.ts b/src/Buffer.ts index 815dc84b..be5a47f1 100644 --- a/src/Buffer.ts +++ b/src/Buffer.ts @@ -424,6 +424,12 @@ export class BufferStringIterator implements IBufferStringIterator { private _startOverscan: number = 0, private _endOverscan: number = 0 ) { + if (this._startIndex < 0) { + this._startIndex = 0; + } + if (this._endIndex > this._buffer.lines.length) { + this._endIndex = this._buffer.lines.length; + } this._current = this._startIndex; } @@ -433,12 +439,16 @@ export class BufferStringIterator implements IBufferStringIterator { public next(): IBufferStringIteratorResult { const range = this._buffer.getWrappedRangeForLine(this._current); + // limit search window to overscan value at both borders if (range.first < this._startIndex - this._startOverscan) { range.first = this._startIndex - this._startOverscan; } if (range.last > this._endIndex + this._endOverscan) { range.last = this._endIndex + this._endOverscan; } + // limit to current buffer length + range.first = Math.max(range.first, 0); + range.last = Math.min(range.last, this._buffer.lines.length); let result = ''; for (let i = range.first; i <= range.last; ++i) { // TODO: always apply trimRight after fixing #1685 diff --git a/src/Linkifier.ts b/src/Linkifier.ts index 3be89f80..7d39d146 100644 --- a/src/Linkifier.ts +++ b/src/Linkifier.ts @@ -262,7 +262,6 @@ export class Linkifier extends EventEmitter implements ILinkifier { x2 = this._terminal.cols; y2--; } - console.log(x1, y1, x2, y2); this._mouseZoneManager.add(new MouseZone( x1 + 1,