aboutsummaryrefslogtreecommitdiffstats
path: root/prog
diff options
context:
space:
mode:
authorAndrey Konovalov <andreyknvl@google.com>2017-02-06 19:27:17 +0100
committerAndrey Konovalov <andreyknvl@google.com>2017-02-06 20:24:49 +0100
commitb4bdefbe9be8d3d502db5e775aa85cd5c38463db (patch)
tree4cc87b8d0761a80a1796edccde72eda2584f6dab /prog
parent0fc888220a6b32ba7903f1907e8c2cc64d1df3a1 (diff)
prog, sys: add icmp descriptions and checksum
Diffstat (limited to 'prog')
-rw-r--r--prog/checksum.go40
-rw-r--r--prog/checksum_test.go2
2 files changed, 21 insertions, 21 deletions
diff --git a/prog/checksum.go b/prog/checksum.go
index fdc14a513..03eb81f7b 100644
--- a/prog/checksum.go
+++ b/prog/checksum.go
@@ -130,20 +130,7 @@ func getFieldByName(arg *Arg, name string) *Arg {
panic(fmt.Sprintf("failed to find %v field in %v", name, arg.Type.Name()))
}
-func findCsumFieldIPv4(packet *Arg, pid int) *Arg {
- csumField := getFieldByName(packet, "csum")
- if typ, ok := csumField.Type.(*sys.CsumType); !ok {
- panic(fmt.Sprintf("checksum field has bad type %v, arg: %+v", csumField.Type, csumField))
- } else if typ.Kind != sys.CsumIPv4 {
- panic(fmt.Sprintf("checksum field has bad kind %v, arg: %+v", typ.Kind, csumField))
- }
- if csumField.Value(pid) != 0 {
- panic(fmt.Sprintf("checksum field has nonzero value %v, arg: %+v", csumField.Value(pid), csumField))
- }
- return csumField
-}
-
-func calcChecksumIPv4(packet, csumField *Arg, pid int) *Arg {
+func calcChecksumInet(packet, csumField *Arg, pid int) *Arg {
bytes := encodeArg(packet, pid)
csum := ipChecksum(bytes)
newCsumField := *csumField
@@ -234,16 +221,29 @@ func calcChecksumsCall(c *Call, pid int) map[*Arg]*Arg {
var ipSrcAddr *Arg
var ipDstAddr *Arg
tcp := false
+
+ // Calculate inet checksums.
+ foreachArgArray(&c.Args, nil, func(arg, base *Arg, _ *[]*Arg) {
+ if _, ok := arg.Type.(*sys.StructType); ok {
+ for _, field := range arg.Inner {
+ if typ, ok1 := field.Type.(*sys.CsumType); ok1 {
+ if typ.Kind == sys.CsumInet {
+ newCsumField := calcChecksumInet(arg, field, pid)
+ if csumMap == nil {
+ csumMap = make(map[*Arg]*Arg)
+ }
+ csumMap[field] = newCsumField
+ }
+ }
+ }
+ }
+ })
+
+ // Calculate tcp and udp checksums.
foreachArgArray(&c.Args, nil, func(arg, base *Arg, _ *[]*Arg) {
// syz_csum_* structs are used in tests
switch arg.Type.Name() {
case "ipv4_header", "syz_csum_ipv4_header":
- if csumMap == nil {
- csumMap = make(map[*Arg]*Arg)
- }
- csumField := findCsumFieldIPv4(arg, pid)
- newCsumField := calcChecksumIPv4(arg, csumField, pid)
- csumMap[csumField] = newCsumField
ipSrcAddr, ipDstAddr = extractHeaderParamsIPv4(arg)
ipv4HeaderParsed = true
case "ipv6_packet", "syz_csum_ipv6_header":
diff --git a/prog/checksum_test.go b/prog/checksum_test.go
index c956da509..cd16bb70b 100644
--- a/prog/checksum_test.go
+++ b/prog/checksum_test.go
@@ -143,7 +143,7 @@ func TestChecksumCalc(t *testing.T) {
}{
{
"syz_test$csum_ipv4(&(0x7f0000000000)={0x0, 0x1234, 0x5678})",
- sys.CsumIPv4,
+ sys.CsumInet,
0x9753,
},
{