tools/testing/selftests/bpf/unpriv_helpers.c

Source file repositories/reference/linux-study-clean/tools/testing/selftests/bpf/unpriv_helpers.c

File Facts

System
Linux kernel
Corpus path
tools/testing/selftests/bpf/unpriv_helpers.c
Extension
.c
Size
2800 bytes
Lines
145
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 (!gzgets(config, buf, sizeof(buf))) {
			msg = gzerror(config, &err);
			if (err == Z_ERRNO)
				perror("gzgets /proc/config.gz");
			else if (err != Z_OK)
				fprintf(stderr, "gzgets /proc/config.gz: %s", msg);
			gzclose(config);
			return -1;
		}
		n = strlen(buf);
		if (buf[n - 1] == '\n')
			buf[n - 1] = 0;
		if (strcmp(buf, pat) == 0) {
			gzclose(config);
			return 1;
		}
	}
	gzclose(config);
	return 0;
}

static bool cmdline_contains(const char *pat)
{
	char cmdline[4096], *c;
	int fd, ret = false;

	fd = open("/proc/cmdline", O_RDONLY);
	if (fd < 0) {
		perror("open /proc/cmdline");
		return false;
	}

	if (read(fd, cmdline, sizeof(cmdline) - 1) < 0) {
		perror("read /proc/cmdline");
		goto out;
	}

	cmdline[sizeof(cmdline) - 1] = '\0';
	for (c = strtok(cmdline, " \n"); c; c = strtok(NULL, " \n")) {
		if (strncmp(c, pat, strlen(c)))
			continue;
		ret = true;
		break;
	}
out:
	close(fd);
	return ret;
}

static int get_mitigations_off(void)
{
	int enabled_in_config;

	if (cmdline_contains("mitigations=off"))
		return 1;
	enabled_in_config = config_contains("CONFIG_CPU_MITIGATIONS=y");
	if (enabled_in_config < 0)
		return -1;
	return !enabled_in_config;
}

bool get_unpriv_disabled(void)
{
	int mitigations_off;
	bool disabled;
	char buf[2];
	FILE *fd;

	fd = fopen("/proc/sys/" UNPRIV_SYSCTL, "r");
	if (fd) {
		disabled = (fgets(buf, 2, fd) == buf && atoi(buf));
		fclose(fd);
	} else {
		perror("fopen /proc/sys/" UNPRIV_SYSCTL);
		disabled = true;
	}

	if (disabled)
		return true;

	/*
	 * Some unpriv tests rely on spectre mitigations being on.
	 * If mitigations are off or status can't be determined
	 * assume that unpriv tests are disabled.
	 */
	mitigations_off = get_mitigations_off();
	if (mitigations_off < 0) {
		fprintf(stderr,
			"Can't determine if mitigations are enabled, disabling unpriv tests.");
		return true;

Annotation

Implementation Notes