aboutsummaryrefslogtreecommitdiffstats
path: root/tools/syz-imagegen/imagegen.go
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2018-04-01 18:29:56 +0200
committerDmitry Vyukov <dvyukov@google.com>2018-04-01 18:29:56 +0200
commit99e3b0a7e8b3ba990fd3ff3e7d10cbd92b957b14 (patch)
tree8d907471cc6c69ab35516a80aea3975e759129b9 /tools/syz-imagegen/imagegen.go
parent185ac3525e708353d3cae302277225aec1fde165 (diff)
sys/linux: add support for reading partition tables
Diffstat (limited to 'tools/syz-imagegen/imagegen.go')
-rw-r--r--tools/syz-imagegen/imagegen.go49
1 files changed, 33 insertions, 16 deletions
diff --git a/tools/syz-imagegen/imagegen.go b/tools/syz-imagegen/imagegen.go
index 24ea92789..ce8216512 100644
--- a/tools/syz-imagegen/imagegen.go
+++ b/tools/syz-imagegen/imagegen.go
@@ -1,7 +1,7 @@
// Copyright 2018 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.
-// imagegen generates syz_mount_image calls from disk images.
+// imagegen generates syz_mount_image/syz_read_part_table calls from disk images.
package main
import (
@@ -41,7 +41,9 @@ func main() {
break
}
pos = (pos + *flagAlign - 1) & ^(*flagAlign - 1)
- segs = append(segs, Segment{offset, data[:pos]})
+ if pos != 0 {
+ segs = append(segs, Segment{offset, data[:pos]})
+ }
for pos < len(data) && data[pos] == 0 {
pos++
}
@@ -74,20 +76,35 @@ func main() {
fmt.Fprintf(os.Stderr, "restored data differs!\n")
os.Exit(1)
}
- syscallSuffix := *flagFS
- if syscallSuffix == "ext2" || syscallSuffix == "ext3" {
- syscallSuffix = "ext4"
- }
- fmt.Printf(`syz_mount_image$%v(&(0x7f0000000000)='%v\x00', &(0x7f0000000100)='./file0\x00', 0x%x, 0x%x, &(0x7f0000000200)=[`,
- syscallSuffix, *flagFS, len(data0), len(segs))
- addr := 0x7f0000010000
- for i, seg := range segs {
- if i != 0 {
- fmt.Printf(", ")
+ if *flagFS == "part" {
+ fmt.Printf(`syz_read_part_table(0x%x, 0x%x, &(0x7f0000000200)=[`,
+ len(data0), len(segs))
+ addr := 0x7f0000010000
+ for i, seg := range segs {
+ if i != 0 {
+ fmt.Printf(", ")
+ }
+ fmt.Printf(`{&(0x%x)="%v", 0x%x, 0x%x}`,
+ addr, hex.EncodeToString(seg.data), len(seg.data), seg.offset)
+ addr = (addr + len(seg.data) + 0xff) & ^0xff
+ }
+ fmt.Printf("])\n")
+ } else {
+ syscallSuffix := *flagFS
+ if syscallSuffix == "ext2" || syscallSuffix == "ext3" {
+ syscallSuffix = "ext4"
+ }
+ fmt.Printf(`syz_mount_image$%v(&(0x7f0000000000)='%v\x00', &(0x7f0000000100)='./file0\x00', 0x%x, 0x%x, &(0x7f0000000200)=[`,
+ syscallSuffix, *flagFS, len(data0), len(segs))
+ addr := 0x7f0000010000
+ for i, seg := range segs {
+ if i != 0 {
+ fmt.Printf(", ")
+ }
+ fmt.Printf(`{&(0x%x)="%v", 0x%x, 0x%x}`,
+ addr, hex.EncodeToString(seg.data), len(seg.data), seg.offset)
+ addr = (addr + len(seg.data) + 0xff) & ^0xff
}
- fmt.Printf(`{&(0x%x)="%v", 0x%x, 0x%x}`,
- addr, hex.EncodeToString(seg.data), len(seg.data), seg.offset)
- addr = (addr + len(seg.data) + 0xff) & ^0xff
+ fmt.Printf("], 0x0, &(0x%x))\n", addr)
}
- fmt.Printf("], 0x0, &(0x%x))\n", addr)
}