aboutsummaryrefslogtreecommitdiffstats
path: root/sys/linux
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2022-12-17 12:45:03 +0100
committerDmitry Vyukov <dvyukov@google.com>2022-12-22 10:11:08 +0100
commit9867c87359492308a169e6da6e007082e299ac3a (patch)
treeae304695ecce329ef882711f2be7e42fdc5c457e /sys/linux
parent8482d3c1035095c89d112c75bfcc2e4095b486bf (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.go3
-rw-r--r--sys/linux/init_images.go88
-rw-r--r--sys/linux/init_images_test.go114
-rw-r--r--sys/linux/testdata/fs_images/0.in1
-rw-r--r--sys/linux/testdata/fs_images/0.out0bin8736 -> 0 bytes
-rw-r--r--sys/linux/testdata/fs_images/1.in1
-rw-r--r--sys/linux/testdata/fs_images/1.out0bin262144 -> 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
deleted file mode 100644
index 4eb5233c9..000000000
--- a/sys/linux/testdata/fs_images/0.out0
+++ /dev/null
Binary files differ
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
deleted file mode 100644
index c498f4d53..000000000
--- a/sys/linux/testdata/fs_images/1.out0
+++ /dev/null
Binary files differ