mozilla/pdf.js — pull request #4011 by Rob--W (2013-12-07 22:26:47+00:00)
Title: Set eof to true at the end of a FlateStream

TL;DR: This commit fixes issue #3885 by setting `this.eof` to `true` whenever the check inside `readBlock` that is responsible for handling this is not run because the loop containing this check is not executed.

At the initialization of `Lexer_getObj` (in `parser.js`), there's a loop that skips whitespace and breaks out whenever EOF is encountered. (https://github.com/mozilla/pdf.js/blob/88ec2bd1a/src/core/parser.js#L586-L599)

Whenever the current character is not a whitespace character, `ch = this.nextChar();` is used to find the next character (using `return this.currentChar = this.stream.getByte())`).

The aforementioned `getByte` method retrieves the next byte using (https://github.com/mozilla/pdf.js/blob/88ec2bd1a/src/core/stream.js#L122-L128):

var pos = this.pos;
while (this.bufferLength <= pos) {
if (this.eof)
return -1;
this.readBlock();
}
return this.buffer[this.pos++];

This piece of code relies on this.eof to detect whether the last character has been read. When the stream is a `FlateStream`, and the end of the stream has been reached, then **`this.eof` is not set to `true`**, because this check is done inside a loop that does not occur when the read block size is zero (https://github.com/mozilla/pdf.js/blob/88ec2bd1ac/src/core/stream.js#L511-L517):

for (var n = bufferLength; n < end; ++n) {
if (typeof (b = bytes[bytesPos++]) == 'undefined') {
this.eof = true;
break;
}
buffer[n] = b;
}

This commit fixes the issue by setting `this.eof` to `true` whenever the loop is not going to run (i.e. when `bufferLength === end`, i.e. `blockLen === 0`).