blob: 0a537ac585c234b032f7789194fb2d44cc65b1ef [file] [log] [blame]
// 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)
}