[ovs-dev] [PATCH] Remove oss-fuzz tests carried over from ovs

Bhargava Shastry bshas3 at gmail.com
Fri Oct 18 14:48:40 UTC 2019


Just want to add that the patch is to be applied to ovn source code, I
couldn't find the ovn mailing list so sent it here. Apologies.

On Fri, Oct 18, 2019 at 11:13 AM <bshas3 at gmail.com> wrote:

> From: Bhargava Shastry <bshas3 at gmail.com>
>
> 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 <bshas3 at gmail.com>
> ---
>  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
>
>

-- 
Bhargava Shastry


More information about the dev mailing list