Skip to content

Commit c8c42b1

Browse files
Check for null when calling TiffParser.checkHeader()
Fixes ome#4232.
1 parent 4fe6b0d commit c8c42b1

7 files changed

Lines changed: 31 additions & 4 deletions

File tree

components/formats-bsd/src/loci/formats/out/PyramidOMETiffWriter.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,12 @@ public void close() throws IOException {
126126
long[] allOffsets = null;
127127
try (RandomAccessInputStream in = new RandomAccessInputStream(id)) {
128128
TiffParser parser = new TiffParser(in);
129-
littleEndian = parser.checkHeader();
129+
Boolean writtenLittleEndian = parser.checkHeader();
130+
if (writtenLittleEndian == null) {
131+
// this would be extremely unexpected
132+
throw new IOException("Endian check failed on written data");
133+
}
134+
littleEndian = writtenLittleEndian;
130135
allOffsets = parser.getIFDOffsets();
131136
}
132137

components/formats-bsd/src/loci/formats/tiff/TiffParser.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,10 @@ public TiffParser(RandomAccessInputStream in) {
114114
doCaching = true;
115115
try {
116116
long fp = in.getFilePointer();
117-
checkHeader();
117+
Boolean littleEndian = checkHeader();
118+
if (littleEndian == null) {
119+
LOGGER.error("Endian check failed, this may be an invalid file");
120+
}
118121
in.seek(fp);
119122
}
120123
catch (IOException e) { }

components/formats-bsd/test/loci/formats/utests/tiff/TiffParserTest.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ public void setUp(String mockClassName) throws Exception {
7373
@Test
7474
public void testHeader() throws IOException {
7575
assertTrue(tiffParser.isValidHeader());
76+
// isValidHeader above makes sure that checkHeader is non-null
7677
assertTrue(tiffParser.checkHeader());
7778
assertFalse(tiffParser.isBigTiff());
7879
}
@@ -178,6 +179,8 @@ public void testGetResolutionUnit() throws IOException, FormatException {
178179
public void testNonUniformRowsPerStrip() throws IOException, FormatException {
179180
mock = new NonUniformRowsPerStripMock();
180181
tiffParser = mock.getTiffParser();
182+
assertTrue(tiffParser.isValidHeader());
183+
// isValidHeader above makes sure that checkHeader is non-null
181184
assertTrue(tiffParser.checkHeader());
182185
tiffParser.getFirstIFD().getRowsPerStrip();
183186
mock.close();
@@ -187,6 +190,8 @@ public void testNonUniformRowsPerStrip() throws IOException, FormatException {
187190
public void testBitsPerSampleMismatch() throws IOException, FormatException {
188191
mock = new BitsPerSampleSamplesPerPixelMismatchMock();
189192
tiffParser = mock.getTiffParser();
193+
assertTrue(tiffParser.isValidHeader());
194+
// isValidHeader above makes sure that checkHeader is non-null
190195
assertTrue(tiffParser.checkHeader());
191196
IFD ifd = tiffParser.getFirstIFD();
192197
int[] bitsPerSample = ifd.getBitsPerSample();

components/formats-bsd/test/loci/formats/utests/tiff/TiffSaverTest.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ public void testNullBytes() throws IOException {
117117
public void testWriteHeaderBigEndianRegularTiff() throws IOException {
118118
tiffSaver.writeHeader();
119119
assertTrue(tiffParser.isValidHeader());
120+
// isValidHeader above makes sure that checkHeader is non-null
120121
assertFalse(tiffParser.checkHeader());
121122
assertFalse(tiffParser.isBigTiff());
122123
}
@@ -126,6 +127,7 @@ public void testWriteHeaderLittleEndianRegularTiff() throws IOException {
126127
tiffSaver.setLittleEndian(true);
127128
tiffSaver.writeHeader();
128129
assertTrue(tiffParser.isValidHeader());
130+
// isValidHeader above makes sure that checkHeader is non-null
129131
assertTrue(tiffParser.checkHeader());
130132
assertFalse(tiffParser.isBigTiff());
131133
}
@@ -136,6 +138,7 @@ public void testWriteHeaderBigEndianBigTiff() throws IOException {
136138
tiffSaver.setBigTiff(true);
137139
tiffSaver.writeHeader();
138140
assertTrue(tiffParser.isValidHeader());
141+
// isValidHeader above makes sure that checkHeader is non-null
139142
assertFalse(tiffParser.checkHeader());
140143
assertTrue(tiffParser.isBigTiff());
141144
}
@@ -146,6 +149,7 @@ public void testWriteHeaderLittleEndianBigTiff() throws IOException {
146149
tiffSaver.setBigTiff(true);
147150
tiffSaver.writeHeader();
148151
assertTrue(tiffParser.isValidHeader());
152+
// isValidHeader above makes sure that checkHeader is non-null
149153
assertTrue(tiffParser.checkHeader());
150154
assertTrue(tiffParser.isBigTiff());
151155
}

components/formats-gpl/src/loci/formats/in/LeicaReader.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -772,7 +772,11 @@ else if (checkSuffix(baseFile, TiffReader.TIFF_SUFFIXES) && isGroupFiles())
772772

773773
in = new RandomAccessInputStream(baseFile, 16);
774774
TiffParser tp = new TiffParser(in);
775-
in.order(tp.checkHeader().booleanValue());
775+
Boolean littleEndian = tp.checkHeader();
776+
if (littleEndian == null) {
777+
throw new FormatException("Invalid TIFF file");
778+
}
779+
in.order(littleEndian.booleanValue());
776780

777781
in.seek(0);
778782

components/formats-gpl/src/loci/formats/in/MetamorphReader.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1170,7 +1170,10 @@ else if (exposureTimes.size() == 1 && exposureTimes.size() < getEffectiveSizeC()
11701170
}
11711171
stream = new RandomAccessInputStream(file, 16);
11721172
tp = new TiffParser(stream);
1173-
tp.checkHeader();
1173+
Boolean tiffLittleEndian = tp.checkHeader();
1174+
if (tiffLittleEndian == null) {
1175+
throw new FormatException("Invalid TIFF file: " + file);
1176+
}
11741177
IFDList f = tp.getMainIFDs();
11751178
if (f.size() > 0) {
11761179
lastFile = fileIndex;

components/formats-gpl/src/loci/formats/in/ZeissLSMReader.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -491,6 +491,9 @@ protected void initFile(String id) throws FormatException, IOException {
491491
int count = seriesCounts.get(lsmFilenames[i]);
492492
TiffParser tp = new TiffParser(stream);
493493
Boolean littleEndian = tp.checkHeader();
494+
if (littleEndian == null) {
495+
throw new FormatException("Invalid TIFF file: " + lsmFilenames[i]);
496+
}
494497
long[] ifdOffsets = tp.getIFDOffsets();
495498
int ifdsPerSeries = (ifdOffsets.length / 2) / count;
496499

0 commit comments

Comments
 (0)