brintos

brintos / linux-shallow public Read only

0
0
Text · 1.9 KiB · 7fec9df Raw
95 lines · c
1// SPDX-License-Identifier: GPL-2.02 3#define _GNU_SOURCE4#include <errno.h>5#include <fcntl.h>6#include <linux/kernel.h>7#include <limits.h>8#include <stdbool.h>9#include <stdio.h>10#include <stdlib.h>11#include <string.h>12#include <syscall.h>13#include <unistd.h>14#include <sys/resource.h>15#include <linux/close_range.h>16 17#include "../kselftest_harness.h"18#include "../clone3/clone3_selftests.h"19 20TEST(unshare_EMFILE)21{22	pid_t pid;23	int status;24	struct __clone_args args = {25		.flags = CLONE_FILES,26		.exit_signal = SIGCHLD,27	};28	int fd;29	ssize_t n, n2;30	static char buf[512], buf2[512];31	struct rlimit rlimit;32	int nr_open;33 34	fd = open("/proc/sys/fs/nr_open", O_RDWR);35	ASSERT_GE(fd, 0);36 37	n = read(fd, buf, sizeof(buf));38	ASSERT_GT(n, 0);39	ASSERT_EQ(buf[n - 1], '\n');40 41	ASSERT_EQ(sscanf(buf, "%d", &nr_open), 1);42 43	ASSERT_EQ(0, getrlimit(RLIMIT_NOFILE, &rlimit));44 45	/* bump fs.nr_open */46	n2 = sprintf(buf2, "%d\n", nr_open + 1024);47	lseek(fd, 0, SEEK_SET);48	write(fd, buf2, n2);49 50	/* bump ulimit -n */51	rlimit.rlim_cur = nr_open + 1024;52	rlimit.rlim_max = nr_open + 1024;53	EXPECT_EQ(0, setrlimit(RLIMIT_NOFILE, &rlimit)) {54		lseek(fd, 0, SEEK_SET);55		write(fd, buf, n);56		exit(EXIT_FAILURE);57	}58 59	/* get a descriptor past the old fs.nr_open */60	EXPECT_GE(dup2(2, nr_open + 64), 0) {61		lseek(fd, 0, SEEK_SET);62		write(fd, buf, n);63		exit(EXIT_FAILURE);64	}65 66	/* get descriptor table shared */67	pid = sys_clone3(&args, sizeof(args));68	EXPECT_GE(pid, 0) {69		lseek(fd, 0, SEEK_SET);70		write(fd, buf, n);71		exit(EXIT_FAILURE);72	}73 74	if (pid == 0) {75		int err;76 77		/* restore fs.nr_open */78		lseek(fd, 0, SEEK_SET);79		write(fd, buf, n);80		/* ... and now unshare(CLONE_FILES) must fail with EMFILE */81		err = unshare(CLONE_FILES);82		EXPECT_EQ(err, -1)83			exit(EXIT_FAILURE);84		EXPECT_EQ(errno, EMFILE)85			exit(EXIT_FAILURE);86		exit(EXIT_SUCCESS);87	}88 89	EXPECT_EQ(waitpid(pid, &status, 0), pid);90	EXPECT_EQ(true, WIFEXITED(status));91	EXPECT_EQ(0, WEXITSTATUS(status));92}93 94TEST_HARNESS_MAIN95