diff options
Diffstat (limited to 'internal/media')
| -rw-r--r-- | internal/media/png-stripper.go | 28 | 
1 files changed, 24 insertions, 4 deletions
| 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 @@ import (  	"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  			} | 
