1 /*
2 * Copyright (c) International Business Machines Corp., 2004
3 * Copyright (c) Linux Test Project, 2004-2017
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
13 * the GNU General Public License for more details.
14 */
15
16 /*
17 * DESCRIPTION
18 * hugeshmget05 - test for EACCES error
19 *
20 * HISTORY
21 * 03/2001 - Written by Wayne Boyer
22 * 04/2004 - Updated by Robbie Williamson
23 */
24
25 #include <sys/types.h>
26 #include <sys/wait.h>
27 #include <limits.h>
28 #include "hugetlb.h"
29 #include "hugetlb.h"
30
31 static size_t shm_size;
32 static int shm_id_1 = -1;
33 static uid_t ltp_uid;
34 static char *ltp_user = "nobody";
35
36 static long hugepages = 128;
37 static struct tst_option options[] = {
38 {"s:", &nr_opt, "-s num Set the number of the been allocated hugepages"},
39 {NULL, NULL, NULL}
40 };
41
42 static void do_child(void);
43
test_hugeshmget(void)44 static void test_hugeshmget(void)
45 {
46 pid_t pid;
47 int status;
48
49 switch (pid = fork()) {
50 case -1:
51 tst_brk(TBROK | TERRNO, "fork");
52 case 0:
53 /* set the user ID of the child to the non root user */
54 SAFE_SETUID(ltp_uid);
55 do_child();
56 exit(0);
57 default:
58 /* wait for the child to return */
59 SAFE_WAITPID(pid, &status, 0);
60 }
61 }
62
do_child(void)63 static void do_child(void)
64 {
65 TEST(shmget(shmkey, shm_size, SHM_HUGETLB | SHM_RW));
66 if (TST_RET != -1) {
67 tst_res(TFAIL, "shmget succeeded unexpectedly");
68 return;
69 }
70 if (TST_ERR == EACCES)
71 tst_res(TPASS | TTERRNO, "shmget failed as expected");
72 else
73 tst_res(TFAIL | TTERRNO, "shmget failed unexpectedly "
74 "- expect errno=EACCES, got");
75 }
76
setup(void)77 void setup(void)
78 {
79 long hpage_size;
80
81 save_nr_hugepages();
82 if (nr_opt)
83 hugepages = SAFE_STRTOL(nr_opt, 0, LONG_MAX);
84
85 set_sys_tune("nr_hugepages", hugepages, 1);
86 hpage_size = SAFE_READ_MEMINFO("Hugepagesize:") * 1024;
87
88 shm_size = hpage_size * hugepages / 2;
89 update_shm_size(&shm_size);
90 shmkey = getipckey();
91 shm_id_1 = shmget(shmkey, shm_size,
92 SHM_HUGETLB | SHM_RW | IPC_CREAT | IPC_EXCL);
93 if (shm_id_1 == -1)
94 tst_brk(TBROK | TERRNO, "shmget #setup");
95
96 /* get the userid for a non-root user */
97 ltp_uid = getuserid(ltp_user);
98 }
99
cleanup(void)100 void cleanup(void)
101 {
102 rm_shm(shm_id_1);
103 restore_nr_hugepages();
104 }
105
106 static struct tst_test test = {
107 .needs_root = 1,
108 .options = options,
109 .setup = setup,
110 .cleanup = cleanup,
111 .test_all = test_hugeshmget,
112 };
113