12f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka/* Copyright (c) 2014 Red Hat, Inc.
22f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka *
32f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka * This program is free software: you can redistribute it and/or modify
42f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka * it under the terms of version 2 the GNU General Public License as
52f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka * published by the Free Software Foundation.
62f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka *
72f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka * This program is distributed in the hope that it will be useful,
82f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka * but WITHOUT ANY WARRANTY; without even the implied warranty of
92f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
102f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka * GNU General Public License for more details.
112f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka *
122f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka * You should have received a copy of the GNU General Public License
132f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka * along with this program.  If not, see <http://www.gnu.org/licenses/>.
142f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka ***********************************************************************
152f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka * File: mountns02.c
162f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka *
172f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka * Tests a private mount: private mount does not forward or receive
182f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka * propagation.
192f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka * Description:
202f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka * 1. Creates directories "A", "B" and files "A/A", "B/B"
212f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka * 2. Unshares mount namespace and makes it private (so mounts/umounts
222f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka *    have no effect on a real system)
232f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka * 3. Bind mounts directory "A" to "A"
242f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka * 4. Makes directory "A" private
252f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka * 5. Clones a new child process with CLONE_NEWNS flag
262f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka * 6. There are two test cases (where X is parent namespace and Y child
272f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka *    namespace):
282f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka *    1)
292f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka *	X: bind mounts "B" to "A"
302f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka *	Y: must see "A/A" and must not see "A/B"
312f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka *	X: umounts "A"
322f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka *    2)
332f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka *	Y: bind mounts "B" to "A"
342f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka *	X: must see "A/A" and must not see "A/B"
352f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka *	Y: umounts A
362f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka ***********************************************************************/
372f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka
382f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka#define _GNU_SOURCE
392f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka#include <sys/wait.h>
402f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka#include <sys/mount.h>
412f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka#include <stdio.h>
422f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka#include <errno.h>
432f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka#include "test.h"
442f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka#include "libclone.h"
452f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka#include "safe_macros.h"
462f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka#include "mountns_helper.h"
472f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka
482f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka
492f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefkachar *TCID	= "mountns02";
502f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefkaint TST_TOTAL	= 2;
512f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka
522f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka
532f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka#if defined(MS_SHARED) && defined(MS_PRIVATE) && defined(MS_REC)
542f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka
55c9ddd863ffe872e0cde48f73ddf48bb6ad18d554Xiao Yangint child_func(void *arg LTP_ATTRIBUTE_UNUSED)
562f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka{
572f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka	int ret = 0;
582f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka
599f136a48c6205362cd8d35c726491ca93cb16514Cyril Hrubis	TST_SAFE_CHECKPOINT_WAIT(NULL, 0);
602f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka
612f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka	if ((access(DIRA"/A", F_OK) != 0) || (access(DIRA"/B", F_OK) == 0))
622f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka		ret = 2;
632f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka
649f136a48c6205362cd8d35c726491ca93cb16514Cyril Hrubis	TST_SAFE_CHECKPOINT_WAKE_AND_WAIT(NULL, 0);
652f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka
662f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka	/* bind mounts DIRB to DIRA making contents of DIRB visible
672f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka	 * in DIRA */
682f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka	if (mount(DIRB, DIRA, "none", MS_BIND, NULL) == -1) {
692f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka		perror("mount");
702f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka		return 1;
712f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka	}
722f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka
739f136a48c6205362cd8d35c726491ca93cb16514Cyril Hrubis	TST_SAFE_CHECKPOINT_WAKE_AND_WAIT(NULL, 0);
742f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka
752f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka	umount(DIRA);
762f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka	return ret;
772f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka}
782f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka
792f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefkastatic void test(void)
802f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka{
812f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka	int status;
822f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka
832f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka	/* unshares the mount ns */
842f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka	if (unshare(CLONE_NEWNS) == -1)
852f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka		tst_brkm(TBROK | TERRNO, cleanup, "unshare failed");
862f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka	/* makes sure parent mounts/umounts have no effect on a real system */
872f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka	SAFE_MOUNT(cleanup, "none", "/", "none", MS_REC|MS_PRIVATE, NULL);
882f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka
892f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka	/* bind mounts DIRA to itself */
902f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka	SAFE_MOUNT(cleanup, DIRA, DIRA, "none", MS_BIND, NULL);
912f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka
922f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka	/* makes mount DIRA private */
932f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka	SAFE_MOUNT(cleanup, "none", DIRA, "none", MS_PRIVATE, NULL);
942f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka
952f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka	if (do_clone_tests(CLONE_NEWNS, child_func, NULL, NULL, NULL) == -1)
962f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka		tst_brkm(TBROK | TERRNO, cleanup, "clone failed");
972f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka
982f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka	/* bind mounts DIRB to DIRA making contents of DIRB visible
992f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka	 * in DIRA */
1002f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka	SAFE_MOUNT(cleanup, DIRB, DIRA, "none", MS_BIND, NULL);
1012f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka
1029f136a48c6205362cd8d35c726491ca93cb16514Cyril Hrubis	TST_SAFE_CHECKPOINT_WAKE_AND_WAIT(cleanup, 0);
1032f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka
1042f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka	SAFE_UMOUNT(cleanup, DIRA);
1052f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka
1069f136a48c6205362cd8d35c726491ca93cb16514Cyril Hrubis	TST_SAFE_CHECKPOINT_WAKE_AND_WAIT(cleanup, 0);
1072f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka
1082f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka	if ((access(DIRA"/A", F_OK) != 0) || (access(DIRA"/B", F_OK) == 0))
1092f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka		tst_resm(TFAIL, "private mount in child failed");
1102f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka	else
1112f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka		tst_resm(TPASS, "private mount in child passed");
1122f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka
1139f136a48c6205362cd8d35c726491ca93cb16514Cyril Hrubis	TST_SAFE_CHECKPOINT_WAKE(cleanup, 0);
1142f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka
1152f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka
1162f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka	SAFE_WAIT(cleanup, &status);
1172f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka	if (WIFEXITED(status)) {
1182f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka		if ((WEXITSTATUS(status) == 0))
1192f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka			tst_resm(TPASS, "private mount in parent passed");
1202f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka		else
1212f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka			tst_resm(TFAIL, "private mount in parent failed");
1222f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka	}
1232f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka	if (WIFSIGNALED(status)) {
1242f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka		tst_resm(TBROK, "child was killed with signal %s",
1252f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka			 tst_strsig(WTERMSIG(status)));
1262f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka		return;
1272f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka	}
1282f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka
1292f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka	SAFE_UMOUNT(cleanup, DIRA);
1302f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka}
1312f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka
1322f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefkaint main(int argc, char *argv[])
1332f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka{
1342f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka	int lc;
1352f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka
136d6d11d08678aac1ed2c370ea8e42e5f45aea07beCyril Hrubis	tst_parse_opts(argc, argv, NULL, NULL);
1372f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka
1382f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka	setup();
1392f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka
1402f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka	for (lc = 0; TEST_LOOPING(lc); lc++)
1412f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka		test();
1422f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka
1432f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka	cleanup();
1442f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka	tst_exit();
1452f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka}
1462f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka
1472f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka#else
1482f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefkaint main(void)
1492f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka{
1502f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka	tst_brkm(TCONF, NULL, "needed mountflags are not defined");
1512f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka}
1522f8f5fb418dc699681827f508e9df6227c56b026Matus Marhefka#endif
153