tools/testing/selftests/firmware/fw_namespace.c

Source file repositories/reference/linux-study-clean/tools/testing/selftests/firmware/fw_namespace.c

File Facts

System
Linux kernel
Corpus path
tools/testing/selftests/firmware/fw_namespace.c
Extension
.c
Size
3614 bytes
Lines
149
Domain
Support Tooling And Documentation
Bucket
tools
Inferred role
Support Tooling And Documentation: implementation source
Status
source implementation candidate

Why This File Exists

Repository support layer: documentation, build tooling, samples, user-space helper tools, generated initramfs support, licenses, and validation utilities.

Dependency Surface

Detected Declarations

Annotated Snippet

if (pid == -1) {
			die("waitpid failed: %s\n",
				strerror(errno));
		}
		if (pid != child) {
			die("waited for %d got %d\n",
				child, pid);
		}
		if (!WIFEXITED(status)) {
			die("child did not terminate cleanly\n");
		}
		if (block_fw_in_parent_ns)
			umount("/lib/firmware");
		return WEXITSTATUS(status) == EXIT_SUCCESS;
	}

	if (unshare(CLONE_NEWNS) != 0) {
		die("unshare(CLONE_NEWNS) failed: %s\n",
			strerror(errno));
	}
	if (mount(NULL, "/", NULL, MS_SLAVE|MS_REC, NULL) == -1)
		die("remount root in child ns failed\n");

	if (!block_fw_in_parent_ns) {
		if (mount("test", "/lib/firmware", "tmpfs", MS_RDONLY, NULL) == -1)
			die("blocking firmware in child ns failed\n");
	} else
		umount("/lib/firmware");

	trigger_fw(fw_name, sys_path);

	exit(EXIT_SUCCESS);
}

int main(int argc, char **argv)
{
	const char *fw_name = "test-firmware.bin";
	char *sys_path;
	if (argc != 2)
		die("usage: %s sys_path\n", argv[0]);

	/* Mount tmpfs to /lib/firmware so we don't have to assume
	   that it is writable for us.*/
	if (mount("test", "/lib/firmware", "tmpfs", 0, NULL) == -1)
		die("mounting tmpfs to /lib/firmware failed\n");

	sys_path = argv[1];
	if (asprintf(&fw_path, "/lib/firmware/%s", fw_name) < 0)
		die("error: failed to build full fw_path\n");

	setup_fw(fw_path);

	setvbuf(stdout, NULL, _IONBF, 0);
	/* Positive case: firmware in PID1 mount namespace */
	printf("Testing with firmware in parent namespace (assumed to be same file system as PID1)\n");
	if (!test_fw_in_ns(fw_name, sys_path, false))
		die("error: failed to access firmware\n");

	/* Negative case: firmware in child mount namespace, expected to fail */
	printf("Testing with firmware in child namespace\n");
	if (test_fw_in_ns(fw_name, sys_path, true))
		die("error: firmware access did not fail\n");

	unlink(fw_path);
	free(fw_path);
	umount("/lib/firmware");
	exit(EXIT_SUCCESS);
}

Annotation

Implementation Notes