Source file
src/image/jpeg/fuzz_test.go
1
2
3
4
5 package jpeg
6
7 import (
8 "bytes"
9 "image"
10 "os"
11 "path/filepath"
12 "strings"
13 "testing"
14 )
15
16 func FuzzDecode(f *testing.F) {
17 if testing.Short() {
18 f.Skip("Skipping in short mode")
19 }
20
21 testdata, err := os.ReadDir("../testdata")
22 if err != nil {
23 f.Fatalf("failed to read testdata directory: %s", err)
24 }
25 for _, de := range testdata {
26 if de.IsDir() || !strings.HasSuffix(de.Name(), ".jpeg") {
27 continue
28 }
29 b, err := os.ReadFile(filepath.Join("../testdata", de.Name()))
30 if err != nil {
31 f.Fatalf("failed to read testdata: %s", err)
32 }
33 f.Add(b)
34 }
35
36 f.Fuzz(func(t *testing.T, b []byte) {
37 cfg, _, err := image.DecodeConfig(bytes.NewReader(b))
38 if err != nil {
39 return
40 }
41 if cfg.Width*cfg.Height > 1e6 {
42 return
43 }
44 img, typ, err := image.Decode(bytes.NewReader(b))
45 if err != nil || typ != "jpeg" {
46 return
47 }
48 for q := 1; q <= 100; q++ {
49 var w bytes.Buffer
50 err := Encode(&w, img, &Options{Quality: q})
51 if err != nil {
52 t.Errorf("failed to encode valid image: %s", err)
53 continue
54 }
55 img1, err := Decode(&w)
56 if err != nil {
57 t.Errorf("failed to decode roundtripped image: %s", err)
58 continue
59 }
60 got := img1.Bounds()
61 want := img.Bounds()
62 if !got.Eq(want) {
63 t.Errorf("roundtripped image bounds have changed, got: %s, want: %s", got, want)
64 }
65 }
66 })
67 }
68
View as plain text