From 3db4d3193882bcd22e66cfcf3b2286b8855ca1e8 Mon Sep 17 00:00:00 2001 From: vog Date: Tue, 12 Jul 2011 23:52:21 +0000 Subject: [PATCH] Handle trailing garbage after XMP metadata in EPS files more gracefully --- src/epsimage.cpp | 7 +- ...t_minimal_xmp-garbage-before-endmarker.eps | 47 +++++++++++++ ...al_xmp-garbage-before-endmarker.eps.newxmp | 70 +++++++++++++++++++ ...t_minimal_xmp-garbage-before-endmarker.xmp | 8 +++ test/data/eps/eps-test.out | 22 ++++++ 5 files changed, 151 insertions(+), 3 deletions(-) create mode 100644 test/data/eps/eps-flat_minimal_xmp-garbage-before-endmarker.eps create mode 100644 test/data/eps/eps-flat_minimal_xmp-garbage-before-endmarker.eps.newxmp create mode 100644 test/data/eps/eps-flat_minimal_xmp-garbage-before-endmarker.xmp diff --git a/src/epsimage.cpp b/src/epsimage.cpp index fc7a0041..55eada9f 100644 --- a/src/epsimage.cpp +++ b/src/epsimage.cpp @@ -644,10 +644,11 @@ namespace { #ifndef SUPPRESS_WARNINGS EXV_WARNING << "Unexpected " << line.size() << " bytes of data after XMP at position: " << (xmpPos + xmpSize) << "\n"; #endif - if (write) throw Error(21); + flexibleEmbedding = false; + } else { + readLine(line, data, posLineAfterXmp, posEndEps); + flexibleEmbedding = (line == "% &&end XMP packet marker&&" || line == "% &&end XMP packet marker&&"); } - readLine(line, data, posLineAfterXmp, posEndEps); - flexibleEmbedding = (line == "% &&end XMP packet marker&&" || line == "% &&end XMP packet marker&&"); if (flexibleEmbedding) { #ifdef DEBUG EXV_DEBUG << "readWriteEpsMetadata: XMP embedding is flexible\n"; diff --git a/test/data/eps/eps-flat_minimal_xmp-garbage-before-endmarker.eps b/test/data/eps/eps-flat_minimal_xmp-garbage-before-endmarker.eps new file mode 100644 index 00000000..5747f3ab --- /dev/null +++ b/test/data/eps/eps-flat_minimal_xmp-garbage-before-endmarker.eps @@ -0,0 +1,47 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%BoundingBox: 5 5 105 105 +%%LanguageLevel: 2 +%ADO_ContainsXMP: MainFirst +%%Pages: 1 +%Exiv2Version: 0.21.1 +%Exiv2Website: http://www.exiv2.org/ +%%EndComments +%%Page: 1 1 +%%EndPageComments +%%BeginPageSetup +%Exiv2BeginXMP: Before %%EndPageSetup +/currentdistillerparams where +{pop currentdistillerparams /CoreDistVersion get 5000 lt} {true} ifelse +{userdict /Exiv2_pdfmark /cleartomark load put + userdict /Exiv2_metafile_pdfmark {flushfile cleartomark} bind put} +{userdict /Exiv2_pdfmark /pdfmark load put + userdict /Exiv2_metafile_pdfmark {/PUT pdfmark} bind put} ifelse +[/NamespacePush Exiv2_pdfmark +[/_objdef {Exiv2_metadata_stream} /type /stream /OBJ Exiv2_pdfmark +[{Exiv2_metadata_stream} 2 dict begin + /Type /Metadata def /Subtype /XML def currentdict end /PUT Exiv2_pdfmark +[{Exiv2_metadata_stream} + currentfile 0 (% &&end XMP packet marker&&) + /SubFileDecode filter Exiv2_metafile_pdfmark + + + + + + + % some garbage between XMP and end marker +% &&end XMP packet marker&& +[/Document 1 dict begin + /Metadata {Exiv2_metadata_stream} def currentdict end /BDC Exiv2_pdfmark +%Exiv2EndXMP +%%EndPageSetup +10 setlinewidth +10 10 moveto +0 90 rlineto 90 0 rlineto 0 -90 rlineto closepath +stroke +%%PageTrailer +%Exiv2BeginXMP: After %%PageTrailer +[/EMC Exiv2_pdfmark +[/NamespacePop Exiv2_pdfmark +%Exiv2EndXMP +%%EOF diff --git a/test/data/eps/eps-flat_minimal_xmp-garbage-before-endmarker.eps.newxmp b/test/data/eps/eps-flat_minimal_xmp-garbage-before-endmarker.eps.newxmp new file mode 100644 index 00000000..f9f1be07 --- /dev/null +++ b/test/data/eps/eps-flat_minimal_xmp-garbage-before-endmarker.eps.newxmp @@ -0,0 +1,70 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%BoundingBox: 5 5 105 105 +%%LanguageLevel: 2 +%ADO_ContainsXMP: MainFirst +%%Pages: 1 +%Exiv2Version: _Exiv2Version_ +%Exiv2Website: http://www.exiv2.org/ +%%EndComments +%%Page: 1 1 +%%EndPageComments +%%BeginPageSetup +%Exiv2BeginXMP: Before %%EndPageSetup +/currentdistillerparams where +{pop currentdistillerparams /CoreDistVersion get 5000 lt} {true} ifelse +{userdict /Exiv2_pdfmark /cleartomark load put + userdict /Exiv2_metafile_pdfmark {flushfile cleartomark} bind put} +{userdict /Exiv2_pdfmark /pdfmark load put + userdict /Exiv2_metafile_pdfmark {/PUT pdfmark} bind put} ifelse +[/NamespacePush Exiv2_pdfmark +[/_objdef {Exiv2_metadata_stream} /type /stream /OBJ Exiv2_pdfmark +[{Exiv2_metadata_stream} 2 dict begin + /Type /Metadata def /Subtype /XML def currentdict end /PUT Exiv2_pdfmark +[{Exiv2_metadata_stream} + currentfile 0 (% &&end XMP packet marker&&) + /SubFileDecode filter Exiv2_metafile_pdfmark + + + + + + + + + + + + + + + + + + + + + + + + + + + + +% &&end XMP packet marker&& +[/Document 1 dict begin + /Metadata {Exiv2_metadata_stream} def currentdict end /BDC Exiv2_pdfmark +%Exiv2EndXMP +%%EndPageSetup +10 setlinewidth +10 10 moveto +0 90 rlineto 90 0 rlineto 0 -90 rlineto closepath +stroke +%%PageTrailer +%Exiv2BeginXMP: After %%PageTrailer +[/EMC Exiv2_pdfmark +[/NamespacePop Exiv2_pdfmark +%Exiv2EndXMP +%%EOF diff --git a/test/data/eps/eps-flat_minimal_xmp-garbage-before-endmarker.xmp b/test/data/eps/eps-flat_minimal_xmp-garbage-before-endmarker.xmp new file mode 100644 index 00000000..77e69ed2 --- /dev/null +++ b/test/data/eps/eps-flat_minimal_xmp-garbage-before-endmarker.xmp @@ -0,0 +1,8 @@ + + + + + + diff --git a/test/data/eps/eps-test.out b/test/data/eps/eps-test.out index cb184146..1f372922 100644 --- a/test/data/eps/eps-test.out +++ b/test/data/eps/eps-test.out @@ -358,6 +358,28 @@ Warning: Unable to find XMP embedding trailer ending at position: 1424 eps-flat_minimal_missing-xmp-embedding-trailer.eps: Could not write metadata to file: Failed to write image Exit code: 1 +-----> eps-flat_minimal_xmp-garbage-before-endmarker.eps <----- + +Command: exiv2 -u -pa eps-flat_minimal_xmp-garbage-before-endmarker.eps +Warning: Unexpected 42 bytes of data after XMP at position: 1250 +Xmp.test.test XmpText 4 TEST +Exit code: 253 + +Command: exiv2 -f -eX eps-flat_minimal_xmp-garbage-before-endmarker.eps +Warning: Unexpected 42 bytes of data after XMP at position: 1250 +Exit code: 0 + +Command: exiv2 -ix eps-flat_minimal_xmp-garbage-before-endmarker.eps +Warning: Unexpected 42 bytes of data after XMP at position: 1250 +Warning: Unexpected 42 bytes of data after XMP at position: 1250 +Exit code: 0 + +Command: (2) exiv2 -ix eps-flat_minimal_xmp-garbage-before-endmarker.eps +Exit code: 0 + +Command: exiv2 -f -ex eps-flat_minimal_xmp-garbage-before-endmarker.eps +Exit code: 0 + -----> eps-flat_minimal_xmp-readonly.eps <----- Command: exiv2 -u -pa eps-flat_minimal_xmp-readonly.eps