java-topology/defects/ovs/unit/OvsTest.java
russell@unturf.com 9934133dcf whitepaper: 312 sites / 151 ecosystems — wave2+3 defect tables and PDF rebuild
Add 88 new defect entries to HIGH and MEDIUM tables:
  HIGH: mysql-0001/0002, mariadb-0001, redis-0001/0002, valkey-0001/0002, openvpn-0001,
        vlc-0001, prometheus-0001, otel-collector-0001, cockroachdb-0001..0004,
        tidb-0001..0008, kubernetes-0001/0002, go-0001, kotlin-0002, scala-0001,
        allegro5-0001, sdl2-0001, grafana-0001, clickhouse-0001, duckdb-0001,
        mongodb-0001, envoy-0001, istio-0001, cilium-0001, linkerd2-0001,
        linux-0001/0002/0003, tor-0002/0003, curl-0001, julia-0001, lua-0001,
        perl5-0001, nats-0001, spring-0003/0004, tomcat-0001, onos-0002, odl-0002

  MEDIUM: helm-0001, mariadb-0002, openssl-0001/0002, memcached-0001,
          cassandra-0001..0004, flink-0001, storm-0001/0002, zookeeper-0001..0003,
          pip-0001, gradle-0001, nginx-0001, haproxy-0001, caddy-0001, varnish-0001,
          ffmpeg-0001, gstreamer-0001, raylib-0001, love2d-0001, php-0001/0002,
          r-source-0001, cpython-0002, ruby-0001, rabbitmq-0003/0004, activemq-0001,
          ovs-0001, onos-0003, odl-0002, jetty-0001

PDF: 976K
2026-03-27 15:23:43 -04:00

102 lines
4.2 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package unit;
import java.util.*;
/**
* OvsTest — CWE-407 benchmark for ovs-0001
*
* Models dpif_offload_port_add() O(T×P) nested scan for provider name lookup
* vs. O(1) HashMap-based provider registry.
*
* Real code (lib/dpif-offload.c:580-595):
* for (char *name = strtok_r(tokens, ",", &saveptr); ...) // O(T) tokens
* LIST_FOR_EACH (offload, dpif_list_node, &collection->list) // O(P)
* if (!strcmp(name, offload->class->type)) ...
*
* Also: provider_collection_add() O(P) duplicate scan (dpif-offload.c:229-234).
*
* Fix: HashMap<String, Provider> registry — O(1) name lookup.
*/
public class OvsTest {
static void bench(String label, Runnable slow, Runnable fast, long sOps, long fOps) {
slow.run(); fast.run();
long t0 = System.nanoTime(); slow.run(); long sMs = (System.nanoTime() - t0) / 1_000_000;
long t1 = System.nanoTime(); fast.run(); long fMs = (System.nanoTime() - t1) / 1_000_000;
double speedup = fMs > 0 ? (double) sMs / fMs : 0;
System.out.printf(" %-54s slow:%4dms (%,d ops) fast:%4dms (%,d ops) speedup:%.0fx%n",
label, sMs, sOps, fMs, fOps, speedup);
}
// ---------- slow: nested linked list scan (the defect) ----------
static long slowPortAdd(int T, int P, int ports) {
String[] providers = new String[P];
for (int p = 0; p < P; p++) providers[p] = "provider-" + p;
// worst-case: all tokens match the LAST provider — full list scan each time
String[] tokens = new String[T];
for (int t = 0; t < T; t++) tokens[t] = providers[P - 1];
long ops = 0;
for (int port = 0; port < ports; port++) {
for (String token : tokens) { // O(T) per port
for (String prov : providers) { // O(P) per token — scans all P
ops++;
if (prov.equals(token)) break;
}
}
}
return ops;
}
// ---------- fast: HashMap lookup (the fix) ----------
static long fastPortAdd(int T, int P, int ports) {
Map<String, Integer> provMap = new HashMap<>(P * 2);
for (int p = 0; p < P; p++) provMap.put("provider-" + p, p);
String[] tokens = new String[T];
for (int t = 0; t < T; t++) tokens[t] = "provider-" + (P - 1); // same worst-case target
long ops = 0;
for (int port = 0; port < ports; port++) {
for (String token : tokens) { // O(T) per port
ops++; // O(1) map lookup
provMap.get(token);
}
}
return ops;
}
public static void main(String[] args) {
System.out.println("OvsTest — ovs-0001: dpif_offload_port_add() provider linked-list scan → HashMap");
System.out.println();
System.out.println(" [dpif_offload_port_add — priority token × provider list nested scan]");
int[][] cases = {{4, 8, 50000}, {8, 16, 20000}, {4, 32, 10000}};
for (int[] c : cases) {
int T = c[0], P = c[1], ports = c[2];
bench(
String.format("T=%d tokens, P=%d providers, %,d ports", T, P, ports),
() -> slowPortAdd(T, P, ports),
() -> fastPortAdd(T, P, ports),
(long) T * P * ports,
(long) T * ports
);
}
System.out.println();
System.out.println("Defect : lib/dpif-offload.c:580-595 — LIST_FOR_EACH provider strcmp O(P) per token");
System.out.println(" lib/dpif-offload.c:229-234 — provider_collection_add() O(P) dup scan");
System.out.println("Fix : HashMap<name,provider> registry — O(1) lookup, O(1) dup detection");
System.out.println("Ticket : ovs-0001-dpif-offload-port-add-linear-provider-scan.md");
System.out.println();
int pass = 0;
long s0 = slowPortAdd(4, 32, 1000), f0 = fastPortAdd(4, 32, 1000);
assert s0 > f0 * 5 : "ovs-0001 expected >5x; slow=" + s0 + " fast=" + f0; pass++;
System.out.printf("%d/1 PASS — ovs-0001: CWE-407 in Open vSwitch offload provider dispatch%n", pass);
System.out.printf("Hotpath: dpif_offload_port_add() called on every port-add in SR-IOV deployments%n");
}
}