diff options
| author | Dmitry Vyukov <dvyukov@google.com> | 2022-12-17 12:45:03 +0100 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2022-12-22 10:11:08 +0100 |
| commit | 9867c87359492308a169e6da6e007082e299ac3a (patch) | |
| tree | ae304695ecce329ef882711f2be7e42fdc5c457e /sys/linux | |
| parent | 8482d3c1035095c89d112c75bfcc2e4095b486bf (diff) | |
prog: move image extraction from sys/linux
Now that images are not linux-specific,
we can move all image-related logic directly into prog package
and significantly simplify the logic.
Diffstat (limited to 'sys/linux')
| -rw-r--r-- | sys/linux/init.go | 3 | ||||
| -rw-r--r-- | sys/linux/init_images.go | 88 | ||||
| -rw-r--r-- | sys/linux/init_images_test.go | 114 | ||||
| -rw-r--r-- | sys/linux/testdata/fs_images/0.in | 1 | ||||
| -rw-r--r-- | sys/linux/testdata/fs_images/0.out0 | bin | 8736 -> 0 bytes | |||
| -rw-r--r-- | sys/linux/testdata/fs_images/1.in | 1 | ||||
| -rw-r--r-- | sys/linux/testdata/fs_images/1.out0 | bin | 262144 -> 0 bytes |
7 files changed, 0 insertions, 207 deletions
diff --git a/sys/linux/init.go b/sys/linux/init.go index 7d537075c..faf4a98af 100644 --- a/sys/linux/init.go +++ b/sys/linux/init.go @@ -54,7 +54,6 @@ func InitTarget(target *prog.Target) { target.MakeDataMmap = targets.MakePosixMmap(target, true, true) target.Neutralize = arch.neutralize - target.ExtractMountedImage = arch.extractSyzMountImage target.SpecialTypes = map[string]func(g *prog.Gen, typ prog.Type, dir prog.Dir, old prog.Arg) ( prog.Arg, []*prog.Call){ "timespec": arch.generateTimespec, @@ -245,8 +244,6 @@ func (arch *arch) neutralize(c *prog.Call, fixStructure bool) error { case "sched_setattr": // Enabling a SCHED_FIFO or a SCHED_RR policy may lead to false positive stall-related crashes. neutralizeSchedAttr(c.Args[1]) - case "syz_mount_image": - return arch.fixUpSyzMountImage(c, fixStructure) } switch c.Meta.Name { diff --git a/sys/linux/init_images.go b/sys/linux/init_images.go deleted file mode 100644 index c9a3035ef..000000000 --- a/sys/linux/init_images.go +++ /dev/null @@ -1,88 +0,0 @@ -// Copyright 2022 syzkaller project authors. All rights reserved. -// Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file. - -package linux - -import ( - "bytes" - "fmt" - "io" - - "github.com/google/syzkaller/pkg/image" - "github.com/google/syzkaller/prog" -) - -func (arch *arch) extractSyzMountImage(c *prog.Call) (io.Reader, error) { - // In order to reduce the size of syzlang programs, disk images are compressed. - // Here we extract the compressed image. - if c.Meta.CallName != "syz_mount_image" { - return nil, nil - } - data, _, err := parseSyzMountImage(c) - if err != nil { - // Parsing failed --> do not try to recover, just ignore. - return nil, err - } else if len(data) == 0 { - return nil, fmt.Errorf("an empty image") - } - buf := new(bytes.Buffer) - if err := image.DecompressWriter(buf, data); err != nil { - return nil, err - } - return buf, nil -} - -func (arch *arch) fixUpSyzMountImage(c *prog.Call, fixStructure bool) error { - // Previously we did such a sanitization right in the common_linux.h, but this was problematic - // for two reasons: - // 1) It further complicates the already complicated executor code. - // 2) We'd need to duplicate the logic in Go for raw image extraction. - // So now we do all the initialization in Go and let the C code only interpret the commands. - data, sizeArg, err := parseSyzMountImage(c) - sizeArg.Val = uint64(len(data)) - if err != nil { - if fixStructure { - deactivateSyzMountImage(c) - return nil - } - return err - } - return nil -} - -func deactivateSyzMountImage(c *prog.Call) { - dataPointer := c.Args[6] - newArg := dataPointer.Type().DefaultArg(dataPointer.Dir()) - prog.RemoveArg(dataPointer) - c.Args[6] = newArg - // Also set the size field to 0. - c.Args[5].(*prog.ConstArg).Val = 0 -} - -// Returns the compressed disk image and the corresponding length argument. -func parseSyzMountImage(c *prog.Call) ([]byte, *prog.ConstArg, error) { - if len(c.Args) < 7 { - panic("invalid number of arguments in syz_mount_image") - } - - // Check `size` argument. - sizeArg, ok := c.Args[5].(*prog.ConstArg) - if !ok { - panic("syz_mount_image's size arg is not const") - } - - dataPointer, ok := c.Args[6].(*prog.PointerArg) - if !ok { - panic("syz_mount_image's data pointer is invalid") - } - - dataArg, ok := dataPointer.Res.(*prog.DataArg) - if !ok { - return nil, sizeArg, fmt.Errorf("could not find raw image data") - } - if dataArg == nil { - return nil, sizeArg, fmt.Errorf("image argument contains no data") - } - - return dataArg.Data(), sizeArg, nil -} diff --git a/sys/linux/init_images_test.go b/sys/linux/init_images_test.go deleted file mode 100644 index c6af2049c..000000000 --- a/sys/linux/init_images_test.go +++ /dev/null @@ -1,114 +0,0 @@ -// Copyright 2022 syzkaller project authors. All rights reserved. -// Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file. - -package linux_test - -import ( - "flag" - "fmt" - "io" - "os" - "path/filepath" - "reflect" - "sort" - "strings" - "testing" - - "github.com/google/syzkaller/pkg/osutil" - "github.com/google/syzkaller/prog" - "github.com/google/syzkaller/sys/targets" -) - -// nolint: lll - -func TestSyzMountImageNeutralize(t *testing.T) { - prog.TestDeserializeHelper(t, targets.Linux, targets.AMD64, nil, []prog.DeserializeTest{ - { - // A valid call, nothing should change. - In: `syz_mount_image$bfs(&(0x7f0000000000)='bfs\x00', &(0x7f0000000100)='./file0\x00', ` + - `0x0, &(0x7f00000100a0)={[], [], 0x0}, 0x0, 0x15, ` + - `&(0x7f0000000200)="$eJwqrqzKTszJSS0CBAAA//8TyQPi")`, - }, - { - // Invalid compressed size. - In: `syz_mount_image$bfs(&(0x7f0000000000)='bfs\x00', &(0x7f0000000100)='./file0\x00', ` + - `0x0, &(0x7f00000100a0)={[], [], 0x0}, 0x0, 0xdeadbeef, ` + - `&(0x7f0000000200)="$eJwqrqzKTszJSS0CBAAA//8TyQPi")`, - // It should be able to fix up the size. - Out: `syz_mount_image$bfs(&(0x7f0000000000)='bfs\x00', &(0x7f0000000100)='./file0\x00', ` + - `0x0, &(0x7f00000100a0)={[], [], 0x0}, 0x0, 0x15, ` + - `&(0x7f0000000200)="$eJwqrqzKTszJSS0CBAAA//8TyQPi")`, - }, - }) -} - -var flagUpdate = flag.Bool("update", false, "update test files accordingly to current results") - -func TestExtractSyzMountImage(t *testing.T) { - target, err := prog.GetTarget(targets.Linux, targets.AMD64) - if err != nil { - t.Fatal(err) - } - files, err := filepath.Glob(filepath.Join("testdata", "fs_images", "*.in")) - if err != nil { - t.Fatalf("directory read failed: %v", err) - } - allOutFiles, err := filepath.Glob(filepath.Join("testdata", "fs_images", "*.out*")) - if err != nil { - t.Fatalf("directory read failed: %v", err) - } - testedOutFiles := []string{} - for _, file := range files { - if !strings.HasSuffix(file, ".in") { - continue - } - sourceProg, err := os.ReadFile(file) - if err != nil { - t.Fatal(err) - } - p, err := target.Deserialize(sourceProg, prog.NonStrict) - if err != nil { - t.Fatalf("failed to deserialize %s: %s", file, err) - } - base := strings.TrimSuffix(file, ".in") - for _, asset := range p.ExtractAssets() { - if asset.Type != prog.MountInRepro { - continue - } - outFilePath := fmt.Sprintf("%s.out%d", base, asset.Call) - var testResult []byte - if asset.Reader != nil { - var err error - testResult, err = io.ReadAll(asset.Reader) - if err != nil { - t.Fatal(err) - } - } - if *flagUpdate && asset.Reader != nil { - err := osutil.WriteFile(outFilePath, testResult) - if err != nil { - t.Fatal(err) - } - } - outExists := osutil.IsExist(outFilePath) - if !outExists && asset.Reader != nil { - t.Fatalf("#%d: mount found, but does not exist in the answer", asset.Call) - } - if testResult != nil { - testedOutFiles = append(testedOutFiles, outFilePath) - outFile, err := os.ReadFile(outFilePath) - if err != nil { - t.Fatal(err) - } - if !reflect.DeepEqual(testResult, outFile) { - t.Fatalf("output not equal:\nWant: %x\nGot: %x", outFile, testResult) - } - } - } - } - sort.Strings(testedOutFiles) - sort.Strings(allOutFiles) - if !reflect.DeepEqual(testedOutFiles, allOutFiles) { - t.Fatalf("all out files: %v\ntested files: %v", allOutFiles, testedOutFiles) - } -} diff --git a/sys/linux/testdata/fs_images/0.in b/sys/linux/testdata/fs_images/0.in deleted file mode 100644 index 0ea5bce18..000000000 --- a/sys/linux/testdata/fs_images/0.in +++ /dev/null @@ -1 +0,0 @@ -syz_mount_image$bfs(&(0x7f0000000000)='bfs\x00', &(0x7f0000000100)='./file0\x00', 0x0, &(0x7f00000100a0)={[], [], 0x0}, 0x0, 0x46, &(0x7f0000000200)="$eJzsykEJACAABEEL2D+FFQxgCCtoAvEr10CY+S1sCbP19fY4u+YDAAAAAAAAAMA/bgAAAP//84oF/g==") diff --git a/sys/linux/testdata/fs_images/0.out0 b/sys/linux/testdata/fs_images/0.out0 Binary files differdeleted file mode 100644 index 4eb5233c9..000000000 --- a/sys/linux/testdata/fs_images/0.out0 +++ /dev/null diff --git a/sys/linux/testdata/fs_images/1.in b/sys/linux/testdata/fs_images/1.in deleted file mode 100644 index 6e8992119..000000000 --- a/sys/linux/testdata/fs_images/1.in +++ /dev/null @@ -1 +0,0 @@ -syz_mount_image$ext4(&(0x7f0000000000)='ext4\x00', &(0x7f0000000100)='./file0\x00', 0x0, &(0x7f00000117e0), 0x0, 0x4a0, &(0x7f0000000200)="$eJzs3c1rXFUbAPDnzjRtkubt54uYLmxpxfpBM/loCYggroqLitqVqxrTaSydZEJm0jYBId34FwgKxYUbwZ0rVwpduBbc6UZcuRBEoS7EKiP3zkyarwmjphnJ/f3gds69ZzrPORmew5lz78wNILdOpf8kEUMR8VVEHG7urn/CqebDzIPh6XRLotG4/HOSPS/dbz+1/f8ORsRKRPRHxOsXI95KNsetLS3fmKpUygut/VJ9dr5UW1o+d312aqY8U56bGD8/emFycmxiYsf6eveL0989tfLy8Xff+eH7V1be+Dxt1lCrbm0/dlKz631xdM2xfRHxwqMI1gPFVn8Get0Q/pH0/TseEWey/D8cxezdBPKg0Wg0/mgc6FS90gD2rEI2B04KIxHRLBcKIyPNOfz/Y7BQqdbqz12rLs5dbc6Vj0Rf4dr1Snm09VnhSPQl6f5YVn64P75hP53Fp3Pg94oD2f7IdLVydXeHOmCDgxvy/9diM/+BnPCRH/JL/kN+yX/IL/kP+SX/Ib/kP+SX/If8kv+QX/If8kv+Q37Jf8ilVy9dSrdG+/vvby8s1m9evzEyPTJTrc5Uygu1kenqbPevV6lW58fHYvF2qV6u1Uu1peUrs9XFufqV7Hv9V8p9j7AvwN9z9OS9b5OIWHl+INtS+1t1chX2tkYjiV5/BxnojWKvByCgZyz9QX75jA9s8RO96/R3qpjf+bYAu6PQ6wYAPXN22Pk/yCvr/5Bf1v8hv8zxAev/kD/W/yG/hjrc/+t/a+7dNRoRhyLim2Lfgfa9voC9oPBj0pr/nz385NDG2v3Jb9kpgv0Rcevu5fdvT9XrC2Pp8V9Wj9c/aB0f70X7gW6187SdxwBAfs08GJ5ub7sZ96eXmhchbI6/r7U22Z+doxy8n6y7ViHZoWsXVu5ExONbxU9a9ztvnvkYvF/cFP9Y6zFpvkTW3n3ZfdN3J/7wmvhPrIl/4l//VSAf7qXjz+hW+VfIcjpW82/9+DO0Q9dOdB7/CqvjX7HD+Heyyxgff1r8sGP8OxEntozfjtefxdoYP23b2S7jvzbw5c1OdY2Pmq+zVfy2tFSqz86XakvL57LfkZspz02Mnx+9MDk5NjFRytaoS+2V6s0u/n76zHb9H+wQf7v+p8ee6bL/Xx/6ZOzUNvGfPrP1+39sm/gDEfFsl/HfvPXZY53q0vhXO/S/sE389NhEl/Ff/LPmMmMA+A+pLS3fmKpUygsKCgoKq4Vej0zAo/Yw6XvdEgAAAAAAAAAAAKBbu3E5ca/7CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwF/wVAAD///5/rUY=") diff --git a/sys/linux/testdata/fs_images/1.out0 b/sys/linux/testdata/fs_images/1.out0 Binary files differdeleted file mode 100644 index c498f4d53..000000000 --- a/sys/linux/testdata/fs_images/1.out0 +++ /dev/null |
