From 41799debdcc19d65fb6e0499cbbb74a489a822ea Mon Sep 17 00:00:00 2001 From: Dmitry Vyukov Date: Wed, 13 Dec 2017 19:18:07 +0100 Subject: prog: introduce more readable format for data args Fixes #460 File names, crypto algorithm names, etc in programs are completely unreadable: bind$alg(r0, &(0x7f0000408000)={0x26, "6861736800000000000000000000", 0x0, 0x0, "6d6435000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000 00000000000"}, 0x58) Introduce another format for printable strings. New args are denoted by '' ("" for old args). New format is enabled for printable chars, \x00 and \t, \r, \n. Example: `serialize(&(0x7f0000408000)={"6861736800000000000000000000", "4849000000"})`, vs: `serialize(&(0x7f0000408000)={'hash\x00', 'HI\x00'})`, --- prog/encoding_test.go | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) (limited to 'prog/encoding_test.go') diff --git a/prog/encoding_test.go b/prog/encoding_test.go index a46428526..39063a055 100644 --- a/prog/encoding_test.go +++ b/prog/encoding_test.go @@ -4,7 +4,9 @@ package prog import ( + "bytes" "fmt" + "math/rand" "reflect" "regexp" "sort" @@ -20,6 +22,30 @@ func setToArray(s map[string]struct{}) []string { return a } +func TestSerializeData(t *testing.T) { + t.Parallel() + r := rand.New(rand.NewSource(0)) + for i := 0; i < 1e4; i++ { + data := make([]byte, r.Intn(4)) + for i := range data { + data[i] = byte(r.Intn(256)) + } + buf := new(bytes.Buffer) + serializeData(buf, data) + p := newParser(buf.Bytes()) + if !p.Scan() { + t.Fatalf("parser does not scan") + } + data1, err := deserializeData(p) + if err != nil { + t.Fatalf("failed to deserialize %q -> %s: %v", data, buf.Bytes(), err) + } + if !bytes.Equal(data, data1) { + t.Fatalf("corrupted data %q -> %s -> %q", data, buf.Bytes(), data1) + } + } +} + func TestCallSet(t *testing.T) { tests := []struct { prog string @@ -137,3 +163,24 @@ func TestDeserialize(t *testing.T) { } } } + +func TestSerializeDeserialize(t *testing.T) { + target := initTargetTest(t, "test", "64") + tests := [][2]string{ + { + `serialize(&(0x7f0000408000)={"6861736800000000000000000000", "4849000000"})`, + `serialize(&(0x7f0000408000)={'hash\x00', 'HI\x00'})`, + }, + } + for _, test := range tests { + p, err := target.Deserialize([]byte(test[0])) + if err != nil { + t.Fatal(err) + } + data := p.Serialize() + test[1] += "\n" + if string(data) != test[1] { + t.Fatalf("\ngot : %s\nwant: %s", data, test[1]) + } + } +} -- cgit mrf-deployment