mirror of
https://github.com/pocket-id/pocket-id.git
synced 2026-10-28 03:29:08 +01:00
fix: limit JPG and PNG pixels to prevent decompression bomb
This commit is contained in:
@@ -0,0 +1,58 @@
|
||||
package profilepicture
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/binary"
|
||||
"hash/crc32"
|
||||
"image"
|
||||
"image/png"
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestCreateProfilePictureRejectsOversizedPixelCountBeforeDecode(t *testing.T) {
|
||||
_, err := CreateProfilePicture(bytes.NewReader(pngHeaderWithDimensions(12_000, 12_000)))
|
||||
|
||||
require.ErrorIs(t, err, ErrInvalidImage)
|
||||
require.ErrorIs(t, err, errImageDimensionsTooLarge)
|
||||
}
|
||||
|
||||
func TestCreateProfilePictureAcceptsImageWithinLimits(t *testing.T) {
|
||||
var input bytes.Buffer
|
||||
require.NoError(t, png.Encode(&input, image.NewNRGBA(image.Rect(0, 0, 400, 300))))
|
||||
|
||||
output, err := CreateProfilePicture(bytes.NewReader(input.Bytes()))
|
||||
require.NoError(t, err)
|
||||
|
||||
config, format, err := image.DecodeConfig(output)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, "png", format)
|
||||
require.Equal(t, 300, config.Width)
|
||||
require.Equal(t, 300, config.Height)
|
||||
}
|
||||
|
||||
func TestStripMetadataRejectsOversizedPixelCount(t *testing.T) {
|
||||
_, err := StripMetadata(bytes.NewReader(pngHeaderWithDimensions(12_000, 12_000)), "png")
|
||||
|
||||
require.ErrorIs(t, err, ErrInvalidImage)
|
||||
require.ErrorIs(t, err, errImageDimensionsTooLarge)
|
||||
}
|
||||
|
||||
func pngHeaderWithDimensions(width, height uint32) []byte {
|
||||
var out bytes.Buffer
|
||||
out.Write([]byte("\x89PNG\r\n\x1a\n"))
|
||||
|
||||
const headerLength = 13
|
||||
data := make([]byte, headerLength)
|
||||
binary.BigEndian.PutUint32(data[0:4], width)
|
||||
binary.BigEndian.PutUint32(data[4:8], height)
|
||||
data[8] = 8
|
||||
|
||||
_ = binary.Write(&out, binary.BigEndian, uint32(headerLength))
|
||||
out.WriteString("IHDR")
|
||||
out.Write(data)
|
||||
_ = binary.Write(&out, binary.BigEndian, crc32.ChecksumIEEE(append([]byte("IHDR"), data...)))
|
||||
|
||||
return out.Bytes()
|
||||
}
|
||||
Reference in New Issue
Block a user