diff --git a/internal/media/png-stripper.go b/internal/media/png-stripper.go index e23ac2cd0..485f4c930 100644 --- a/internal/media/png-stripper.go +++ b/internal/media/png-stripper.go @@ -78,9 +78,29 @@ "io" ) -// chunkTypeAncillaryBit is whether the first byte of a big-endian uint32 chunk -// type (the first of four ASCII letters) is lower-case. -const chunkTypeAncillaryBit = 0x20000000 +const ( + chunkTypeIHDR = 0x49484452 + chunkTypePLTE = 0x504C5445 + chunkTypeIDAT = 0x49444154 + chunkTypeIEND = 0x49454E44 + chunkTypeTRNS = 0x74524e53 +) + +func isNecessaryChunkType(chunkType uint32) bool { + switch chunkType { + case chunkTypeIHDR: + return true + case chunkTypePLTE: + return true + case chunkTypeIDAT: + return true + case chunkTypeIEND: + return true + case chunkTypeTRNS: + return true + } + return false +} // pngAncillaryChunkStripper wraps another io.Reader to strip ancillary chunks, // if the data is in the PNG file format. If the data isn't PNG, it is passed @@ -179,7 +199,7 @@ func (r *pngAncillaryChunkStripper) Read(p []byte) (int, error) { // byte trailer, a checksum. r.pending = int64(binary.BigEndian.Uint32(r.buffer[:4])) + 4 chunkType := binary.BigEndian.Uint32(r.buffer[4:]) - r.discard = (chunkType & chunkTypeAncillaryBit) != 0 + r.discard = !isNecessaryChunkType(chunkType) if r.discard { r.rIndex = r.wIndex }