mirror of
https://github.com/qpdf/qpdf.git
synced 2024-12-22 10:58:58 +00:00
Inline image token value ends with EI, not delimiter
The inline image token erroneously included the delimiter that followed EI. The ObjectHandle created from it was correct.
This commit is contained in:
parent
c136356378
commit
31372edce0
@ -1,5 +1,9 @@
|
|||||||
2019-01-29 Jay Berkenbilt <ejb@ql.org>
|
2019-01-29 Jay Berkenbilt <ejb@ql.org>
|
||||||
|
|
||||||
|
* Bug fix: when returning an inline image token, the tokenizer no
|
||||||
|
longer includes the delimiter that follows EI. The
|
||||||
|
QPDFObjectHandle created from the token was correct.
|
||||||
|
|
||||||
* Handle files with direct page objects, which is not allowed by
|
* Handle files with direct page objects, which is not allowed by
|
||||||
the PDF spec but has been seen in the wild. Fixes #164.
|
the PDF spec but has been seen in the wild. Fixes #164.
|
||||||
|
|
||||||
|
@ -1571,9 +1571,9 @@ QPDFObjectHandle::parseContentStream_data(
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Skip back over EI
|
// Skip back over EI
|
||||||
input->seek(-3, SEEK_CUR);
|
input->seek(-2, SEEK_CUR);
|
||||||
std::string inline_image = t.getRawValue();
|
std::string inline_image = t.getRawValue();
|
||||||
for (int i = 0; i < 4; ++i)
|
for (int i = 0; i < 3; ++i)
|
||||||
{
|
{
|
||||||
if (inline_image.length() > 0)
|
if (inline_image.length() > 0)
|
||||||
{
|
{
|
||||||
|
@ -468,6 +468,7 @@ QPDFTokenizer::presentCharacter(char ch)
|
|||||||
}
|
}
|
||||||
else if (this->m->state == st_inline_image)
|
else if (this->m->state == st_inline_image)
|
||||||
{
|
{
|
||||||
|
this->m->val += ch;
|
||||||
size_t len = this->m->val.length();
|
size_t len = this->m->val.length();
|
||||||
if ((len >= 4) &&
|
if ((len >= 4) &&
|
||||||
isDelimiter(this->m->val.at(len-4)) &&
|
isDelimiter(this->m->val.at(len-4)) &&
|
||||||
@ -475,22 +476,18 @@ QPDFTokenizer::presentCharacter(char ch)
|
|||||||
(this->m->val.at(len-2) == 'I') &&
|
(this->m->val.at(len-2) == 'I') &&
|
||||||
isDelimiter(this->m->val.at(len-1)))
|
isDelimiter(this->m->val.at(len-1)))
|
||||||
{
|
{
|
||||||
|
this->m->val.erase(len - 1);
|
||||||
this->m->type = tt_inline_image;
|
this->m->type = tt_inline_image;
|
||||||
this->m->unread_char = true;
|
this->m->unread_char = true;
|
||||||
this->m->char_to_unread = ch;
|
this->m->char_to_unread = ch;
|
||||||
this->m->state = st_token_ready;
|
this->m->state = st_token_ready;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
this->m->val += ch;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
handled = false;
|
handled = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (handled)
|
if (handled)
|
||||||
{
|
{
|
||||||
// okay
|
// okay
|
||||||
|
@ -599,7 +599,8 @@ skipping to endstream
|
|||||||
103: dict_close: >>
|
103: dict_close: >>
|
||||||
105: space: \x0a
|
105: space: \x0a
|
||||||
106: word: ID
|
106: word: ID
|
||||||
108: inline-image: x\x9c\xc5\xd6I\x0e\xc3 \x0c\x05P|\xffC;U\xc8`\xc0\xd37\x91Z\xa9\x0b\xa6\x17\x02\xc4\x98\xda\xe6\x8f\x1b}D\xf0\xef_\xb4\xf8\x1c\xc9W\xa9\x84\x9c\xc4-\x94\x88>\xff\x87\xc0\x8d>\x94^\x01&\xae\xa1u\xe2]\x80"!\x87\x95\x08\x96\x05*\xac&\x8fE|Sy\xae \xf0d-\x80<\x9d\x19B\x010B\x05\xfa@N\x11\xea+<\x1fhl\xe8K\xd0\xee/56L\xa0\x89\x90\xe3\x19\x1e \xa3\x96\xb9\xa6>0\x06>\x15Y\x81\xf9!c\xec\\x0eY\x0c\xd8\x0f%Y\xf0\x01\xa5\xd68?&\xa0\xd6\xeb\x88}j\x92\xfb\xe8\x1d;\xab\x8d3\x9d\xc2\xd6l\x14p\xdbsH\xf6\xfbt\xfa\x01Q\x02\xd8Tt*h\xccU\xfa\xe3w\x07\xcd\xd5\xd0%\xa8)p\x96\xb3"\x95DiRj\xb9\x96D\x18YNU\x11\xd3\xd9Av\x92F\xe0&\x0d\x90\xcd\xd4u#c\x95\xc6W\x09\xf4\xdf\x89\x03W\x93O\x0d\x0aEI\x0a
|
108: inline-image: x\x9c\xc5\xd6I\x0e\xc3 \x0c\x05P|\xffC;U\xc8`\xc0\xd37\x91Z\xa9\x0b\xa6\x17\x02\xc4\x98\xda\xe6\x8f\x1b}D\xf0\xef_\xb4\xf8\x1c\xc9W\xa9\x84\x9c\xc4-\x94\x88>\xff\x87\xc0\x8d>\x94^\x01&\xae\xa1u\xe2]\x80"!\x87\x95\x08\x96\x05*\xac&\x8fE|Sy\xae \xf0d-\x80<\x9d\x19B\x010B\x05\xfa@N\x11\xea+<\x1fhl\xe8K\xd0\xee/56L\xa0\x89\x90\xe3\x19\x1e \xa3\x96\xb9\xa6>0\x06>\x15Y\x81\xf9!c\xec\\x0eY\x0c\xd8\x0f%Y\xf0\x01\xa5\xd68?&\xa0\xd6\xeb\x88}j\x92\xfb\xe8\x1d;\xab\x8d3\x9d\xc2\xd6l\x14p\xdbsH\xf6\xfbt\xfa\x01Q\x02\xd8Tt*h\xccU\xfa\xe3w\x07\xcd\xd5\xd0%\xa8)p\x96\xb3"\x95DiRj\xb9\x96D\x18YNU\x11\xd3\xd9Av\x92F\xe0&\x0d\x90\xcd\xd4u#c\x95\xc6W\x09\xf4\xdf\x89\x03W\x93O\x0d\x0aEI
|
||||||
|
354: space: \x0a
|
||||||
355: word: BT
|
355: word: BT
|
||||||
357: space: \x0a
|
357: space: \x0a
|
||||||
360: name: /F1
|
360: name: /F1
|
||||||
|
@ -291,7 +291,7 @@ skipping to endstream
|
|||||||
101: integer: 66
|
101: integer: 66
|
||||||
103: dict_close: >>
|
103: dict_close: >>
|
||||||
106: word: ID
|
106: word: ID
|
||||||
108: inline-image: x\x9c\xc5\xd6I\x0e\xc3 \x0c\x05P|\xffC;U\xc8`\xc0\xd37\x91Z\xa9\x0b\xa6\x17\x02\xc4\x98\xda\xe6\x8f\x1b}D\xf0\xef_\xb4\xf8\x1c\xc9W\xa9\x84\x9c\xc4-\x94\x88>\xff\x87\xc0\x8d>\x94^\x01&\xae\xa1u\xe2]\x80"!\x87\x95\x08\x96\x05*\xac&\x8fE|Sy\xae \xf0d-\x80<\x9d\x19B\x010B\x05\xfa@N\x11\xea+<\x1fhl\xe8K\xd0\xee/56L\xa0\x89\x90\xe3\x19\x1e \xa3\x96\xb9\xa6>0\x06>\x15Y\x81\xf9!c\xec\\x0eY\x0c\xd8\x0f%Y\xf0\x01\xa5\xd68?&\xa0\xd6\xeb\x88}j\x92\xfb\xe8\x1d;\xab\x8d3\x9d\xc2\xd6l\x14p\xdbsH\xf6\xfbt\xfa\x01Q\x02\xd8Tt*h\xccU\xfa\xe3w\x07\xcd\xd5\xd0%\xa8)p\x96\xb3"\x95DiRj\xb9\x96D\x18YNU\x11\xd3\xd9Av\x92F\xe0&\x0d\x90\xcd\xd4u#c\x95\xc6W\x09\xf4\xdf\x89\x03W\x93O\x0d\x0aEI\x0a
|
108: inline-image: x\x9c\xc5\xd6I\x0e\xc3 \x0c\x05P|\xffC;U\xc8`\xc0\xd37\x91Z\xa9\x0b\xa6\x17\x02\xc4\x98\xda\xe6\x8f\x1b}D\xf0\xef_\xb4\xf8\x1c\xc9W\xa9\x84\x9c\xc4-\x94\x88>\xff\x87\xc0\x8d>\x94^\x01&\xae\xa1u\xe2]\x80"!\x87\x95\x08\x96\x05*\xac&\x8fE|Sy\xae \xf0d-\x80<\x9d\x19B\x010B\x05\xfa@N\x11\xea+<\x1fhl\xe8K\xd0\xee/56L\xa0\x89\x90\xe3\x19\x1e \xa3\x96\xb9\xa6>0\x06>\x15Y\x81\xf9!c\xec\\x0eY\x0c\xd8\x0f%Y\xf0\x01\xa5\xd68?&\xa0\xd6\xeb\x88}j\x92\xfb\xe8\x1d;\xab\x8d3\x9d\xc2\xd6l\x14p\xdbsH\xf6\xfbt\xfa\x01Q\x02\xd8Tt*h\xccU\xfa\xe3w\x07\xcd\xd5\xd0%\xa8)p\x96\xb3"\x95DiRj\xb9\x96D\x18YNU\x11\xd3\xd9Av\x92F\xe0&\x0d\x90\xcd\xd4u#c\x95\xc6W\x09\xf4\xdf\x89\x03W\x93O\x0d\x0aEI
|
||||||
355: word: BT
|
355: word: BT
|
||||||
360: name: /F1
|
360: name: /F1
|
||||||
364: integer: 24
|
364: integer: 24
|
||||||
|
@ -599,7 +599,8 @@ skipping to endstream
|
|||||||
103: dict_close: >>
|
103: dict_close: >>
|
||||||
105: space: \x0a
|
105: space: \x0a
|
||||||
106: word: ID
|
106: word: ID
|
||||||
108: inline-image: x\x9c\xc5\xd6I\x0e\xc3 \x0c\x05P|\xffC;U\xc8`\xc0\xd37\x91Z\xa9\x0b\xa6\x17\x02\xc4\x98\xda\xe6\x8f\x1b}D\xf0\xef_\xb4\xf8\x1c\xc9W\xa9\x84\x9c\xc4-\x94\x88>\xff\x87\xc0\x8d>\x94^\x01&\xae\xa1u\xe2]\x80"!\x87\x95\x08\x96\x05*\xac&\x8fE|Sy\xae \xf0d-\x80<\x9d\x19B\x010B\x05\xfa@N\x11\xea+<\x1fhl\xe8K\xd0\xee/56L\xa0\x89\x90\xe3\x19\x1e \xa3\x96\xb9\xa6>0\x06>\x15Y\x81\xf9!c\xec\\x0eY\x0c\xd8\x0f%Y\xf0\x01\xa5\xd68?&\xa0\xd6\xeb\x88}j\x92\xfb\xe8\x1d;\xab\x8d3\x9d\xc2\xd6l\x14p\xdbsH\xf6\xfbt\xfa\x01Q\x02\xd8Tt*h\xccU\xfa\xe3w\x07\xcd\xd5\xd0%\xa8)p\x96\xb3"\x95DiRj\xb9\x96D\x18YNU\x11\xd3\xd9Av\x92F\xe0&\x0d\x90\xcd\xd4u#c\x95\xc6W\x09\xf4\xdf\x89\x03W\x93O\x0d\x0aEI\x0a
|
108: inline-image: x\x9c\xc5\xd6I\x0e\xc3 \x0c\x05P|\xffC;U\xc8`\xc0\xd37\x91Z\xa9\x0b\xa6\x17\x02\xc4\x98\xda\xe6\x8f\x1b}D\xf0\xef_\xb4\xf8\x1c\xc9W\xa9\x84\x9c\xc4-\x94\x88>\xff\x87\xc0\x8d>\x94^\x01&\xae\xa1u\xe2]\x80"!\x87\x95\x08\x96\x05*\xac&\x8fE|Sy\xae \xf0d-\x80<\x9d\x19B\x010B\x05\xfa@N\x11\xea+<\x1fhl\xe8K\xd0\xee/56L\xa0\x89\x90\xe3\x19\x1e \xa3\x96\xb9\xa6>0\x06>\x15Y\x81\xf9!c\xec\\x0eY\x0c\xd8\x0f%Y\xf0\x01\xa5\xd68?&\xa0\xd6\xeb\x88}j\x92\xfb\xe8\x1d;\xab\x8d3\x9d\xc2\xd6l\x14p\xdbsH\xf6\xfbt\xfa\x01Q\x02\xd8Tt*h\xccU\xfa\xe3w\x07\xcd\xd5\xd0%\xa8)p\x96\xb3"\x95DiRj\xb9\x96D\x18YNU\x11\xd3\xd9Av\x92F\xe0&\x0d\x90\xcd\xd4u#c\x95\xc6W\x09\xf4\xdf\x89\x03W\x93O\x0d\x0aEI
|
||||||
|
354: space: \x0a
|
||||||
355: word: BT
|
355: word: BT
|
||||||
357: space: \x0a
|
357: space: \x0a
|
||||||
360: name: /F1
|
360: name: /F1
|
||||||
|
Loading…
Reference in New Issue
Block a user