Loading...
tests/net/bpf_setup_null_buf.c xnu-12377.121.6 /dev/null
--- xnu/xnu-12377.121.6/tests/net/bpf_setup_null_buf.c
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * Copyright (c) 2026 Apple Inc. All rights reserved.
- *
- * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
- *
- * This file contains Original Code and/or Modifications of Original Code
- * as defined in and that are subject to the Apple Public Source License
- * Version 2.0 (the 'License'). You may not use this file except in
- * compliance with the License. The rights granted to you under the License
- * may not be used to create, or enable the creation or redistribution of,
- * unlawful or unlicensed copies of an Apple operating system, or to
- * circumvent, violate, or enable the circumvention or violation of, any
- * terms of an Apple operating system software license agreement.
- *
- * Please obtain a copy of the License at
- * http://www.opensource.apple.com/apsl/ and read it before using this file.
- *
- * The Original Code and all software distributed under the License are
- * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
- * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
- * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
- * Please see the License for the specific language governing rights and
- * limitations under the License.
- *
- * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
- */
-
-/*
- * Test case for bpf_setup() NULL buffer panic.
- *
- * bpf_setup() copies buffers from d_from to d_to but doesn't verify
- * that d_from has buffers allocated. If d_from has BPF_COMP_REQ set
- * but was never attached to an interface (BIOCSETIF never called),
- * its bd_prev_sbuf is NULL. The code copies BPF_COMP_REQ to d_to,
- * allocates bd_prev_sbuf for d_to, then tries to memcpy from
- * d_from's NULL bd_prev_sbuf — triggering a bounds-safety trap.
- *
- * Steps:
- *   1. Open BPF device d_from, enable header compression (sets BPF_COMP_REQ)
- *      but do NOT call BIOCSETIF — buffers stay NULL
- *   2. Get d_from's UUID via BIOCGETUUID
- *   3. Open BPF device d_to
- *   4. Call BIOCSETUP on d_to with d_from's UUID and a valid interface name
- *   -> on an unpatched kernel, panics in bpf_setup() at the memcpy
- *   -> on a patched kernel, BIOCSETUP returns an error
- */
-
-#include <darwintest.h>
-#include <sys/types.h>
-#include <sys/ioctl.h>
-#include <net/bpf.h>
-#include <net/if.h>
-#include <uuid/uuid.h>
-#include <fcntl.h>
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-
-T_GLOBAL_META(
-	T_META_NAMESPACE("xnu.net"),
-	T_META_RADAR_COMPONENT_NAME("xnu"),
-	T_META_RADAR_COMPONENT_VERSION("networking"),
-	T_META_ASROOT(true)
-	);
-
-
-static int
-open_bpf(void)
-{
-	char path[32];
-
-	for (int i = 0; i < 256; i++) {
-		snprintf(path, sizeof(path), "/dev/bpf%d", i);
-		int fd = open(path, O_RDWR);
-		if (fd >= 0) {
-			return fd;
-		}
-	}
-	return -1;
-}
-
-T_DECL(bpf_setup_null_buf,
-    "test bpf_setup with unattached d_from having BPF_COMP_REQ set",
-    T_META_CHECK_LEAKS(false))
-{
-	/*
-	 * Step 1: Open d_from and enable header compression.
-	 * Do NOT call BIOCSETIF — buffers remain unallocated.
-	 */
-	int fd_from = open_bpf();
-	T_ASSERT_POSIX_SUCCESS(fd_from, "open BPF device for d_from");
-
-	int comp = 1;
-	T_ASSERT_POSIX_SUCCESS(ioctl(fd_from, BIOCSHDRCOMP, &comp),
-	    "BIOCSHDRCOMP on d_from (set BPF_COMP_REQ)");
-
-	/*
-	 * Step 2: Get d_from's UUID.
-	 */
-	uuid_t uuid;
-	T_ASSERT_POSIX_SUCCESS(ioctl(fd_from, BIOCGETUUID, &uuid),
-	    "BIOCGETUUID on d_from");
-
-	uuid_string_t uuid_str;
-	uuid_unparse(uuid, uuid_str);
-	T_LOG("d_from UUID: %s", uuid_str);
-
-	/*
-	 * Step 3: Open d_to.
-	 */
-	int fd_to = open_bpf();
-	T_ASSERT_POSIX_SUCCESS(fd_to, "open BPF device for d_to");
-
-	/*
-	 * Step 4: Call BIOCSETUP on d_to with d_from's UUID.
-	 * On an unpatched kernel this panics in bpf_setup() because d_from
-	 * has no buffers allocated but has BPF_COMP_REQ set.
-	 * On a patched kernel this should return an error.
-	 */
-	struct bpf_setup_args bsa;
-	memset(&bsa, 0, sizeof(bsa));
-	uuid_copy(bsa.bsa_uuid, uuid);
-	strlcpy(bsa.bsa_ifname, "lo0", sizeof(bsa.bsa_ifname));
-
-	T_LOG("Calling BIOCSETUP (would panic an unpatched kernel)...");
-	int ret = ioctl(fd_to, BIOCSETUP, &bsa);
-	T_EXPECT_POSIX_FAILURE(ret, ENOENT,
-	    "BIOCSETUP should fail when d_from has no buffers");
-
-	close(fd_from);
-	close(fd_to);
-
-	T_PASS("bpf_setup_null_buf completed without panic");
-}