aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
Diffstat (limited to 'tools')
-rw-r--r--tools/syz-upgrade/upgrade.go59
1 files changed, 59 insertions, 0 deletions
diff --git a/tools/syz-upgrade/upgrade.go b/tools/syz-upgrade/upgrade.go
new file mode 100644
index 000000000..ea2b3b6df
--- /dev/null
+++ b/tools/syz-upgrade/upgrade.go
@@ -0,0 +1,59 @@
+// Copyright 2015 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.
+
+// upgrade upgrades corpus from an old format to a new format.
+// Upgrade is not fully automatic. You need to update prog.Serialize.
+// Run the tool. Then update prog.Deserialize. And run the tool again that
+// the corpus is not changed this time.
+package main
+
+import (
+ "bytes"
+ "crypto/sha1"
+ "encoding/hex"
+ "fmt"
+ "io/ioutil"
+ "os"
+ "path/filepath"
+
+ "github.com/google/syzkaller/prog"
+)
+
+func main() {
+ if len(os.Args) != 2 {
+ fatalf("usage: syz-upgrage corpus_dir")
+ }
+ files, err := ioutil.ReadDir(os.Args[1])
+ if err != nil {
+ fatalf("failed to read corpus dir: %v", err)
+ }
+ for _, f := range files {
+ fname := filepath.Join(os.Args[1], f.Name())
+ data, err := ioutil.ReadFile(fname)
+ if err != nil {
+ fatalf("failed to read program: %v", err)
+ }
+ p, err := prog.Deserialize(data)
+ if err != nil {
+ fatalf("failed to deserialize program: %v", err)
+ }
+ data1 := p.Serialize()
+ if bytes.Equal(data, data1) {
+ continue
+ }
+ fmt.Printf("upgrading:\n%s\nto:\n%s\n\n", data, data1)
+ hash := sha1.Sum(data1)
+ fname1 := filepath.Join(os.Args[1], hex.EncodeToString(hash[:]))
+ if err := ioutil.WriteFile(fname1, data1, 0640); err != nil {
+ fatalf("failed to write program: %v", err)
+ }
+ if err := os.Remove(fname); err != nil {
+ fatalf("failed to remove program: %v", err)
+ }
+ }
+}
+
+func fatalf(msg string, args ...interface{}) {
+ fmt.Fprintf(os.Stderr, msg+"\n", args...)
+ os.Exit(1)
+}