Merge pull request #15917 from Snuffleupagus/pr-15908-followup

Improve input validation in `PDFDataTransportStream._onReceiveData` (PR 15908 follow-up)
This commit is contained in:
Jonas Jenwald 2023-01-12 15:32:59 +01:00 committed by GitHub
commit 1d683708e8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 32 additions and 4 deletions

View File

@ -665,7 +665,7 @@ class PDFDocumentLoadingTask {
class PDFDataRangeTransport { class PDFDataRangeTransport {
/** /**
* @param {number} length * @param {number} length
* @param {Uint8Array} initialData * @param {Uint8Array|null} initialData
* @param {boolean} [progressiveDone] * @param {boolean} [progressiveDone]
* @param {string} [contentDispositionFilename] * @param {string} [contentDispositionFilename]
*/ */
@ -687,28 +687,48 @@ class PDFDataRangeTransport {
this._readyCapability = createPromiseCapability(); this._readyCapability = createPromiseCapability();
} }
/**
* @param {function} listener
*/
addRangeListener(listener) { addRangeListener(listener) {
this._rangeListeners.push(listener); this._rangeListeners.push(listener);
} }
/**
* @param {function} listener
*/
addProgressListener(listener) { addProgressListener(listener) {
this._progressListeners.push(listener); this._progressListeners.push(listener);
} }
/**
* @param {function} listener
*/
addProgressiveReadListener(listener) { addProgressiveReadListener(listener) {
this._progressiveReadListeners.push(listener); this._progressiveReadListeners.push(listener);
} }
/**
* @param {function} listener
*/
addProgressiveDoneListener(listener) { addProgressiveDoneListener(listener) {
this._progressiveDoneListeners.push(listener); this._progressiveDoneListeners.push(listener);
} }
/**
* @param {number} begin
* @param {Uint8Array|null} chunk
*/
onDataRange(begin, chunk) { onDataRange(begin, chunk) {
for (const listener of this._rangeListeners) { for (const listener of this._rangeListeners) {
listener(begin, chunk); listener(begin, chunk);
} }
} }
/**
* @param {number} loaded
* @param {number|undefined} total
*/
onDataProgress(loaded, total) { onDataProgress(loaded, total) {
this._readyCapability.promise.then(() => { this._readyCapability.promise.then(() => {
for (const listener of this._progressListeners) { for (const listener of this._progressListeners) {
@ -717,6 +737,9 @@ class PDFDataRangeTransport {
}); });
} }
/**
* @param {Uint8Array|null} chunk
*/
onDataProgressiveRead(chunk) { onDataProgressiveRead(chunk) {
this._readyCapability.promise.then(() => { this._readyCapability.promise.then(() => {
for (const listener of this._progressiveReadListeners) { for (const listener of this._progressiveReadListeners) {
@ -737,6 +760,10 @@ class PDFDataRangeTransport {
this._readyCapability.resolve(); this._readyCapability.resolve();
} }
/**
* @param {number} begin
* @param {number} end
*/
requestDataRange(begin, end) { requestDataRange(begin, end) {
unreachable("Abstract method PDFDataRangeTransport.requestDataRange"); unreachable("Abstract method PDFDataRangeTransport.requestDataRange");
} }

View File

@ -77,9 +77,10 @@ class PDFDataTransportStream {
} }
_onReceiveData({ begin, chunk }) { _onReceiveData({ begin, chunk }) {
const buffer = this.#transferPdfData const buffer =
? chunk.buffer this.#transferPdfData && chunk?.length >= 0
: new Uint8Array(chunk).buffer; ? chunk.buffer
: new Uint8Array(chunk).buffer;
if (begin === undefined) { if (begin === undefined) {
if (this._fullRequestReader) { if (this._fullRequestReader) {