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