aboutsummaryrefslogtreecommitdiffstats
path: root/pkg/csource/generated.go
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2018-12-08 19:03:09 +0100
committerDmitry Vyukov <dvyukov@google.com>2018-12-08 19:08:08 +0100
commitc7918378631992d874c99736272ed342d5d77b2c (patch)
tree5e67097471fda876d532c270dc4b7f3db0e850c5 /pkg/csource/generated.go
parent33508266251f6db13ef34741e36b1dce2c9e1b49 (diff)
executor: fix handling of big-endian bitfields
Currently we apply big-endian-ness and bitfield-ness in the wrong order in copyin. This leads to totally bogus result. Fix this.
Diffstat (limited to 'pkg/csource/generated.go')
-rw-r--r--pkg/csource/generated.go27
1 files changed, 12 insertions, 15 deletions
diff --git a/pkg/csource/generated.go b/pkg/csource/generated.go
index a7bfe74d0..0c3ecb4e8 100644
--- a/pkg/csource/generated.go
+++ b/pkg/csource/generated.go
@@ -310,19 +310,10 @@ static int event_timedwait(event_t* ev, uint64 timeout)
#endif
#if SYZ_EXECUTOR || SYZ_USE_BITMASKS
-#define BITMASK_LEN(type, bf_len) (type)((1ull << (bf_len)) - 1)
-
-#define BITMASK_LEN_OFF(type, bf_off, bf_len) (type)(BITMASK_LEN(type, (bf_len)) << (bf_off))
-
-#define STORE_BY_BITMASK(type, addr, val, bf_off, bf_len) \
- if ((bf_off) == 0 && (bf_len) == 0) { \
- *(type*)(addr) = (type)(val); \
- } else { \
- type new_val = *(type*)(addr); \
- new_val &= ~BITMASK_LEN_OFF(type, (bf_off), (bf_len)); \
- new_val |= ((type)(val)&BITMASK_LEN(type, (bf_len))) << (bf_off); \
- *(type*)(addr) = new_val; \
- }
+#define BITMASK(bf_off, bf_len) (((1ull << (bf_len)) - 1) << (bf_off))
+#define STORE_BY_BITMASK(type, htobe, addr, val, bf_off, bf_len) \
+ *(type*)(addr) = htobe((htobe(*(type*)(addr)) & ~BITMASK((bf_off), (bf_len))) | \
+ (((type)(val) << (bf_off)) & BITMASK((bf_off), (bf_len))))
#endif
#if SYZ_EXECUTOR || SYZ_USE_CHECKSUMS
@@ -3945,7 +3936,10 @@ static long syz_compare(long want, long want_len, long got, long got_len)
return -1;
}
if (memcmp((void*)want, (void*)got, want_len)) {
- debug("syz_compare: data differs\n");
+ debug("syz_compare: data differs, want:\n");
+ debug_dump_data((char*)want, want_len);
+ debug("got:\n");
+ debug_dump_data((char*)got, got_len);
errno = EINVAL;
return -1;
}
@@ -4106,7 +4100,10 @@ static long syz_compare(long want, long want_len, long got, long got_len)
return -1;
}
if (memcmp((void*)want, (void*)got, want_len)) {
- debug("syz_compare: data differs\n");
+ debug("syz_compare: data differs, want:\n");
+ debug_dump_data((char*)want, want_len);
+ debug("got:\n");
+ debug_dump_data((char*)got, got_len);
errno = EINVAL;
return -1;
}