aboutsummaryrefslogtreecommitdiffstats
path: root/libqpdf/QPDFTokenizer.cc
diff options
context:
space:
mode:
authorJay Berkenbilt <ejb@ql.org>2019-08-19 03:26:19 +0200
committerJay Berkenbilt <ejb@ql.org>2019-08-20 01:48:27 +0200
commit42d396f1dd8d38294e45b14021cd72c13850a53b (patch)
treec4f0eed9ce9d048a7db7322050fd5b73d67a8d3c /libqpdf/QPDFTokenizer.cc
parentd9dd99eca32e44788165ce169f1e59498ad1c16e (diff)
downloadqpdf-42d396f1dd8d38294e45b14021cd72c13850a53b.tar.zst
Handle invalid name tokens symmetrically for PDF < 1.2 (fixes #332)
Diffstat (limited to 'libqpdf/QPDFTokenizer.cc')
-rw-r--r--libqpdf/QPDFTokenizer.cc35
1 files changed, 15 insertions, 20 deletions
diff --git a/libqpdf/QPDFTokenizer.cc b/libqpdf/QPDFTokenizer.cc
index 54c9825e..18af12e0 100644
--- a/libqpdf/QPDFTokenizer.cc
+++ b/libqpdf/QPDFTokenizer.cc
@@ -78,7 +78,6 @@ QPDFWordTokenFinder::check()
}
QPDFTokenizer::Members::Members() :
- pound_special_in_name(true),
allow_eof(false),
include_ignorable(false)
{
@@ -129,13 +128,6 @@ QPDFTokenizer::QPDFTokenizer() :
}
void
-QPDFTokenizer::allowPoundAnywhereInName()
-{
- QTC::TC("qpdf", "QPDFTokenizer allow pound anywhere in name");
- this->m->pound_special_in_name = false;
-}
-
-void
QPDFTokenizer::allowEOF()
{
this->m->allow_eof = true;
@@ -169,17 +161,19 @@ QPDFTokenizer::resolveLiteral()
// valid name, so don't strip leading /. That way we
// don't have to deal with the empty string as a name.
std::string nval = "/";
- char const* valstr = this->m->val.c_str() + 1;
- for (char const* p = valstr; *p; ++p)
+ size_t len = this->m->val.length();
+ for (size_t i = 1; i < len; ++i)
{
- if ((*p == '#') && this->m->pound_special_in_name)
+ char ch = this->m->val.at(i);
+ if (ch == '#')
{
- if (p[1] && p[2] &&
- QUtil::is_hex_digit(p[1]) && QUtil::is_hex_digit(p[2]))
+ if ((i + 2 < len) &&
+ QUtil::is_hex_digit(this->m->val.at(i+1)) &&
+ QUtil::is_hex_digit(this->m->val.at(i+2)))
{
char num[3];
- num[0] = p[1];
- num[1] = p[2];
+ num[0] = this->m->val.at(i+1);
+ num[1] = this->m->val.at(i+2);
num[2] = '\0';
char ch = static_cast<char>(strtol(num, 0, 16));
if (ch == '\0')
@@ -192,21 +186,22 @@ QPDFTokenizer::resolveLiteral()
}
else
{
- nval += ch;
+ nval.append(1, ch);
}
- p += 2;
+ i += 2;
}
else
{
QTC::TC("qpdf", "QPDFTokenizer bad name");
- this->m->type = tt_bad;
this->m->error_message = "invalid name token";
- nval += *p;
+ // Use null to encode a bad # -- this is reversed
+ // in QPDF_Name::normalizeName.
+ nval += '\0';
}
}
else
{
- nval += *p;
+ nval.append(1, ch);
}
}
this->m->val = nval;