Commit ddad5ad53ec8b9a0555beee84c92e1ec4cc1766f

Authored by m-holger
1 parent 0dee3970

In QPDF::pipeStreamData use unique_ptr as heap

include/qpdf/QPDF.hh
@@ -1133,7 +1133,7 @@ class QPDF @@ -1133,7 +1133,7 @@ class QPDF
1133 Pipeline*& pipeline, 1133 Pipeline*& pipeline,
1134 QPDFObjGen const& og, 1134 QPDFObjGen const& og,
1135 QPDFObjectHandle& stream_dict, 1135 QPDFObjectHandle& stream_dict,
1136 - std::vector<std::shared_ptr<Pipeline>>& heap); 1136 + std::unique_ptr<Pipeline>& heap);
1137 1137
1138 // Methods to support object copying 1138 // Methods to support object copying
1139 void reserveObjects(QPDFObjectHandle foreign, ObjCopier& obj_copier, bool top); 1139 void reserveObjects(QPDFObjectHandle foreign, ObjCopier& obj_copier, bool top);
libqpdf/QPDF.cc
@@ -2413,7 +2413,7 @@ QPDF::pipeStreamData( @@ -2413,7 +2413,7 @@ QPDF::pipeStreamData(
2413 bool suppress_warnings, 2413 bool suppress_warnings,
2414 bool will_retry) 2414 bool will_retry)
2415 { 2415 {
2416 - std::vector<std::shared_ptr<Pipeline>> to_delete; 2416 + std::unique_ptr<Pipeline> to_delete;
2417 if (encp->encrypted) { 2417 if (encp->encrypted) {
2418 decryptStream(encp, file, qpdf_for_warning, pipeline, og, stream_dict, to_delete); 2418 decryptStream(encp, file, qpdf_for_warning, pipeline, og, stream_dict, to_delete);
2419 } 2419 }
libqpdf/QPDF_encryption.cc
@@ -1038,6 +1038,9 @@ QPDF::decryptString(std::string&amp; str, QPDFObjGen const&amp; og) @@ -1038,6 +1038,9 @@ QPDF::decryptString(std::string&amp; str, QPDFObjGen const&amp; og)
1038 } 1038 }
1039 } 1039 }
1040 1040
  1041 +// Prepend a decryption pipeline to 'pipeline'. The decryption pipeline (returned as
  1042 +// 'decrypt_pipeline' must be owned by the caller to ensure that it stays alive while the pipeline
  1043 +// is in use.
1041 void 1044 void
1042 QPDF::decryptStream( 1045 QPDF::decryptStream(
1043 std::shared_ptr<EncryptionParameters> encp, 1046 std::shared_ptr<EncryptionParameters> encp,
@@ -1046,7 +1049,7 @@ QPDF::decryptStream( @@ -1046,7 +1049,7 @@ QPDF::decryptStream(
1046 Pipeline*& pipeline, 1049 Pipeline*& pipeline,
1047 QPDFObjGen const& og, 1050 QPDFObjGen const& og,
1048 QPDFObjectHandle& stream_dict, 1051 QPDFObjectHandle& stream_dict,
1049 - std::vector<std::shared_ptr<Pipeline>>& heap) 1052 + std::unique_ptr<Pipeline>& decrypt_pipeline)
1050 { 1053 {
1051 std::string type; 1054 std::string type;
1052 if (stream_dict.getKey("/Type").isName()) { 1055 if (stream_dict.getKey("/Type").isName()) {
@@ -1082,8 +1085,7 @@ QPDF::decryptStream( @@ -1082,8 +1085,7 @@ QPDF::decryptStream(
1082 crypt_params.getKey("/Name").isName()) { 1085 crypt_params.getKey("/Name").isName()) {
1083 QTC::TC("qpdf", "QPDF_encrypt crypt array"); 1086 QTC::TC("qpdf", "QPDF_encrypt crypt array");
1084 method = interpretCF(encp, crypt_params.getKey("/Name")); 1087 method = interpretCF(encp, crypt_params.getKey("/Name"));
1085 - method_source = "stream's Crypt "  
1086 - "decode parameters (array)"; 1088 + method_source = "stream's Crypt decode parameters (array)";
1087 } 1089 }
1088 } 1090 }
1089 } 1091 }
@@ -1132,10 +1134,9 @@ QPDF::decryptStream( @@ -1132,10 +1134,9 @@ QPDF::decryptStream(
1132 } 1134 }
1133 } 1135 }
1134 std::string key = getKeyForObject(encp, og, use_aes); 1136 std::string key = getKeyForObject(encp, og, use_aes);
1135 - std::shared_ptr<Pipeline> new_pipeline;  
1136 if (use_aes) { 1137 if (use_aes) {
1137 QTC::TC("qpdf", "QPDF_encryption aes decode stream"); 1138 QTC::TC("qpdf", "QPDF_encryption aes decode stream");
1138 - new_pipeline = std::make_shared<Pl_AES_PDF>( 1139 + decrypt_pipeline = std::make_unique<Pl_AES_PDF>(
1139 "AES stream decryption", 1140 "AES stream decryption",
1140 pipeline, 1141 pipeline,
1141 false, 1142 false,
@@ -1143,14 +1144,13 @@ QPDF::decryptStream( @@ -1143,14 +1144,13 @@ QPDF::decryptStream(
1143 key.length()); 1144 key.length());
1144 } else { 1145 } else {
1145 QTC::TC("qpdf", "QPDF_encryption rc4 decode stream"); 1146 QTC::TC("qpdf", "QPDF_encryption rc4 decode stream");
1146 - new_pipeline = std::make_shared<Pl_RC4>( 1147 + decrypt_pipeline = std::make_unique<Pl_RC4>(
1147 "RC4 stream decryption", 1148 "RC4 stream decryption",
1148 pipeline, 1149 pipeline,
1149 QUtil::unsigned_char_pointer(key), 1150 QUtil::unsigned_char_pointer(key),
1150 toI(key.length())); 1151 toI(key.length()));
1151 } 1152 }
1152 - pipeline = new_pipeline.get();  
1153 - heap.push_back(new_pipeline); 1153 + pipeline = decrypt_pipeline.get();
1154 } 1154 }
1155 1155
1156 void 1156 void