2014-09-06 19:01:11 +03:00
|
|
|
# Run a fuzz test to verify robustness against corrupted/malicious data.
|
|
|
|
|
|
2019-12-15 18:05:04 +02:00
|
|
|
import time
|
|
|
|
|
|
2014-12-26 17:34:45 +02:00
|
|
|
Import("env", "malloc_env")
|
2014-09-06 19:01:11 +03:00
|
|
|
|
2015-09-20 14:12:19 +03:00
|
|
|
def set_pkgname(src, dst, pkgname):
|
|
|
|
|
data = open(str(src)).read()
|
|
|
|
|
placeholder = '// package name placeholder'
|
|
|
|
|
assert placeholder in data
|
|
|
|
|
data = data.replace(placeholder, 'package %s;' % pkgname)
|
|
|
|
|
open(str(dst), 'w').write(data)
|
|
|
|
|
|
2014-09-06 19:01:11 +03:00
|
|
|
# We want both pointer and static versions of the AllTypes message
|
2014-12-26 17:34:45 +02:00
|
|
|
# Prefix them with package name.
|
2014-09-06 19:01:11 +03:00
|
|
|
env.Command("alltypes_static.proto", "#alltypes/alltypes.proto",
|
2015-09-20 14:12:19 +03:00
|
|
|
lambda target, source, env: set_pkgname(source[0], target[0], 'alltypes_static'))
|
2014-09-06 19:01:11 +03:00
|
|
|
env.Command("alltypes_pointer.proto", "#alltypes/alltypes.proto",
|
2015-09-20 14:12:19 +03:00
|
|
|
lambda target, source, env: set_pkgname(source[0], target[0], 'alltypes_pointer'))
|
2014-09-06 19:01:11 +03:00
|
|
|
|
2020-01-13 13:01:08 +02:00
|
|
|
env.NanopbProto(["alltypes_pointer", "alltypes_pointer.options"])
|
|
|
|
|
env.NanopbProto(["alltypes_static", "alltypes_static.options"])
|
2020-01-02 12:42:00 +02:00
|
|
|
|
|
|
|
|
# Do the same for proto3 versions
|
|
|
|
|
env.Command("alltypes_proto3_static.proto", "#alltypes_proto3/alltypes.proto",
|
|
|
|
|
lambda target, source, env: set_pkgname(source[0], target[0], 'alltypes_proto3_static'))
|
|
|
|
|
env.Command("alltypes_proto3_pointer.proto", "#alltypes_proto3/alltypes.proto",
|
|
|
|
|
lambda target, source, env: set_pkgname(source[0], target[0], 'alltypes_proto3_pointer'))
|
|
|
|
|
|
2020-01-13 13:01:08 +02:00
|
|
|
env.NanopbProto(["alltypes_proto3_pointer", "alltypes_proto3_pointer.options"])
|
|
|
|
|
env.NanopbProto(["alltypes_proto3_static", "alltypes_proto3_static.options"])
|
|
|
|
|
|
|
|
|
|
# And also a callback version
|
|
|
|
|
env.Command("alltypes_callback.proto", "#alltypes/alltypes.proto",
|
|
|
|
|
lambda target, source, env: set_pkgname(source[0], target[0], 'alltypes_callback'))
|
|
|
|
|
env.NanopbProto(["alltypes_callback", "alltypes_callback.options"])
|
2020-01-02 12:42:00 +02:00
|
|
|
|
2014-12-26 17:34:45 +02:00
|
|
|
fuzz = malloc_env.Program(["fuzztest.c",
|
2020-01-13 10:59:08 +02:00
|
|
|
"random_data.c",
|
|
|
|
|
"validation.c",
|
2020-01-13 12:15:21 +02:00
|
|
|
"flakystream.c",
|
2014-09-06 19:01:11 +03:00
|
|
|
"alltypes_pointer.pb.c",
|
|
|
|
|
"alltypes_static.pb.c",
|
2020-01-13 13:01:08 +02:00
|
|
|
"alltypes_callback.pb.c",
|
2020-01-02 12:42:00 +02:00
|
|
|
"alltypes_proto3_pointer.pb.c",
|
|
|
|
|
"alltypes_proto3_static.pb.c",
|
2014-12-26 17:34:45 +02:00
|
|
|
"$COMMON/pb_encode_with_malloc.o",
|
|
|
|
|
"$COMMON/pb_decode_with_malloc.o",
|
|
|
|
|
"$COMMON/pb_common_with_malloc.o",
|
2014-12-26 17:08:17 +02:00
|
|
|
"$COMMON/malloc_wrappers.o"])
|
2014-09-06 19:01:11 +03:00
|
|
|
|
2019-12-15 18:05:04 +02:00
|
|
|
seed = int(time.time())
|
2019-12-15 18:53:11 +02:00
|
|
|
|
|
|
|
|
if env.get('EMBEDDED'):
|
|
|
|
|
iterations = 100
|
|
|
|
|
else:
|
|
|
|
|
iterations = 10000
|
|
|
|
|
env.RunTest(fuzz, ARGS = [str(seed), str(iterations)])
|
2014-09-06 19:01:11 +03:00
|
|
|
|
2015-10-05 15:36:24 +03:00
|
|
|
generate_message = malloc_env.Program(["generate_message.c",
|
2020-01-13 10:59:08 +02:00
|
|
|
"random_data.c",
|
2015-10-05 15:36:24 +03:00
|
|
|
"alltypes_static.pb.c",
|
|
|
|
|
"$COMMON/pb_encode.o",
|
2020-01-13 10:59:08 +02:00
|
|
|
"$COMMON/pb_common.o",
|
|
|
|
|
"$COMMON/malloc_wrappers.o"])
|
2014-09-06 19:01:11 +03:00
|
|
|
|