From 56c43934e569ee3e5853206e9b8ee33427aa8c48 Mon Sep 17 00:00:00 2001 From: m-holger Date: Fri, 9 May 2025 11:57:02 +0100 Subject: [PATCH] Refactor stream filter handling for improved validation. --- libqpdf/QPDF_Stream.cc | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/libqpdf/QPDF_Stream.cc b/libqpdf/QPDF_Stream.cc index 4aa570b..f81fb62 100644 --- a/libqpdf/QPDF_Stream.cc +++ b/libqpdf/QPDF_Stream.cc @@ -352,15 +352,17 @@ Stream::filterable( auto filter_obj = s->stream_dict.getKey("/Filter"); - std::vector filter_names; - if (filter_obj.isNull()) { // No filters return true; } if (filter_obj.isName()) { // One filter - filter_names.emplace_back(filter_obj.getName()); + auto ff = s->filter_factory(filter_obj.getName()); + if (!ff) { + return false; + } + filters.emplace_back(ff()); } else if (filter_obj.isArray()) { // Potentially multiple filters int n = filter_obj.getArrayNItems(); @@ -370,21 +372,18 @@ Stream::filterable( warn("stream filter type is not name or array"); return false; } - filter_names.emplace_back(item.getName()); + auto ff = s->filter_factory(item.getName()); + if (!ff) { + filters.clear(); + return false; + } + filters.emplace_back(ff()); } } else { warn("stream filter type is not name or array"); return false; } - for (auto& filter_name: filter_names) { - if (auto ff = s->filter_factory(filter_name)) { - filters.emplace_back(ff()); - continue; - } - return false; - } - bool filterable = true; // filters now contains a list of filters to be applied in order. See which ones we can support. @@ -401,7 +400,7 @@ Stream::filterable( decode_parms.push_back(decode_obj.getArrayItem(i)); } } else { - for (unsigned int i = 0; i < filter_names.size(); ++i) { + for (unsigned int i = 0; i < filters.size(); ++i) { decode_parms.push_back(decode_obj); } } -- libgit2 0.21.4