10dc076565f772bb1953209fb69ea150b494aaa40robbiew/*
20dc076565f772bb1953209fb69ea150b494aaa40robbiew *  This program is free software; you can redistribute it and/or modify
30dc076565f772bb1953209fb69ea150b494aaa40robbiew *  it under the terms of the GNU General Public License version 2.
40dc076565f772bb1953209fb69ea150b494aaa40robbiew *
50dc076565f772bb1953209fb69ea150b494aaa40robbiew *  This program is distributed in the hope that it will be useful,
60dc076565f772bb1953209fb69ea150b494aaa40robbiew *  but WITHOUT ANY WARRANTY; without even the implied warranty of
70dc076565f772bb1953209fb69ea150b494aaa40robbiew *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
80dc076565f772bb1953209fb69ea150b494aaa40robbiew *  GNU General Public License for more details.
90dc076565f772bb1953209fb69ea150b494aaa40robbiew *
100dc076565f772bb1953209fb69ea150b494aaa40robbiew * Test that the shm_open() function sets errno = EACCES if the shared memory
110dc076565f772bb1953209fb69ea150b494aaa40robbiew * object exists and the permissions specified by oflag are denied
120dc076565f772bb1953209fb69ea150b494aaa40robbiew *
130dc076565f772bb1953209fb69ea150b494aaa40robbiew * Create a shared memory object with no read or write permission and try to
140dc076565f772bb1953209fb69ea150b494aaa40robbiew * open it.
150dc076565f772bb1953209fb69ea150b494aaa40robbiew */
160dc076565f772bb1953209fb69ea150b494aaa40robbiew
170dc076565f772bb1953209fb69ea150b494aaa40robbiew#define _XOPEN_SOURCE 600
180dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <stdio.h>
190dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <sys/mman.h>
200dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <sys/stat.h>
210dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <fcntl.h>
220dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <errno.h>
230dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <unistd.h>
240dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <sys/types.h>
250dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <pwd.h>
260dc076565f772bb1953209fb69ea150b494aaa40robbiew#include <string.h>
270dc076565f772bb1953209fb69ea150b494aaa40robbiew#include "posixtest.h"
280dc076565f772bb1953209fb69ea150b494aaa40robbiew
290dc076565f772bb1953209fb69ea150b494aaa40robbiew#define SHM_NAME "posixtest_32-1"
300dc076565f772bb1953209fb69ea150b494aaa40robbiew
310dc076565f772bb1953209fb69ea150b494aaa40robbiew/** Set the euid of this process to a non-root uid */
320dc076565f772bb1953209fb69ea150b494aaa40robbiewint set_nonroot()
330dc076565f772bb1953209fb69ea150b494aaa40robbiew{
340dc076565f772bb1953209fb69ea150b494aaa40robbiew	struct passwd *pw;
350dc076565f772bb1953209fb69ea150b494aaa40robbiew	setpwent();
362c28215423293e443469a07ae7011135d058b671Garrett Cooper	/* search for the first user which is non root */
37df3eb16e38c6a163b0a7367c885679eed6140964Garrett Cooper	while ((pw = getpwent()) != NULL)
38df3eb16e38c6a163b0a7367c885679eed6140964Garrett Cooper		if (strcmp(pw->pw_name, "root"))
390dc076565f772bb1953209fb69ea150b494aaa40robbiew			break;
400dc076565f772bb1953209fb69ea150b494aaa40robbiew	endpwent();
41df3eb16e38c6a163b0a7367c885679eed6140964Garrett Cooper	if (pw == NULL) {
420dc076565f772bb1953209fb69ea150b494aaa40robbiew		printf("There is no other user than current and root.\n");
430dc076565f772bb1953209fb69ea150b494aaa40robbiew		return 1;
440dc076565f772bb1953209fb69ea150b494aaa40robbiew	}
450dc076565f772bb1953209fb69ea150b494aaa40robbiew
46df3eb16e38c6a163b0a7367c885679eed6140964Garrett Cooper	if (seteuid(pw->pw_uid) != 0) {
47df3eb16e38c6a163b0a7367c885679eed6140964Garrett Cooper		if (errno == EPERM) {
48354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			printf
49354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			    ("You don't have permission to change your UID.\n");
500dc076565f772bb1953209fb69ea150b494aaa40robbiew			return 1;
510dc076565f772bb1953209fb69ea150b494aaa40robbiew		}
520dc076565f772bb1953209fb69ea150b494aaa40robbiew		perror("An error occurs when calling seteuid()");
530dc076565f772bb1953209fb69ea150b494aaa40robbiew		return 1;
540dc076565f772bb1953209fb69ea150b494aaa40robbiew	}
552c28215423293e443469a07ae7011135d058b671Garrett Cooper
560dc076565f772bb1953209fb69ea150b494aaa40robbiew	printf("Testing with user '%s' (uid: %d)\n",
570dc076565f772bb1953209fb69ea150b494aaa40robbiew	       pw->pw_name, (int)geteuid());
580dc076565f772bb1953209fb69ea150b494aaa40robbiew	return 0;
590dc076565f772bb1953209fb69ea150b494aaa40robbiew}
600dc076565f772bb1953209fb69ea150b494aaa40robbiew
614ca2bbdcd3003f3c8df4e6129e9c7b2bd1514f87Cyril Hrubisint main(void)
62354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao{
630dc076565f772bb1953209fb69ea150b494aaa40robbiew	int fd;
640dc076565f772bb1953209fb69ea150b494aaa40robbiew
65354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	/* This test should be run under standard user permissions */
66354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if (getuid() == 0) {
67354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (set_nonroot() != 0) {
682c28215423293e443469a07ae7011135d058b671Garrett Cooper			printf("Cannot run this test as non-root user\n");
690dc076565f772bb1953209fb69ea150b494aaa40robbiew			return PTS_UNTESTED;
700dc076565f772bb1953209fb69ea150b494aaa40robbiew		}
71354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	}
720dc076565f772bb1953209fb69ea150b494aaa40robbiew
73354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	fd = shm_open(SHM_NAME, O_RDWR | O_CREAT, 0);
74df3eb16e38c6a163b0a7367c885679eed6140964Garrett Cooper	if (fd == -1) {
750dc076565f772bb1953209fb69ea150b494aaa40robbiew		perror("An error occurs when calling shm_open()");
760dc076565f772bb1953209fb69ea150b494aaa40robbiew		return PTS_UNRESOLVED;
770dc076565f772bb1953209fb69ea150b494aaa40robbiew	}
782c28215423293e443469a07ae7011135d058b671Garrett Cooper
790dc076565f772bb1953209fb69ea150b494aaa40robbiew	fd = shm_open(SHM_NAME, O_RDWR, 0);
802c28215423293e443469a07ae7011135d058b671Garrett Cooper
81df3eb16e38c6a163b0a7367c885679eed6140964Garrett Cooper	if (fd == -1 && errno == EACCES) {
820dc076565f772bb1953209fb69ea150b494aaa40robbiew		printf("Test PASSED\n");
830dc076565f772bb1953209fb69ea150b494aaa40robbiew		shm_unlink(SHM_NAME);
840dc076565f772bb1953209fb69ea150b494aaa40robbiew		return PTS_PASS;
85df3eb16e38c6a163b0a7367c885679eed6140964Garrett Cooper	} else if (fd != -1) {
860dc076565f772bb1953209fb69ea150b494aaa40robbiew		printf("shm_open success.\n");
870dc076565f772bb1953209fb69ea150b494aaa40robbiew		shm_unlink(SHM_NAME);
880dc076565f772bb1953209fb69ea150b494aaa40robbiew		return PTS_FAIL;
890dc076565f772bb1953209fb69ea150b494aaa40robbiew	}
902c28215423293e443469a07ae7011135d058b671Garrett Cooper
910dc076565f772bb1953209fb69ea150b494aaa40robbiew	perror("shm_open");
920dc076565f772bb1953209fb69ea150b494aaa40robbiew	return PTS_FAIL;
93ec6edca7aa42b6affd989ef91b5897f96795e40fChris Dearman}
94