Bug #711
exiv2 0.20 is corrupting ORF files from E-PL1
100%
Description
Using exiv2 0.20 from debian sid (0.20-2 amd64), I tried to change the Exif.Image.Orientation tags on a raw file from my E-PL1 camera. exiv2 reports no errors, and the file on disk is changing, but the target tags don't seem to change. I dumped the complete exif data before and after, and it seems to be changing data further down in the Exif.OlympusIP table!
I then tried changing the Exif.Image.Model tag, and noticed that the length reported by the exif dump after the change matches the new ASCII string that I supplied, but the actual data of the tag does not change, and again there is corruption further down in the OlympusIP tags.
I am attaching before and after ORF files for the attempted Model tag change, and the diff in exif contents.
haunma@angwin:~/oly$ exiv2 -u -p a 1.orf > 1
haunma@angwin:~/oly$ cp 1.orf 2.orf
haunma@angwin:~/oly$ exiv2 -v -M"set Exif.Image.Model test" mo 2.orf
File 1/1: 2.orf
Set Exif.Image.Model "test" (Ascii)
haunma@angwin:~/oly$ exiv2 -u -p a 2.orf > 2
haunma@angwin:~/oly$ diff 1 2 > diffs
Files
Associated revisions
#711: Added FloatValue to deal with TIFF Float values. (Nice one! :)
Added DoubleValue to deal with TIFF Double values (see #711).
Added tests for TIFF Float and Double values added for #711.
History
Updated by Andreas Huggel over 11 years ago
Thanks for reporting this important issue. After quite a bit of head-scratching, I can finally explain the reported corruption now; it is a combination of two problems:
- The offset of IFD entry Exif.OlympusIp.0x1104 in 1.orf points to the beginning of the image, i.e., it claims its value data occupies the first 4608 bytes of the image. However that area contains relevant structures of the image - the TIFF header followed by IFD0 etc., incl. the value data of the Exif.Image.Model tag. In the process of changing that tag, the new value is set but immediately overwritten and thus reset when Exif.OlympusIp.0x1104 is updated. (Exiftool reports an error for this tag and ignores it.)
- Writing TIFF Float values is not properly supported as it turns out. This is a rather basic issue and I'm surprised it has not been reported earlier. The only explanation I have for this is that float values are rare - they can appear in TIFFs but are not part of the Exif standard, and the number of TIFF-like images that are modified compared to JPEGs (with standard Exif data) is small.
Unfortunately I don't see a quick way to fix the corrupted metadata with exiv2. It would require tweaking specific bytes in the file.
Updated by Mark Haun over 11 years ago
Hi Andreas,
Thanks for having a look. I had tried exiftool also, and was having some problems there too. This thread is relevant:
http://u88.n24.queensu.ca/exiftool/forum/index.php?topic=2730.0
Apparently if you tell exiftool to ignore the bad offset it does ok (see the other thread for the details).
I'm a bit confused about the float value issue; neither Orientation nor Model are floats.
Updated by Andreas Huggel over 11 years ago
http://u88.n24.queensu.ca/exiftool/forum/index.php?topic=2730.0
Thanks for the link. Exiv2 makes this change ("non-intrusively") without modifying any offset, thus there are no such differences when you compare the Exiv2 modified image with the original. It only re-writes the TIFF structure if any tags were deleted, added or increased in size.
I'm a bit confused about the float value issue; neither Orientation nor Model are floats.
That issue causes the differences (see attached diff) in the values of Exif.OlympusIp.0x0800 and Exif.OlympusIp.0x150a (both float values).
Updated by Andreas Huggel over 11 years ago
- Status changed from New to Resolved
- Target version set to 0.21
- % Done changed from 0 to 100
Fixed with r2296 and r2297. Appreciate if you also test and confirm if it works for you. This is what I get here now:
$ ls -la 1.orf -rw------- 1 andreas andreas 11523320 22-Jul-10 1.orf $ ./exiv2 -u -pa 1.orf > tt1 Error: Offset of directory OlympusIp, entry 0x1104 is out of bounds: Offset = 0xfffff440; truncating the entry $ ./exiv2 -v -M"set Exif.Image.Model test" 1.orf File 1/1: 1.orf Error: Offset of directory OlympusIp, entry 0x1104 is out of bounds: Offset = 0xfffff440; truncating the entry Set Exif.Image.Model "test" (Ascii) Error: Offset of directory OlympusIp, entry 0x1104 is out of bounds: Offset = 0xfffff440; truncating the entry $ ./exiv2 -u -pa 1.orf > tt2 $ ls -la 1.orf -rw------- 1 andreas andreas 11523320 22-Jul-10 1.orf $ diff tt1 tt2 8c8 < Exif.Image.Model Ascii 17 E-PL1 --- > Exif.Image.Model Ascii 5 test 34c34 < Exif.Photo.MakerNote Undefined 1446464 (Binary value suppressed) --- > Exif.Photo.MakerNote Undefined 1161636 (Binary value suppressed)
#711: Quickfix for Exif.OlympusIp.0x1104 which points to the beginning of the image. With this change the value is truncated now, i.e., it's size is set to 0.