#7212 closed defect (fixed)
EXIF Tag Writing: Fails to write variable-length tags of integer/real type
Reported by: | molnar | Owned by: | warmerdam |
---|---|---|---|
Priority: | normal | Milestone: | |
Component: | GDAL_Raster | Version: | svn-trunk |
Severity: | normal | Keywords: | |
Cc: |
Description
The loop condition is probably not what you were going for; see here at line 1124 in gcore/gdalexif.cpp:
tag.nLength = (tagdescArray[i].length == 0) ? nTokens : tagdescArray[i].length; tag.pabyVal = reinterpret_cast<GByte*>( CPLCalloc(1, nDataTypeSize * tag.nLength)); GUInt32 nOffset = 0; for( GUInt32 j = 0; j < std::min(nTokens, tagdescArray[i].length); j++ )
Variable-length tags have tagdescArray[i].length
of 0
, which is properly accounted-for in the first block. However, we are later calling std::min()
with that same value, so it will always return 0
in that case.
Hence, we will never write any values for variable-length tags of this type.
The problem is the same for both the TIFF_SHORT
/TIFF_LONG
case and the TIFF_RATIONAL
/TIFF_SRATIONAL
case.
I believe the problem will be addressed if you replace the second argument to std::min()
with tag.nLength
, or some equivalent fix.
Change History (2)
comment:1 by , 6 years ago
Resolution: | → fixed |
---|---|
Status: | new → closed |
comment:2 by , 6 years ago
I've got to hand it to you: you sure are fast with these responses! Much appreciated.
In 41334: