mirror of
https://github.com/qpdf/qpdf.git
synced 2025-01-02 22:50:20 +00:00
Fix some pipelines to be safe if downstream write fails (fuzz issue 28262)
This commit is contained in:
parent
a9bdeeb0e0
commit
dc92574c10
@ -1,3 +1,9 @@
|
|||||||
|
2021-01-04 Jay Berkenbilt <ejb@ql.org>
|
||||||
|
|
||||||
|
* Move getNext()->write() calls in some pipelines to ensure that
|
||||||
|
state gates properly reset even if the next pipeline's write
|
||||||
|
throws an exception (fuzz issue 28262).
|
||||||
|
|
||||||
2021-01-03 Jay Berkenbilt <ejb@ql.org>
|
2021-01-03 Jay Berkenbilt <ejb@ql.org>
|
||||||
|
|
||||||
* Don't include -o nospace with zsh completion setup so file
|
* Don't include -o nospace with zsh completion setup so file
|
||||||
|
BIN
fuzz/qpdf_extra/28262.fuzz
Normal file
BIN
fuzz/qpdf_extra/28262.fuzz
Normal file
Binary file not shown.
@ -238,6 +238,6 @@ Pl_AES_PDF::flush(bool strip_padding)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
getNext()->write(this->outbuf, bytes);
|
|
||||||
this->offset = 0;
|
this->offset = 0;
|
||||||
|
getNext()->write(this->outbuf, bytes);
|
||||||
}
|
}
|
||||||
|
@ -119,10 +119,13 @@ Pl_ASCII85Decoder::flush()
|
|||||||
|
|
||||||
QTC::TC("libtests", "Pl_ASCII85Decoder partial flush",
|
QTC::TC("libtests", "Pl_ASCII85Decoder partial flush",
|
||||||
(this->pos == 5) ? 0 : 1);
|
(this->pos == 5) ? 0 : 1);
|
||||||
getNext()->write(outbuf, this->pos - 1);
|
// Reset before calling getNext()->write in case that throws an
|
||||||
|
// exception.
|
||||||
|
auto t = this->pos - 1;
|
||||||
this->pos = 0;
|
this->pos = 0;
|
||||||
memset(this->inbuf, 117, 5);
|
memset(this->inbuf, 117, 5);
|
||||||
|
|
||||||
|
getNext()->write(outbuf, t);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -97,12 +97,14 @@ Pl_ASCIIHexDecoder::flush()
|
|||||||
|
|
||||||
QTC::TC("libtests", "Pl_ASCIIHexDecoder partial flush",
|
QTC::TC("libtests", "Pl_ASCIIHexDecoder partial flush",
|
||||||
(this->pos == 2) ? 0 : 1);
|
(this->pos == 2) ? 0 : 1);
|
||||||
getNext()->write(&ch, 1);
|
// Reset before calling getNext()->write in case that throws an
|
||||||
|
// exception.
|
||||||
this->pos = 0;
|
this->pos = 0;
|
||||||
this->inbuf[0] = '0';
|
this->inbuf[0] = '0';
|
||||||
this->inbuf[1] = '0';
|
this->inbuf[1] = '0';
|
||||||
this->inbuf[2] = '\0';
|
this->inbuf[2] = '\0';
|
||||||
|
|
||||||
|
getNext()->write(&ch, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -27,8 +27,8 @@ Pl_Count::write(unsigned char* buf, size_t len)
|
|||||||
if (len)
|
if (len)
|
||||||
{
|
{
|
||||||
this->m->count += QIntC::to_offset(len);
|
this->m->count += QIntC::to_offset(len);
|
||||||
getNext()->write(buf, len);
|
|
||||||
this->m->last_char = buf[len - 1];
|
this->m->last_char = buf[len - 1];
|
||||||
|
getNext()->write(buf, len);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user