// 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" "runtime" "github.com/google/syzkaller/pkg/osutil" "github.com/google/syzkaller/prog" _ "github.com/google/syzkaller/sys" ) func main() { if len(os.Args) != 2 { fatalf("usage: syz-upgrade corpus_dir") } files, err := ioutil.ReadDir(os.Args[1]) if err != nil { fatalf("failed to read corpus dir: %v", err) } target, err := prog.GetTarget(runtime.GOOS, runtime.GOARCH) if err != nil { fatalf("%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 := target.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 := osutil.WriteFile(fname1, data1); 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) }