From: Bhargava Shastry <[email protected]> It appears that ossfuzz specific test harnesses and configuration files were carried over to the ovn repo from the ovs repo without justification. This patch removes them until there is a need to continuously fuzz ovn code as the ovs code is currently fuzzed.
Signed-off-by: Bhargava Shastry <[email protected]> --- tests/automake.mk | 2 - tests/oss-fuzz/automake.mk | 66 --- tests/oss-fuzz/config/expr.dict | 120 ----- .../oss-fuzz/config/expr_parse_target.options | 3 - .../config/flow_extract_target.options | 3 - .../config/json_parser_target.options | 2 - tests/oss-fuzz/config/miniflow_target.options | 3 - tests/oss-fuzz/config/odp.dict | 170 ------- tests/oss-fuzz/config/odp_target.options | 3 - .../config/ofctl_parse_target.options | 3 - tests/oss-fuzz/config/ofp-flow.dict | 45 -- .../oss-fuzz/config/ofp_print_target.options | 3 - tests/oss-fuzz/config/ovs.dict | 293 ----------- tests/oss-fuzz/expr_parse_target.c | 464 ------------------ tests/oss-fuzz/flow_extract_target.c | 100 ---- tests/oss-fuzz/fuzzer.h | 9 - tests/oss-fuzz/json_parser_target.c | 42 -- tests/oss-fuzz/miniflow_target.c | 365 -------------- tests/oss-fuzz/odp_target.c | 149 ------ tests/oss-fuzz/ofctl_parse_target.c | 113 ----- tests/oss-fuzz/ofp_print_target.c | 47 -- 21 files changed, 2005 deletions(-) delete mode 100644 tests/oss-fuzz/automake.mk delete mode 100644 tests/oss-fuzz/config/expr.dict delete mode 100644 tests/oss-fuzz/config/expr_parse_target.options delete mode 100644 tests/oss-fuzz/config/flow_extract_target.options delete mode 100644 tests/oss-fuzz/config/json_parser_target.options delete mode 100644 tests/oss-fuzz/config/miniflow_target.options delete mode 100644 tests/oss-fuzz/config/odp.dict delete mode 100644 tests/oss-fuzz/config/odp_target.options delete mode 100644 tests/oss-fuzz/config/ofctl_parse_target.options delete mode 100644 tests/oss-fuzz/config/ofp-flow.dict delete mode 100644 tests/oss-fuzz/config/ofp_print_target.options delete mode 100644 tests/oss-fuzz/config/ovs.dict delete mode 100644 tests/oss-fuzz/expr_parse_target.c delete mode 100644 tests/oss-fuzz/flow_extract_target.c delete mode 100644 tests/oss-fuzz/fuzzer.h delete mode 100644 tests/oss-fuzz/json_parser_target.c delete mode 100644 tests/oss-fuzz/miniflow_target.c delete mode 100644 tests/oss-fuzz/odp_target.c delete mode 100644 tests/oss-fuzz/ofctl_parse_target.c delete mode 100644 tests/oss-fuzz/ofp_print_target.c diff --git a/tests/automake.mk b/tests/automake.mk index 013e59280..e86a5273e 100644 --- a/tests/automake.mk +++ b/tests/automake.mk @@ -246,5 +246,3 @@ clean-pki: rm -f tests/pki/stamp rm -rf tests/pki endif - -include tests/oss-fuzz/automake.mk diff --git a/tests/oss-fuzz/automake.mk b/tests/oss-fuzz/automake.mk deleted file mode 100644 index 5bf7d0d7c..000000000 --- a/tests/oss-fuzz/automake.mk +++ /dev/null @@ -1,66 +0,0 @@ -OSS_FUZZ_TARGETS = \ - tests/oss-fuzz/flow_extract_target \ - tests/oss-fuzz/json_parser_target \ - tests/oss-fuzz/ofp_print_target \ - tests/oss-fuzz/expr_parse_target \ - tests/oss-fuzz/odp_target \ - tests/oss-fuzz/miniflow_target \ - tests/oss-fuzz/ofctl_parse_target -EXTRA_PROGRAMS += $(OSS_FUZZ_TARGETS) -oss-fuzz-targets: $(OSS_FUZZ_TARGETS) - -tests_oss_fuzz_flow_extract_target_SOURCES = \ - tests/oss-fuzz/flow_extract_target.c \ - tests/oss-fuzz/fuzzer.h -tests_oss_fuzz_flow_extract_target_LDADD = lib/libopenvswitch.la -tests_oss_fuzz_flow_extract_target_LDFLAGS = $(LIB_FUZZING_ENGINE) -lc++ - -tests_oss_fuzz_json_parser_target_SOURCES = \ - tests/oss-fuzz/json_parser_target.c \ - tests/oss-fuzz/fuzzer.h -tests_oss_fuzz_json_parser_target_LDADD = lib/libopenvswitch.la -tests_oss_fuzz_json_parser_target_LDFLAGS = $(LIB_FUZZING_ENGINE) -lc++ - -tests_oss_fuzz_ofp_print_target_SOURCES = \ - tests/oss-fuzz/ofp_print_target.c \ - tests/oss-fuzz/fuzzer.h -tests_oss_fuzz_ofp_print_target_LDADD = lib/libopenvswitch.la -tests_oss_fuzz_ofp_print_target_LDFLAGS = $(LIB_FUZZING_ENGINE) -lc++ - -tests_oss_fuzz_expr_parse_target_SOURCES = \ - tests/oss-fuzz/expr_parse_target.c \ - tests/oss-fuzz/fuzzer.h -tests_oss_fuzz_expr_parse_target_LDADD = lib/libopenvswitch.la \ - ovn/lib/libovn.la -tests_oss_fuzz_expr_parse_target_LDFLAGS = $(LIB_FUZZING_ENGINE) -lc++ - -tests_oss_fuzz_odp_target_SOURCES = \ - tests/oss-fuzz/odp_target.c \ - tests/oss-fuzz/fuzzer.h -tests_oss_fuzz_odp_target_LDADD = lib/libopenvswitch.la -tests_oss_fuzz_odp_target_LDFLAGS = $(LIB_FUZZING_ENGINE) -lc++ - -tests_oss_fuzz_miniflow_target_SOURCES = \ - tests/oss-fuzz/miniflow_target.c \ - tests/oss-fuzz/fuzzer.h -tests_oss_fuzz_miniflow_target_LDADD = lib/libopenvswitch.la -tests_oss_fuzz_miniflow_target_LDFLAGS = $(LIB_FUZZING_ENGINE) -lc++ - -tests_oss_fuzz_ofctl_parse_target_SOURCES = \ - tests/oss-fuzz/ofctl_parse_target.c \ - tests/oss-fuzz/fuzzer.h -tests_oss_fuzz_ofctl_parse_target_LDADD = lib/libopenvswitch.la -tests_oss_fuzz_ofctl_parse_target_LDFLAGS = $(LIB_FUZZING_ENGINE) -lc++ - -EXTRA_DIST += \ - tests/oss-fuzz/config/flow_extract_target.options \ - tests/oss-fuzz/config/json_parser_target.options \ - tests/oss-fuzz/config/ofp_print_target.options \ - tests/oss-fuzz/config/expr_parse_target.options \ - tests/oss-fuzz/config/odp_target.options \ - tests/oss-fuzz/config/miniflow_target.options \ - tests/oss-fuzz/config/ofctl_parse_target.options \ - tests/oss-fuzz/config/ovs.dict \ - tests/oss-fuzz/config/expr.dict \ - tests/oss-fuzz/config/odp.dict \ - tests/oss-fuzz/config/ofp-flow.dict diff --git a/tests/oss-fuzz/config/expr.dict b/tests/oss-fuzz/config/expr.dict deleted file mode 100644 index 03741ad7d..000000000 --- a/tests/oss-fuzz/config/expr.dict +++ /dev/null @@ -1,120 +0,0 @@ -" = " -" = (" -" = dns_lookup();" -" { " -" };" -"!" -"!=" -"$" -"&&" -"(" -"()" -")" -"),commit,table=,zone=NXM_NX_REG)" -");" -", " -", meter=\"\"" -"," -",bucket=bucket_id=,weight:100,actions=ct(nat(dst=" -"--" -".." -"/" -"/%" -"0" -":" -"<" -"<->" -"<=" -"=" -"==" -"=r" -">" -">=" -"[" -"\x00" -"\x28" -"]" -"]:" -"allow" -"arp" -"bool" -"bswap " -"bswap %0" -"cc" -"clone" -"ct_clear" -"ct_clear;" -"ct_commit" -"ct_commit(" -"ct_dnat" -"ct_label" -"ct_label=" -"ct_lb" -"ct_mark" -"ct_mark=" -"ct_mark=%#x" -"ct_next" -"ct_next;" -"ct_snat" -"decimal" -"dhcpv6_stateful" -"dhcpv6_stateless" -"dns_lookup" -"drop" -"drop;" -"egress" -"error(" -"get_arp" -"get_nd" -"hexadecimal" -"icmp4" -"icmp6" -"ingress" -"ip.ttl" -"ip.ttl--;" -"ipv4" -"ipv6" -"log" -"log(" -"mac" -"meter" -"name" -"name=\"\", " -"nd_na" -"nd_na_router" -"nd_ns" -"next" -"next();" -"next(pipeline=, table=);" -"next;" -"output" -"output;" -"pipeline" -"put_arp" -"put_dhcp_opts" -"put_dhcpv6_opts" -"put_nd" -"put_nd_ra_opts" -"reject" -"set_meter" -"set_meter();" -"set_meter(, );" -"set_meter(,);" -"set_queue" -"set_queue();" -"severity" -"severity=" -"slaac" -"static_routes" -"str" -"table" -"tcp_reset" -"type=select,selection_method=dp_hash" -"uint16" -"uint32" -"uint8" -"verdict" -"verdict=, " -"{" -"||" -"}" diff --git a/tests/oss-fuzz/config/expr_parse_target.options b/tests/oss-fuzz/config/expr_parse_target.options deleted file mode 100644 index fc254e84f..000000000 --- a/tests/oss-fuzz/config/expr_parse_target.options +++ /dev/null @@ -1,3 +0,0 @@ -[libfuzzer] -dict = expr.dict -close_fd_mask = 3 diff --git a/tests/oss-fuzz/config/flow_extract_target.options b/tests/oss-fuzz/config/flow_extract_target.options deleted file mode 100644 index 81ad7f18c..000000000 --- a/tests/oss-fuzz/config/flow_extract_target.options +++ /dev/null @@ -1,3 +0,0 @@ -[libfuzzer] -dict = ovs.dict -close_fd_mask = 3 diff --git a/tests/oss-fuzz/config/json_parser_target.options b/tests/oss-fuzz/config/json_parser_target.options deleted file mode 100644 index 8d3739a53..000000000 --- a/tests/oss-fuzz/config/json_parser_target.options +++ /dev/null @@ -1,2 +0,0 @@ -[libfuzzer] -dict = json.dict diff --git a/tests/oss-fuzz/config/miniflow_target.options b/tests/oss-fuzz/config/miniflow_target.options deleted file mode 100644 index 4849f282d..000000000 --- a/tests/oss-fuzz/config/miniflow_target.options +++ /dev/null @@ -1,3 +0,0 @@ -[libfuzzer] -dict = ovs.dict -close_fd_mask = 3 \ No newline at end of file diff --git a/tests/oss-fuzz/config/odp.dict b/tests/oss-fuzz/config/odp.dict deleted file mode 100644 index a9bdd3e99..000000000 --- a/tests/oss-fuzz/config/odp.dict +++ /dev/null @@ -1,170 +0,0 @@ -"(" -")" -"," -"/0x" -"0x" -": " -"=" -"=r" -"action" -"arp" -"bfd" -"bos" -"c1" -"c2" -"c3" -"c4" -"cc" -"cfi" -"cfm" -"class" -"clone" -"code" -"commit," -"crit," -"csum" -"ct" -"ct(error)" -"ct_clear" -"ct_label" -"ct_mark" -"ct_state" -"ct_tuple4" -"ct_tuple6" -"ct_zone" -"dir" -"dl_type" -"dnat" -"dp_hash" -"drop" -"dst" -"dst_port" -"egress" -"encap" -"error" -"erspan" -"erspan(ver=1,sid=0x,dir=,idx=0x)" -"est" -"eth" -"eth_type" -"eth_type(0/)" -"first" -"flags" -"force_commit," -"frag" -"gbp(" -"geneve" -"gre((flags=0x,proto=0x)" -"hash," -"helper" -"hlimit" -"hwid" -"icmp" -"icmpv6" -"id" -"idx=" -"in_port" -"ingress" -"inv" -"ip6erspan" -"ipfix(output_port=" -"ipv4" -"ipv6" -"ipv6_dst" -"ipv6_src" -"l4()" -"label" -"lacp" -"later" -"len" -"lldp" -"mark=/," -"match" -"md2" -"mdtype" -"meter()" -"mpls" -"nat" -"nd" -"new" -"no" -"np" -"ns" -"nsh" -"oam," -"op" -"options(" -"out_port(" -"packet_type" -"pcp=" -"persistent," -"pop_eth" -"pop_mpls(eth_type=0x)" -"pop_nsh()" -"pop_vlan" -"proto" -"push_eth(src=:::::,dst=:::::,type=)" -"push_mpls(" -"push_nsh(" -"push_vlan(" -"push_vlan(tpid=,vid=,pcp=,cfi=)" -"random," -"recirc()" -"recirc_id" -"rel" -"rpl" -"sFlow(vid=,pcp=,output=)" -"sample" -"sctp" -"seq=0x" -"set(" -"set(nsh(" -"sha" -"si" -"sip" -"skb_mark" -"skb_priority" -"sll" -"slow_path" -"snat" -"spi" -"src" -"src_port" -"stp" -"sym_l4()" -"target" -"tc=" -"tclass" -"tcp" -"tcp_flags" -"tha" -"tip" -"tll" -"tnl_pop(" -"tnl_push(tnl_port(" -"too_little" -"too_much" -"tos" -"tp_dst" -"tp_src" -"tpid=0x" -"trk" -"trunc()" -"ttl" -"tun_id" -"tunnel" -"tunnel_out_port" -"type" -"udp" -"unspec" -"userdata" -"userspace(" -"userspace(error)" -"userspace(pid" -"ver" -"vid" -"vlan" -"vxlan" -"vxlan(flags=0x,vni=0x)" -"vxlan(gbp(" -"zone" diff --git a/tests/oss-fuzz/config/odp_target.options b/tests/oss-fuzz/config/odp_target.options deleted file mode 100644 index 41821b8c1..000000000 --- a/tests/oss-fuzz/config/odp_target.options +++ /dev/null @@ -1,3 +0,0 @@ -[libfuzzer] -close_fd_mask = 3 -dict = odp.dict diff --git a/tests/oss-fuzz/config/ofctl_parse_target.options b/tests/oss-fuzz/config/ofctl_parse_target.options deleted file mode 100644 index 6d67dd6ad..000000000 --- a/tests/oss-fuzz/config/ofctl_parse_target.options +++ /dev/null @@ -1,3 +0,0 @@ -[libfuzzer] -close_fd_mask = 3 -dict = ofp-flow.dict diff --git a/tests/oss-fuzz/config/ofp-flow.dict b/tests/oss-fuzz/config/ofp-flow.dict deleted file mode 100644 index 01175e5eb..000000000 --- a/tests/oss-fuzz/config/ofp-flow.dict +++ /dev/null @@ -1,45 +0,0 @@ -")" -"(" -"[" -"]" -"," -"-" -"0" -":" -"=" -"ADD" -"DEL" -"DEL_STRICT" -"MOD" -"MOD_STRICT" -"\x00" -"\x20" -"\x3F" -"actions" -"add" -"allow_hidden_fields" -"cc" -"check_overlap" -"cookie" -"delete" -"delete_strict" -"duration" -"eth" -"hard_age" -"hard_timeout" -"idle_age" -"idle_timeout" -"importance" -"modify" -"modify_strict" -"n_bytes" -"n_packets" -"no_byte_counts" -"no_packet_counts" -"no_readonly_table" -"out_group" -"out_port" -"priority" -"reset_counts" -"send_flow_rem" -"table" diff --git a/tests/oss-fuzz/config/ofp_print_target.options b/tests/oss-fuzz/config/ofp_print_target.options deleted file mode 100644 index 7f117292e..000000000 --- a/tests/oss-fuzz/config/ofp_print_target.options +++ /dev/null @@ -1,3 +0,0 @@ -[libfuzzer] -close_fd_mask = 3 -dict = ovs.dict diff --git a/tests/oss-fuzz/config/ovs.dict b/tests/oss-fuzz/config/ovs.dict deleted file mode 100644 index 243b243ab..000000000 --- a/tests/oss-fuzz/config/ovs.dict +++ /dev/null @@ -1,293 +0,0 @@ -"0.2" -"ADD_SUBSCRIBE" -"-cbc" -"CLEARSUB" -"CLIENT" -"GIMME" -"GIMMEDEFS" -"GIMMESTATS" -"HM" -"-hmac96" -"HM_CTL" -"HM_STAT" -"HMST_CLIENT" -"LOGIN" -"\\MAILSLOT\\BROWSE" -"NET-ANNOUNCED" -"NET-VISIBLE" -"-nodefs" -"NONE" -"OPSTAFF" -"\\PIPE\\LANMAN" -"public" -"REALM" -"REALM-ANNOUNCED" -"REALM-VISIBLE" -"REQ_SUBSCRIBE" -"RLM_SUBSCRIBE" -"RLM_UNSUBSCRIBE" -"SENT" -" %ssub%s" -"SUBSCRIBE" -"SUBSCRIBE_NODEFS" -"un" -"UNSUBSCRIBE" -"USER_FLUSH" -"USER_HIDE" -"USER_LOCATE" -"USER_UNHIDE" -"WG_CTL" -"\x01\x00" -"\x01\x00\x00" -"\x01\x00\x01" -"\x01\x00\x02" -"\x01\x00\x03" -"\x01\x00\x05" -"\x01\x01" -"\x01\x02" -"\x01\x03" -"\x01\x04" -"\x01\x05" -"\x01\x07" -"\x01\x0B" -"\x01\x0C" -"\x01\x10" -"\x01\x11" -"\x01\x12" -"\x01\x13" -"\x01\x14" -"\x01\x15" -"\x01\x16" -"\x01\xE8\x48" -"\x01\xF4" -"\x01\xF5" -"\x01\xF6" -"\x01\xF7" -"\x01\xF8" -"\x01\xF9" -"\x01\xFA" -"\x01\xFB" -"\x01\xFC" -"\x01\xFD" -"\x01\xFE" -"\x01\xFF" -"\x02\x00" -"\x02\x00\x00" -"\x02\x01" -"\x02\x02" -"\x02\x03" -"\x02\x04" -"\x02\x05" -"\x02\x06" -"\x02\x07" -"\x02\x08" -"\x02\x09" -"\x02\x0C" -"\x02\x0E" -"\x02\x0F" -"\x02\x11" -"\x02\x12" -"\x02\x58" -"\x02\x81" -"\x02\x83" -"\x03\x00" -"\x03\x01" -"\x03\x02" -"\x03\x03" -"\x03\x06" -"\x03\xE8" -"\x03\xE9" -"\x03\xEA" -"\x03\xEB" -"\x03\xEC" -"\x03\xED" -"\x03\xEE" -"\x03\xEF" -"\x03\xF0" -"\x03\xF1" -"\x03\xF2" -"\x03\xF3" -"\x03\xF4" -"\x03\xFF\xFF\xFF" -"\x04\x00" -"\x04\x00\x00" -"\x04\x01" -"\x04\x02" -"\x04\x03" -"\x04\x04" -"\x04\x51" -"\x04\x52" -"\x04\x53" -"\x04\x55" -"\x04\x56" -"\x05\x00" -"\x05\x01" -"\x05\x02" -"\x05\x03" -"\x05\x53" -"\x05\xCC" -"\x05\xDC" -"\x06\x00" -"\x06\x01" -"\x06\xCF" -"\x07\x07" -"\x07\xC1" -"\x07\xFF" -"\x08\x00" -"\x08\x00\x00\x00" -"\x08\x00\x07" -"\x08\x01" -"\x08\x06" -"\x08\x38\x00\x00" -"\x0A\x00\xB1" -"\x0C\x01" -"\x0C\x02" -"\x0C\x03" -"\x0C\x04" -"\x0C\x05" -"\x0C\x06" -"\x0C\x08" -"\x0D\x80" -"\x0E\x00" -"\x0E\x10" -"\x0E\xC8" -"\x0E\xC9" -"\x0F\x42\x40" -"\x0F\xFF" -"\x10\x00" -"\x11\x11" -"\x11\xD7" -"\x12\x0F" -"\x12\xBB" -"\x1A\x30" -"\x1A\x31" -"\x1A\x32" -"\x1B\x21" -"\x1B\x58" -"\x1B\x59" -"\x1B\x5A" -"\x1B\x5B" -"\x1B\x5C" -"\x1B\x5D" -"\x1B\x5F" -"\x1B\x61" -"\x1F\x00" -"\x1F\x40" -"\x1F\xFF" -"\x1F\xFF\xFF" -"\x20\x00" -"\x20\x03" -"\x20\x04" -"\x27\x10" -"\x27\x13" -"\x2F\xBF" -"\x35\x00\x00" -"\x3C\x13" -"\x40\x00" -"\x40\x04" -"\x40\x80" -"\x47\x00\x06\x01" -"\x4E\x20" -"\x4E\x21" -"\x4E\x22" -"\x4E\x23" -"\x4E\x24" -"\x4E\x25" -"\x4E\x26" -"\x4E\x27" -"\x4E\x28" -"\x4E\x29" -"\x4E\x2A" -"\x4E\x2C" -"\x60\x00" -"\x60\x01" -"\x60\x02" -"\x60\x03" -"\x60\x04" -"\x60\x07" -"\x7F\xFF" -"\x7F\xFF\xFF" -"\x80\x00" -"\x80\x00\x00\x00" -"\x80\x01" -"\x80\x05" -"\x80\x0A" -"\x80\x21" -"\x80\x21\x10\x01" -"\x80\x21\x10\x02" -"\x80\x23" -"\x80\x35" -"\x80\x57" -"\x80\x9B" -"\x80\xC2" -"\x80\xF3" -"\x80\xFD" -"\x81\x00" -"\x81\x37" -"\x82\x81" -"\x83\xAA\x7E\x80" -"\x85\xBE" -"\x86\xDD" -"\x88\x08" -"\x88\x09" -"\x88\x0B" -"\x88\x47" -"\x88\x48" -"\x88\x63" -"\x88\x64" -"\x88\x6F" -"\x88\x70" -"\x88\x8E" -"\x88\x99" -"\x88\xA2" -"\x88\xA8" -"\x88\xCA" -"\x88\xCC" -"\x89\x02" -"\x89\x3A" -"\x89\x47" -"\x90\x00" -"\x91\x00" -"\xA0\x00" -"\xAB\xCD" -"\xB0\x00" -"\xC0\x00\x00\x00" -"\xC0\x21" -"\xC0\x23" -"\xC0\x25" -"\xC0\x27" -"\xC0\x2B" -"\xC0\x2D" -"\xC1\x23" -"\xC2\x23" -"\xC2\x27" -"\xDA\xDA" -"\xE0\x00" -"\xE0\x00\x00\x00" -"\xF0\x00\x00\x00" -"\xF1\x0A" -"\xF9\x89" -"\xFC\x00" -"\xFD\xE9" -"\xFE\xFE" -"\xFF\x00" -"\xFF\x00\x00" -"\xFF\x00\x00\x00" -"\xFF\xF0" -"\xFF\xF8" -"\xFF\xFD" -"\xFF\xFE" -"\xFF\xFF" -"\xFF\xFF\x00\x00" -"\xFF\xFF\xF0\x00" -"\xFF\xFF\xFF\x00" -"\xFF\xFF\xFF\x01" -"\xFF\xFF\xFF\x02" -"\xFF\xFF\xFF\x03" -"\xFF\xFF\xFF\xEF" -"\xFF\xFF\xFF\xFD" -"\xFF\xFF\xFF\xFE" -"\xFF\xFF\xFF\xFF" -"ZEPH" -"ZEPHYR_ADMIN" -"ZEPHYR_CTL" diff --git a/tests/oss-fuzz/expr_parse_target.c b/tests/oss-fuzz/expr_parse_target.c deleted file mode 100644 index 1a3893858..000000000 --- a/tests/oss-fuzz/expr_parse_target.c +++ /dev/null @@ -1,464 +0,0 @@ -#include <config.h> -#include "fuzzer.h" -#include <errno.h> -#include <getopt.h> -#include <sys/wait.h> - -#include "command-line.h" -#include "dp-packet.h" -#include "fatal-signal.h" -#include "flow.h" -#include "openvswitch/dynamic-string.h" -#include "openvswitch/match.h" -#include "openvswitch/ofp-actions.h" -#include "openvswitch/ofpbuf.h" -#include "openvswitch/vlog.h" -#include "ovn/actions.h" -#include "ovn/expr.h" -#include "ovn/lex.h" -#include "ovn/lib/logical-fields.h" -#include "ovn/lib/ovn-l7.h" -#include "ovn/lib/extend-table.h" -#include "openvswitch/shash.h" -#include "simap.h" -#include "util.h" - -static void -compare_token(const struct lex_token *a, const struct lex_token *b) -{ - if (a->type != b->type) { - fprintf(stderr, "type differs: %d -> %d\n", a->type, b->type); - return; - } - - if (!((a->s && b->s && !strcmp(a->s, b->s)) - || (!a->s && !b->s))) { - fprintf(stderr, "string differs: %s -> %s\n", - a->s ? a->s : "(null)", - b->s ? b->s : "(null)"); - return; - } - - if (a->type == LEX_T_INTEGER || a->type == LEX_T_MASKED_INTEGER) { - if (memcmp(&a->value, &b->value, sizeof a->value)) { - fprintf(stderr, "value differs\n"); - return; - } - - if (a->type == LEX_T_MASKED_INTEGER - && memcmp(&a->mask, &b->mask, sizeof a->mask)) { - fprintf(stderr, "mask differs\n"); - return; - } - - if (a->format != b->format - && !(a->format == LEX_F_HEXADECIMAL - && b->format == LEX_F_DECIMAL - && a->value.integer == 0)) { - fprintf(stderr, "format differs: %d -> %d\n", - a->format, b->format); - } - } -} - -static void -test_lex(const char *input) -{ - struct ds output; - - ds_init(&output); - struct lexer lexer; - - lexer_init(&lexer, input); - ds_clear(&output); - while (lexer_get(&lexer) != LEX_T_END) { - size_t len = output.length; - lex_token_format(&lexer.token, &output); - - /* Check that the formatted version can really be parsed back - * losslessly. */ - if (lexer.token.type != LEX_T_ERROR) { - const char *s = ds_cstr(&output) + len; - struct lexer l2; - - lexer_init(&l2, s); - lexer_get(&l2); - compare_token(&lexer.token, &l2.token); - lexer_destroy(&l2); - } - ds_put_char(&output, ' '); - } - lexer_destroy(&lexer); - - ds_chomp(&output, ' '); - puts(ds_cstr(&output)); - ds_destroy(&output); -} - -static void -create_symtab(struct shash *symtab) -{ - ovn_init_symtab(symtab); - - /* For negative testing. */ - expr_symtab_add_field(symtab, "bad_prereq", MFF_XREG0, "xyzzy", false); - expr_symtab_add_field(symtab, "self_recurse", MFF_XREG0, - "self_recurse != 0", false); - expr_symtab_add_field(symtab, "mutual_recurse_1", MFF_XREG0, - "mutual_recurse_2 != 0", false); - expr_symtab_add_field(symtab, "mutual_recurse_2", MFF_XREG0, - "mutual_recurse_1 != 0", false); - expr_symtab_add_string(symtab, "big_string", MFF_XREG0, NULL); -} - -static void -create_gen_opts(struct hmap *dhcp_opts, struct hmap *dhcpv6_opts, - struct hmap *nd_ra_opts) -{ - hmap_init(dhcp_opts); - dhcp_opt_add(dhcp_opts, "offerip", 0, "ipv4"); - dhcp_opt_add(dhcp_opts, "netmask", 1, "ipv4"); - dhcp_opt_add(dhcp_opts, "router", 3, "ipv4"); - dhcp_opt_add(dhcp_opts, "dns_server", 6, "ipv4"); - dhcp_opt_add(dhcp_opts, "log_server", 7, "ipv4"); - dhcp_opt_add(dhcp_opts, "lpr_server", 9, "ipv4"); - dhcp_opt_add(dhcp_opts, "domain", 15, "str"); - dhcp_opt_add(dhcp_opts, "swap_server", 16, "ipv4"); - dhcp_opt_add(dhcp_opts, "policy_filter", 21, "ipv4"); - dhcp_opt_add(dhcp_opts, "router_solicitation", 32, "ipv4"); - dhcp_opt_add(dhcp_opts, "nis_server", 41, "ipv4"); - dhcp_opt_add(dhcp_opts, "ntp_server", 42, "ipv4"); - dhcp_opt_add(dhcp_opts, "server_id", 54, "ipv4"); - dhcp_opt_add(dhcp_opts, "tftp_server", 66, "ipv4"); - dhcp_opt_add(dhcp_opts, "classless_static_route", 121, "static_routes"); - dhcp_opt_add(dhcp_opts, "ip_forward_enable", 19, "bool"); - dhcp_opt_add(dhcp_opts, "router_discovery", 31, "bool"); - dhcp_opt_add(dhcp_opts, "ethernet_encap", 36, "bool"); - dhcp_opt_add(dhcp_opts, "default_ttl", 23, "uint8"); - dhcp_opt_add(dhcp_opts, "tcp_ttl", 37, "uint8"); - dhcp_opt_add(dhcp_opts, "mtu", 26, "uint16"); - dhcp_opt_add(dhcp_opts, "lease_time", 51, "uint32"); - dhcp_opt_add(dhcp_opts, "wpad", 252, "str"); - - /* DHCPv6 options. */ - hmap_init(dhcpv6_opts); - dhcp_opt_add(dhcpv6_opts, "server_id", 2, "mac"); - dhcp_opt_add(dhcpv6_opts, "ia_addr", 5, "ipv6"); - dhcp_opt_add(dhcpv6_opts, "dns_server", 23, "ipv6"); - dhcp_opt_add(dhcpv6_opts, "domain_search", 24, "str"); - - /* IPv6 ND RA options. */ - hmap_init(nd_ra_opts); - nd_ra_opts_init(nd_ra_opts); -} - -static void -create_addr_sets(struct shash *addr_sets) -{ - shash_init(addr_sets); - - static const char *const addrs1[] = { - "10.0.0.1", "10.0.0.2", "10.0.0.3", - }; - static const char *const addrs2[] = { - "::1", "::2", "::3", - }; - static const char *const addrs3[] = { - "00:00:00:00:00:01", "00:00:00:00:00:02", "00:00:00:00:00:03", - }; - static const char *const addrs4[] = { NULL }; - - expr_const_sets_add(addr_sets, "set1", addrs1, 3, true); - expr_const_sets_add(addr_sets, "set2", addrs2, 3, true); - expr_const_sets_add(addr_sets, "set3", addrs3, 3, true); - expr_const_sets_add(addr_sets, "set4", addrs4, 0, true); -} - -static void -create_port_groups(struct shash *port_groups) -{ - shash_init(port_groups); - - static const char *const pg1[] = { - "lsp1", "lsp2", "lsp3", - }; - static const char *const pg2[] = { NULL }; - - expr_const_sets_add(port_groups, "pg1", pg1, 3, false); - expr_const_sets_add(port_groups, "pg_empty", pg2, 0, false); -} - -static bool -lookup_port_cb(const void *ports_, const char *port_name, unsigned int *portp) -{ - const struct simap *ports = ports_; - const struct simap_node *node = simap_find(ports, port_name); - if (!node) { - return false; - } - *portp = node->data; - return true; -} - -static bool -is_chassis_resident_cb(const void *ports_, const char *port_name) -{ - const struct simap *ports = ports_; - const struct simap_node *node = simap_find(ports, port_name); - if (node) { - return true; - } - return false; -} - -static void -test_parse_actions(const char *input) -{ - struct shash symtab; - struct hmap dhcp_opts; - struct hmap dhcpv6_opts; - struct hmap nd_ra_opts; - struct simap ports; - - create_symtab(&symtab); - create_gen_opts(&dhcp_opts, &dhcpv6_opts, &nd_ra_opts); - - /* Initialize group ids. */ - struct ovn_extend_table group_table; - ovn_extend_table_init(&group_table); - - /* Initialize meter ids for QoS. */ - struct ovn_extend_table meter_table; - ovn_extend_table_init(&meter_table); - - simap_init(&ports); - simap_put(&ports, "eth0", 5); - simap_put(&ports, "eth1", 6); - simap_put(&ports, "LOCAL", ofp_to_u16(OFPP_LOCAL)); - - struct ofpbuf ovnacts; - struct expr *prereqs; - char *error; - - puts(input); - - ofpbuf_init(&ovnacts, 0); - - const struct ovnact_parse_params pp = { - .symtab = &symtab, - .dhcp_opts = &dhcp_opts, - .dhcpv6_opts = &dhcpv6_opts, - .nd_ra_opts = &nd_ra_opts, - .n_tables = 24, - .cur_ltable = 10, - }; - error = ovnacts_parse_string(input, &pp, &ovnacts, &prereqs); - if (!error) { - /* Convert the parsed representation back to a string and print it, - * if it's different from the input. */ - struct ds ovnacts_s = DS_EMPTY_INITIALIZER; - ovnacts_format(ovnacts.data, ovnacts.size, &ovnacts_s); - if (strcmp(input, ds_cstr(&ovnacts_s))) { - printf(" formats as %s\n", ds_cstr(&ovnacts_s)); - } - - /* Encode the actions into OpenFlow and print. */ - const struct ovnact_encode_params ep = { - .lookup_port = lookup_port_cb, - .aux = &ports, - .is_switch = true, - .group_table = &group_table, - .meter_table = &meter_table, - - .pipeline = OVNACT_P_INGRESS, - .ingress_ptable = 8, - .egress_ptable = 40, - .output_ptable = 64, - .mac_bind_ptable = 65, - }; - struct ofpbuf ofpacts; - ofpbuf_init(&ofpacts, 0); - ovnacts_encode(ovnacts.data, ovnacts.size, &ep, &ofpacts); - struct ds ofpacts_s = DS_EMPTY_INITIALIZER; - struct ofpact_format_params fp = { .s = &ofpacts_s }; - ofpacts_format(ofpacts.data, ofpacts.size, &fp); - printf(" encodes as %s\n", ds_cstr(&ofpacts_s)); - ds_destroy(&ofpacts_s); - ofpbuf_uninit(&ofpacts); - - /* Print prerequisites if any. */ - if (prereqs) { - struct ds prereqs_s = DS_EMPTY_INITIALIZER; - expr_format(prereqs, &prereqs_s); - printf(" has prereqs %s\n", ds_cstr(&prereqs_s)); - ds_destroy(&prereqs_s); - } - - /* Now re-parse and re-format the string to verify that it's - * round-trippable. */ - struct ofpbuf ovnacts2; - struct expr *prereqs2; - ofpbuf_init(&ovnacts2, 0); - error = ovnacts_parse_string(ds_cstr(&ovnacts_s), &pp, &ovnacts2, - &prereqs2); - if (!error) { - struct ds ovnacts2_s = DS_EMPTY_INITIALIZER; - ovnacts_format(ovnacts2.data, ovnacts2.size, &ovnacts2_s); - if (strcmp(ds_cstr(&ovnacts_s), ds_cstr(&ovnacts2_s))) { - printf(" bad reformat: %s\n", ds_cstr(&ovnacts2_s)); - } - ds_destroy(&ovnacts2_s); - } else { - printf(" reparse error: %s\n", error); - free(error); - } - expr_destroy(prereqs2); - - ovnacts_free(ovnacts2.data, ovnacts2.size); - ofpbuf_uninit(&ovnacts2); - ds_destroy(&ovnacts_s); - } else { - printf(" %s\n", error); - free(error); - } - - expr_destroy(prereqs); - ovnacts_free(ovnacts.data, ovnacts.size); - ofpbuf_uninit(&ovnacts); - - simap_destroy(&ports); - expr_symtab_destroy(&symtab); - shash_destroy(&symtab); - dhcp_opts_destroy(&dhcp_opts); - dhcp_opts_destroy(&dhcpv6_opts); - nd_ra_opts_destroy(&nd_ra_opts); - ovn_extend_table_destroy(&group_table); - ovn_extend_table_destroy(&meter_table); -} - -static void -test_parse_expr(const char *input) -{ - struct shash symtab; - struct shash addr_sets; - struct shash port_groups; - struct simap ports; - struct expr *expr; - char *error; - - create_symtab(&symtab); - create_addr_sets(&addr_sets); - create_port_groups(&port_groups); - - simap_init(&ports); - simap_put(&ports, "eth0", 5); - simap_put(&ports, "eth1", 6); - simap_put(&ports, "LOCAL", ofp_to_u16(OFPP_LOCAL)); - simap_put(&ports, "lsp1", 0x11); - simap_put(&ports, "lsp2", 0x12); - simap_put(&ports, "lsp3", 0x13); - - expr = expr_parse_string(input, &symtab, &addr_sets, - &port_groups, &error); - if (!error) { - expr = expr_annotate(expr, &symtab, &error); - } - if (!error) { - expr = expr_simplify(expr, is_chassis_resident_cb, &ports); - expr = expr_normalize(expr); - ovs_assert(expr_is_normalized(expr)); - } - if (!error) { - struct hmap matches; - - expr_to_matches(expr, lookup_port_cb, &ports, &matches); - expr_matches_print(&matches, stdout); - expr_matches_destroy(&matches); - } else { - puts(error); - free(error); - } - expr_destroy(expr); - simap_destroy(&ports); - expr_symtab_destroy(&symtab); - shash_destroy(&symtab); - expr_const_sets_destroy(&addr_sets); - shash_destroy(&addr_sets); - expr_const_sets_destroy(&port_groups); - shash_destroy(&port_groups); -} - -static bool -lookup_atoi_cb(const void *aux OVS_UNUSED, const char *port_name, - unsigned int *portp) -{ - *portp = atoi(port_name); - return true; -} - -static void -test_expr_to_packets(const char *input) -{ - struct shash symtab; - create_symtab(&symtab); - - struct flow uflow; - char *error = expr_parse_microflow(input, &symtab, NULL, NULL, - lookup_atoi_cb, NULL, &uflow); - if (error) { - puts(error); - free(error); - expr_symtab_destroy(&symtab); - shash_destroy(&symtab); - return; - } - - uint64_t packet_stub[128 / 8]; - struct dp_packet packet; - dp_packet_use_stub(&packet, packet_stub, sizeof packet_stub); - flow_compose(&packet, &uflow, NULL, 64); - - struct ds output = DS_EMPTY_INITIALIZER; - const uint8_t *buf = dp_packet_data(&packet); - for (int i = 0; i < dp_packet_size(&packet); i++) { - uint8_t val = buf[i]; - ds_put_format(&output, "%02"PRIx8, val); - } - puts(ds_cstr(&output)); - ds_destroy(&output); - dp_packet_uninit(&packet); - expr_symtab_destroy(&symtab); - shash_destroy(&symtab); -} - -int -LLVMFuzzerTestOneInput(const uint8_t *input_, size_t size) -{ - /* Bail out if we cannot construct at least a 1 char string. */ - const char *input = (const char *) input_; - if (size < 2 || input[size - 1] != '\0' || strchr(input, '\n') || - strlen(input) != size - 1) { - return 0; - } - - /* Disable logging to avoid write to disk. */ - static bool isInit = false; - if (!isInit) { - vlog_set_verbosity("off"); - isInit = true; - } - - /* Parse, annotate, simplify, normalize expr and convert to flows. */ - test_parse_expr(input); - - /* Parse actions. */ - test_parse_actions(input); - - /* Test OVN lexer. */ - test_lex(input); - - /* Expr to packets. */ - test_expr_to_packets(input); - - return 0; -} diff --git a/tests/oss-fuzz/flow_extract_target.c b/tests/oss-fuzz/flow_extract_target.c deleted file mode 100644 index 4a7451411..000000000 --- a/tests/oss-fuzz/flow_extract_target.c +++ /dev/null @@ -1,100 +0,0 @@ -#include <config.h> -#include "classifier.h" -#include <assert.h> -#include "fuzzer.h" -#include "dp-packet.h" -#include "flow.h" -#include "openvswitch/ofp-match.h" -#include "openvswitch/ofp-print.h" -#include "openvswitch/match.h" -#include "classifier-private.h" - -static void -test_flow_hash(const struct flow *flow) -{ - uint32_t hash = flow_hash_5tuple(flow, 0); - hash = flow_hash_symmetric_l4(flow, 0); - hash = flow_hash_symmetric_l2(flow, 0); - hash = flow_hash_symmetric_l3l4(flow, 0, NULL); - hash = flow_hash_symmetric_l3(flow, 0); - hash = flow_hash_fields(flow, NX_HASH_FIELDS_ETH_SRC, hash); - hash = flow_hash_fields(flow, NX_HASH_FIELDS_SYMMETRIC_L4, hash); - hash = flow_hash_fields(flow, NX_HASH_FIELDS_SYMMETRIC_L3L4, hash); - hash = flow_hash_fields(flow, NX_HASH_FIELDS_SYMMETRIC_L3L4_UDP, hash); - hash = flow_hash_fields(flow, NX_HASH_FIELDS_NW_SRC, hash); - hash = flow_hash_fields(flow, NX_HASH_FIELDS_NW_DST, hash); - hash = flow_hash_fields(flow, NX_HASH_FIELDS_SYMMETRIC_L3, hash); - ignore(hash); -} - -static void -test_flow_mask(const struct flow *flow) -{ - struct flow_wildcards catchall; - - flow_wildcards_init_catchall(&catchall); - flow_mask_hash_fields(flow, &catchall, NX_HASH_FIELDS_ETH_SRC); - flow_mask_hash_fields(flow, &catchall, NX_HASH_FIELDS_SYMMETRIC_L4); - flow_mask_hash_fields(flow, &catchall, NX_HASH_FIELDS_SYMMETRIC_L3L4); - flow_mask_hash_fields(flow, &catchall, NX_HASH_FIELDS_SYMMETRIC_L3L4_UDP); - flow_mask_hash_fields(flow, &catchall, NX_HASH_FIELDS_NW_SRC); - flow_mask_hash_fields(flow, &catchall, NX_HASH_FIELDS_NW_DST); - flow_mask_hash_fields(flow, &catchall, NX_HASH_FIELDS_SYMMETRIC_L3); -} - -int -LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) -{ - struct dp_packet packet; - struct flow flow; - dp_packet_use_const(&packet, data, size); - flow_extract(&packet, &flow); - - /* Extract flowmap. */ - struct flowmap fmap; - flow_wc_map(&flow, &fmap); - - /* Parse TCP flags. */ - if (dp_packet_size(&packet) >= ETH_HEADER_LEN) { - uint16_t tcp_flags = parse_tcp_flags(&packet); - ignore(tcp_flags); - } - - /* Parse TCP flags. */ - if (dp_packet_size(&packet) >= ETH_HEADER_LEN) { - uint16_t tcp_flags = parse_tcp_flags(&packet); - ignore(tcp_flags); - } - - /* Count headers. */ - int count = flow_count_vlan_headers(&flow); - ignore(count); - - /* Extract metadata. */ - struct match flow_metadata; - flow_get_metadata(&flow, &flow_metadata); - - /* Hashing functions. */ - test_flow_hash(&flow); - - /* Masking functions. */ - test_flow_mask(&flow); - - /* Convert flow to match. */ - struct match match; - match_wc_init(&match, &flow); - - struct ofp10_match ext_match; - ofputil_match_to_ofp10_match(&match, &ext_match); - - /* Print match and packet. */ - ofp_print_packet(stdout, dp_packet_data(&packet), dp_packet_size(&packet), - htonl(PT_ETH)); - ovs_hex_dump(stdout, dp_packet_data(&packet), dp_packet_size(&packet), 0, - true); - match_print(&match, NULL); - - ovs_hex_dump(stdout, &ext_match, sizeof ext_match, 0, false); - - return 0; -} diff --git a/tests/oss-fuzz/fuzzer.h b/tests/oss-fuzz/fuzzer.h deleted file mode 100644 index f87ae59e9..000000000 --- a/tests/oss-fuzz/fuzzer.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef FUZZER_H -#define FUZZER_H 1 - -#include <stdint.h> -#include <stddef.h> - -int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size); - -#endif /* fuzzer.h */ diff --git a/tests/oss-fuzz/json_parser_target.c b/tests/oss-fuzz/json_parser_target.c deleted file mode 100644 index e39e04a0d..000000000 --- a/tests/oss-fuzz/json_parser_target.c +++ /dev/null @@ -1,42 +0,0 @@ -#include <config.h> -#include "fuzzer.h" -#include "jsonrpc.h" -#include "openvswitch/json.h" -#include "ovsdb-error.h" -#include "ovsdb/table.h" -#include <assert.h> -#include <string.h> - -int -LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) -{ - if (!size || data[size - 1]) { - return 0; - } - - struct json *j1 = json_from_string((const char *)data); - if (j1->type == JSON_STRING) { - json_destroy(j1); - return 0; - } - - free(json_to_string(j1, JSSF_SORT | JSSF_PRETTY)); - - struct jsonrpc_msg *msg; - char *error = jsonrpc_msg_from_json(j1, &msg); /* Frees 'j1'. */ - if (error) { - free(error); - return 0; - } - - struct json *j2 = jsonrpc_msg_to_json(msg); /* Frees 'msg'. */ - if (j2->type == JSON_STRING) { - json_destroy(j2); - return 0; - } - - free(json_to_string(j2, JSSF_SORT | JSSF_PRETTY)); - json_destroy(j2); - - return 0; -} diff --git a/tests/oss-fuzz/miniflow_target.c b/tests/oss-fuzz/miniflow_target.c deleted file mode 100644 index 800375d63..000000000 --- a/tests/oss-fuzz/miniflow_target.c +++ /dev/null @@ -1,365 +0,0 @@ -#include <config.h> -#include "classifier.h" -#include "fuzzer.h" -#include "dp-packet.h" -#include "flow.h" -#include "openvswitch/ofp-match.h" -#include "openvswitch/ofp-print.h" -#include "openvswitch/match.h" -#include "classifier-private.h" -#include "util.h" - -static void -shuffle_u32s(uint32_t *p, size_t n) -{ - for (; n > 1; n--, p++) { - uint32_t *q = &p[random_range(n)]; - uint32_t tmp = *p; - *p = *q; - *q = tmp; - } -} - -/* Returns a copy of 'src'. The caller must eventually free the returned - * miniflow with free(). */ -static struct miniflow * -miniflow_clone__(const struct miniflow *src) -{ - struct miniflow *dst; - size_t data_size; - - data_size = miniflow_alloc(&dst, 1, src); - miniflow_clone(dst, src, data_size / sizeof(uint64_t)); - return dst; -} - -/* Returns a hash value for 'flow', given 'basis'. */ -static inline uint32_t -miniflow_hash__(const struct miniflow *flow, uint32_t basis) -{ - const uint64_t *p = miniflow_get_values(flow); - size_t n_values = miniflow_n_values(flow); - struct flowmap hash_map = FLOWMAP_EMPTY_INITIALIZER; - uint32_t hash = basis; - size_t idx; - - FLOWMAP_FOR_EACH_INDEX (idx, flow->map) { - uint64_t value = *p++; - - if (value) { - hash = hash_add64(hash, value); - flowmap_set(&hash_map, idx, 1); - } - } - map_t map; - FLOWMAP_FOR_EACH_MAP (map, hash_map) { - hash = hash_add64(hash, map); - } - - return hash_finish(hash, n_values); -} - -static uint32_t -random_value(void) -{ - static const uint32_t values_[] = - { 0xffffffff, 0xaaaaaaaa, 0x55555555, 0x80000000, - 0x00000001, 0xface0000, 0x00d00d1e, 0xdeadbeef }; - - return values_[random_range(ARRAY_SIZE(values_))]; -} - -static bool -choose(unsigned int n, unsigned int *idxp) -{ - if (*idxp < n) { - return true; - } else { - *idxp -= n; - return false; - } -} - -#define FLOW_U32S (FLOW_U64S * 2) - -static bool -init_consecutive_values(int n_consecutive, struct flow *flow, - unsigned int *idxp) -{ - uint32_t *flow_u32 = (uint32_t *) flow; - - if (choose(FLOW_U32S - n_consecutive + 1, idxp)) { - int i; - - for (i = 0; i < n_consecutive; i++) { - flow_u32[i + *idxp] = random_value(); - } - return true; - } else { - return false; - } -} - -static bool -next_random_flow(struct flow *flow, unsigned int idx) -{ - uint32_t *flow_u32 = (uint32_t *) flow; - - memset(flow, 0, sizeof *flow); - - /* Empty flow. */ - if (choose(1, &idx)) { - return true; - } - - /* All flows with a small number of consecutive nonzero values. */ - for (int i = 1; i <= 4; i++) { - if (init_consecutive_values(i, flow, &idx)) { - return true; - } - } - - /* All flows with a large number of consecutive nonzero values. */ - for (int i = FLOW_U32S - 4; i <= FLOW_U32S; i++) { - if (init_consecutive_values(i, flow, &idx)) { - return true; - } - } - - /* All flows with exactly two nonconsecutive nonzero values. */ - if (choose((FLOW_U32S - 1) * (FLOW_U32S - 2) / 2, &idx)) { - int ofs1; - - for (ofs1 = 0; ofs1 < FLOW_U32S - 2; ofs1++) { - int ofs2; - - for (ofs2 = ofs1 + 2; ofs2 < FLOW_U32S; ofs2++) { - if (choose(1, &idx)) { - flow_u32[ofs1] = random_value(); - flow_u32[ofs2] = random_value(); - return true; - } - } - } - OVS_NOT_REACHED(); - } - - /* 16 randomly chosen flows with N >= 3 nonzero values. */ - if (choose(16 * (FLOW_U32S - 4), &idx)) { - int n = idx / 16 + 3; - - for (int i = 0; i < n; i++) { - flow_u32[i] = random_value(); - } - shuffle_u32s(flow_u32, FLOW_U32S); - - return true; - } - - return false; -} - -static void -any_random_flow(struct flow *flow) -{ - static unsigned int max; - if (!max) { - while (next_random_flow(flow, max)) { - max++; - } - } - - next_random_flow(flow, random_range(max)); -} - -static void -toggle_masked_flow_bits(struct flow *flow, const struct flow_wildcards *mask) -{ - const uint32_t *mask_u32 = (const uint32_t *) &mask->masks; - uint32_t *flow_u32 = (uint32_t *) flow; - int i; - - for (i = 0; i < FLOW_U32S; i++) { - if (mask_u32[i] != 0) { - uint32_t bit; - - do { - bit = 1u << random_range(32); - } while (!(bit & mask_u32[i])); - flow_u32[i] ^= bit; - } - } -} - -static void -wildcard_extra_bits(struct flow_wildcards *mask) -{ - uint32_t *mask_u32 = (uint32_t *) &mask->masks; - int i; - - for (i = 0; i < FLOW_U32S; i++) { - if (mask_u32[i] != 0) { - uint32_t bit; - - do { - bit = 1u << random_range(32); - } while (!(bit & mask_u32[i])); - mask_u32[i] &= ~bit; - } - } -} - -static void -test_miniflow(struct flow *flow) -{ - struct miniflow *miniflow, *miniflow2, *miniflow3; - struct flow flow2, flow3; - struct flow_wildcards mask; - struct minimask *minimask; - int i; - - const uint64_t *flow_u64 = (const uint64_t *) flow; - - /* Convert flow to miniflow. */ - miniflow = miniflow_create(flow); - - /* Obtain miniflow hash. */ - uint32_t hash = miniflow_hash_5tuple(miniflow, 0); - ignore(hash); - - /* Check that the flow equals its miniflow. */ - for (i = 0; i < FLOW_MAX_VLAN_HEADERS; i++) { - ovs_assert(miniflow_get_vid(miniflow, i) == - vlan_tci_to_vid(flow->vlans[i].tci)); - } - for (i = 0; i < FLOW_U64S; i++) { - ovs_assert(miniflow_get(miniflow, i) == flow_u64[i]); - } - - /* Check that the miniflow equals itself. */ - ovs_assert(miniflow_equal(miniflow, miniflow)); - - /* Convert miniflow back to flow and verify that it's the same. */ - miniflow_expand(miniflow, &flow2); - ovs_assert(flow_equal(flow, &flow2)); - /* Check that copying a miniflow works properly. */ - miniflow2 = miniflow_clone__(miniflow); - ovs_assert(miniflow_equal(miniflow, miniflow2)); - ovs_assert(miniflow_hash__(miniflow, 0) == miniflow_hash__(miniflow2, 0)); - miniflow_expand(miniflow2, &flow3); - ovs_assert(flow_equal(flow, &flow3)); - - /* Check that masked matches work as expected for identical flows and - * miniflows. */ - do { - next_random_flow(&mask.masks, 1); - } while (flow_wildcards_is_catchall(&mask)); - minimask = minimask_create(&mask); - ovs_assert(minimask_is_catchall(minimask) - == flow_wildcards_is_catchall(&mask)); - ovs_assert(miniflow_equal_in_minimask(miniflow, miniflow2, minimask)); - ovs_assert(miniflow_equal_flow_in_minimask(miniflow, &flow2, minimask)); - ovs_assert(miniflow_hash_in_minimask(miniflow, minimask, 0x12345678) == - flow_hash_in_minimask(flow, minimask, 0x12345678)); - ovs_assert(minimask_hash(minimask, 0) == - miniflow_hash__(&minimask->masks, 0)); - - /* Check that masked matches work as expected for differing flows and - * miniflows. */ - toggle_masked_flow_bits(&flow2, &mask); - ovs_assert(!miniflow_equal_flow_in_minimask(miniflow, &flow2, minimask)); - miniflow3 = miniflow_create(&flow2); - ovs_assert(!miniflow_equal_in_minimask(miniflow, miniflow3, minimask)); - - free(miniflow); - free(miniflow2); - free(miniflow3); - free(minimask); -} - -static void -test_minimask_has_extra(struct flow *flow) -{ - struct flow_wildcards catchall; - struct minimask *minicatchall; - - flow_wildcards_init_catchall(&catchall); - minicatchall = minimask_create(&catchall); - ovs_assert(minimask_is_catchall(minicatchall)); - - struct flow_wildcards mask; - struct minimask *minimask; - - mask.masks = *flow; - minimask = minimask_create(&mask); - ovs_assert(!minimask_has_extra(minimask, minimask)); - ovs_assert(minimask_has_extra(minicatchall, minimask) - == !minimask_is_catchall(minimask)); - if (!minimask_is_catchall(minimask)) { - struct minimask *minimask2; - - wildcard_extra_bits(&mask); - minimask2 = minimask_create(&mask); - ovs_assert(minimask_has_extra(minimask2, minimask)); - ovs_assert(!minimask_has_extra(minimask, minimask2)); - free(minimask2); - } - - free(minimask); - free(minicatchall); -} - -static void -test_minimask_combine(struct flow *flow) -{ - struct flow_wildcards catchall; - struct minimask *minicatchall; - - flow_wildcards_init_catchall(&catchall); - minicatchall = minimask_create(&catchall); - ovs_assert(minimask_is_catchall(minicatchall)); - - struct minimask *minimask, *minimask2; - struct flow_wildcards mask, mask2, combined, combined2; - struct { - struct minimask minicombined; - uint64_t storage[FLOW_U64S]; - } m; - struct flow flow2; - - mask.masks = *flow; - minimask = minimask_create(&mask); - - minimask_combine(&m.minicombined, minimask, minicatchall, m.storage); - ovs_assert(minimask_is_catchall(&m.minicombined)); - - any_random_flow(&flow2); - mask2.masks = flow2; - minimask2 = minimask_create(&mask2); - - minimask_combine(&m.minicombined, minimask, minimask2, m.storage); - flow_wildcards_and(&combined, &mask, &mask2); - minimask_expand(&m.minicombined, &combined2); - ovs_assert(flow_wildcards_equal(&combined, &combined2)); - - free(minimask); - free(minimask2); - - free(minicatchall); -} - -int -LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) -{ - struct dp_packet packet; - struct flow flow; - dp_packet_use_const(&packet, data, size); - flow_extract(&packet, &flow); - - /* Do miniflow tests. */ - test_miniflow(&flow); - test_minimask_has_extra(&flow); - test_minimask_combine(&flow); - - return 0; -} diff --git a/tests/oss-fuzz/odp_target.c b/tests/oss-fuzz/odp_target.c deleted file mode 100644 index ae61cdca3..000000000 --- a/tests/oss-fuzz/odp_target.c +++ /dev/null @@ -1,149 +0,0 @@ -#include <config.h> -#include "fuzzer.h" -#undef NDEBUG -#include "odp-util.h" -#include <stdio.h> -#include "openvswitch/dynamic-string.h" -#include "flow.h" -#include "openvswitch/match.h" -#include "openvswitch/ofpbuf.h" -#include "util.h" -#include "openvswitch/ofp-flow.h" -#include "openvswitch/vlog.h" - -static int -parse_keys(bool wc_keys, const char *in) -{ - int exit_code = 0; - - enum odp_key_fitness fitness; - struct ofpbuf odp_key; - struct ofpbuf odp_mask; - struct flow flow; - struct ds out; - int error; - - /* Convert string to OVS DP key. */ - ofpbuf_init(&odp_key, 0); - ofpbuf_init(&odp_mask, 0); - error = odp_flow_from_string(in, NULL, - &odp_key, &odp_mask, NULL); - if (error) { - printf("odp_flow_from_string: error\n"); - goto next; - } - - if (!wc_keys) { - struct odp_flow_key_parms odp_parms = { - .flow = &flow, - .support = { - .recirc = true, - .ct_state = true, - .ct_zone = true, - .ct_mark = true, - .ct_label = true, - .max_vlan_headers = SIZE_MAX, - }, - }; - - /* Convert odp_key to flow. */ - fitness = odp_flow_key_to_flow(odp_key.data, odp_key.size, - &flow, NULL); - switch (fitness) { - case ODP_FIT_PERFECT: - break; - - case ODP_FIT_TOO_LITTLE: - printf("ODP_FIT_TOO_LITTLE: "); - break; - - case ODP_FIT_TOO_MUCH: - printf("ODP_FIT_TOO_MUCH: "); - break; - - case ODP_FIT_ERROR: - printf("odp_flow_key_to_flow: error\n"); - goto next; - } - /* Convert cls_rule back to odp_key. */ - ofpbuf_uninit(&odp_key); - ofpbuf_init(&odp_key, 0); - odp_flow_key_from_flow(&odp_parms, &odp_key); - - if (odp_key.size > ODPUTIL_FLOW_KEY_BYTES) { - printf ("too long: %"PRIu32" > %d\n", - odp_key.size, ODPUTIL_FLOW_KEY_BYTES); - exit_code = 1; - } - } - - /* Convert odp_key to string. */ - ds_init(&out); - if (wc_keys) { - odp_flow_format(odp_key.data, odp_key.size, - odp_mask.data, odp_mask.size, NULL, &out, false); - } else { - odp_flow_key_format(odp_key.data, odp_key.size, &out); - } - puts(ds_cstr(&out)); - ds_destroy(&out); - -next: - ofpbuf_uninit(&odp_key); - ofpbuf_uninit(&odp_mask); - - return exit_code; -} - -static int -parse_actions(const char *in) -{ - struct ofpbuf odp_actions; - struct ds out; - int error; - - /* Convert string to OVS DP actions. */ - ofpbuf_init(&odp_actions, 0); - error = odp_actions_from_string(in, NULL, &odp_actions); - if (error) { - printf("odp_actions_from_string: error\n"); - goto next; - } - - /* Convert odp_actions back to string. */ - ds_init(&out); - format_odp_actions(&out, odp_actions.data, odp_actions.size, NULL); - puts(ds_cstr(&out)); - ds_destroy(&out); - -next: - ofpbuf_uninit(&odp_actions); - return 0; -} - -int -LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) -{ - /* Bail out if we cannot construct at least a 1 char string. */ - const char *input = (const char *) data; - if (size < 2 || input[size - 1] != '\0' || strchr(input, '\n') || - strlen(input) != size - 1) { - return 0; - } - - /* Disable logging to avoid write to disk. */ - static bool isInit = false; - if (!isInit) { - vlog_set_verbosity("off"); - isInit = true; - } - - /* Parse keys and wc keys. */ - parse_keys(false, input); - parse_keys(true, input); - - /* Parse actions. */ - parse_actions(input); - - return 0; -} diff --git a/tests/oss-fuzz/ofctl_parse_target.c b/tests/oss-fuzz/ofctl_parse_target.c deleted file mode 100644 index b4db52f7e..000000000 --- a/tests/oss-fuzz/ofctl_parse_target.c +++ /dev/null @@ -1,113 +0,0 @@ -#include <config.h> -#include "fuzzer.h" -#include "openvswitch/ofp-flow.h" -#include "ofp-version-opt.h" -#include "ofproto/ofproto.h" -#include "openflow/openflow.h" -#include "openvswitch/ofpbuf.h" -#include "openvswitch/vlog.h" -#include "util.h" - -static void -ofctl_parse_flows__(struct ofputil_flow_mod *fms, size_t n_fms, - enum ofputil_protocol usable_protocols) -{ - enum ofputil_protocol protocol = 0; - char *usable_s; - size_t i; - - usable_s = ofputil_protocols_to_string(usable_protocols); - printf("usable protocols: %s\n", usable_s); - free(usable_s); - - if (!(usable_protocols & OFPUTIL_P_ANY)) { - printf("no usable protocol\n"); - goto free; - } - for (i = 0; i < sizeof(enum ofputil_protocol) * CHAR_BIT; i++) { - protocol = 1u << i; - if (protocol & usable_protocols & OFPUTIL_P_ANY) { - break; - } - } - ovs_assert(is_pow2(protocol)); - - printf("chosen protocol: %s\n", ofputil_protocol_to_string(protocol)); - - for (i = 0; i < n_fms; i++) { - struct ofputil_flow_mod *fm = &fms[i]; - struct ofpbuf *msg; - - msg = ofputil_encode_flow_mod(fm, protocol); - ofpbuf_delete(msg); - } - -free: - for (i = 0; i < n_fms; i++) { - struct ofputil_flow_mod *fm = &fms[i]; - free(CONST_CAST(struct ofpact *, fm->ofpacts)); - minimatch_destroy(&fm->match); - } -} - -/* "parse-flow FLOW": parses the argument as a flow (like add-flow) and prints - * it back to stdout. */ -static void -ofctl_parse_flow(const char *input, int command) -{ - enum ofputil_protocol usable_protocols; - struct ofputil_flow_mod fm; - char *error; - - error = parse_ofp_flow_mod_str(&fm, input, NULL, NULL, - command, &usable_protocols); - if (error) { - printf("Error encountered: %s\n", error); - free(error); - } else { - ofctl_parse_flows__(&fm, 1, usable_protocols); - } -} - -int -LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) -{ - /* Bail out if we cannot construct at least a 1 char string. - * Reserve 1 byte to decide flow mod command. - * - * Here's the structure of data we expect - * |--Byte 1--|--Byte 2--|...|--Byte (size-1)--| - * - * where, - * - * Byte 1: Used to decide which ofp flow mod command to test - * Bytes 2--(size-1): The C string that is actually passed to - * ofctl_parse_flow() test API. - * - * This means that the fuzzed input is actually a C string of - * length = (size -2) with the terminal byte being the NUL - * character. Moreover, this string is expected to not contain - * a new-line character. - */ - const char *stream = (const char *) data; - if (size < 3 || stream[size - 1] != '\0' || strchr(&stream[1], '\n') || - strlen(&stream[1]) != size - 2) { - return 0; - } - - /* Disable logging to avoid write to disk. */ - static bool isInit = false; - if (!isInit) { - vlog_set_verbosity("off"); - isInit = true; - } - - /* Decide test parameters using first byte of fuzzed input. */ - int command = (stream[0] % OFPFC_DELETE_STRICT) + 1; - - /* Fuzz extended match parsing. */ - const char *input = &stream[1]; - ofctl_parse_flow(input, command); - - return 0; -} diff --git a/tests/oss-fuzz/ofp_print_target.c b/tests/oss-fuzz/ofp_print_target.c deleted file mode 100644 index 126f2623f..000000000 --- a/tests/oss-fuzz/ofp_print_target.c +++ /dev/null @@ -1,47 +0,0 @@ -#include <config.h> -#include "fuzzer.h" -#include "dp-packet.h" -#include "openvswitch/ofp-print.h" -#include "openvswitch/ofpbuf.h" -#include "openvswitch/vlog.h" - -int -LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) -{ - if (size < sizeof(struct ofp_header)) { - return 0; - } - - static bool isInit = false; - if (!isInit) { - vlog_set_verbosity("off"); - isInit = true; - } - - struct ofpbuf b; - ofpbuf_use_const(&b, data, size); - for (;;) { - /* Check if ofpbuf contains ofp header. */ - struct ofp_header *oh = ofpbuf_at(&b, 0, sizeof *oh); - if (!oh) { - break; - } - - /* Check if length is geq than lower bound. */ - size_t length = ntohs(oh->length); - if (length < sizeof *oh) { - break; - } - - /* Check if ofpbuf contains payload. */ - size_t tail_len = length - sizeof *oh; - void *tail = ofpbuf_at(&b, sizeof *oh, tail_len); - if (!tail) { - break; - } - - ofp_print(stdout, ofpbuf_pull(&b, length), length, NULL, NULL, 2); - } - ofpbuf_uninit(&b); - return 0; -} -- 2.17.1 _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
