blob: 38afee27ddd9b72ec20c0e3d58bb326fe2fc0787 [file] [log] [blame]
Kenny Root2a54e5e2012-09-13 10:52:52 -07001/*
2 * Copyright (C) 2012 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include <gtest/gtest.h>
18
Yabin Cuia04c79b2014-11-18 16:14:54 -080019// Below are the header files we want to test.
20#include <grp.h>
Kenny Root2a54e5e2012-09-13 10:52:52 -070021#include <pwd.h>
Yabin Cuia04c79b2014-11-18 16:14:54 -080022
Kenny Root2a54e5e2012-09-13 10:52:52 -070023#include <errno.h>
24#include <limits.h>
Yabin Cuia04c79b2014-11-18 16:14:54 -080025#include <sys/cdefs.h>
26#include <sys/types.h>
Kenny Root2a54e5e2012-09-13 10:52:52 -070027#include <unistd.h>
28
Mark Salyzyn722ab052016-04-06 10:35:48 -070029#include <bitset>
30
31#include <private/android_filesystem_config.h>
32
Elliott Hughes3f6eee92016-12-13 23:47:25 +000033// Generated android_ids array
34#include "generated_android_ids.h"
35
Yabin Cuia04c79b2014-11-18 16:14:54 -080036enum uid_type_t {
Kenny Root2a54e5e2012-09-13 10:52:52 -070037 TYPE_SYSTEM,
38 TYPE_APP
Yabin Cuia04c79b2014-11-18 16:14:54 -080039};
Kenny Root2a54e5e2012-09-13 10:52:52 -070040
Yabin Cuia04c79b2014-11-18 16:14:54 -080041#if defined(__BIONIC__)
42
43static void check_passwd(const passwd* pwd, const char* username, uid_t uid, uid_type_t uid_type) {
Kenny Root2a54e5e2012-09-13 10:52:52 -070044 ASSERT_TRUE(pwd != NULL);
Tom Cherry2c05c0f2017-11-10 10:57:21 -080045 EXPECT_STREQ(username, pwd->pw_name);
46 EXPECT_EQ(uid, pwd->pw_uid);
47 EXPECT_EQ(uid, pwd->pw_gid);
48 EXPECT_EQ(NULL, pwd->pw_passwd);
Calin Juravlec7688742014-05-09 21:50:53 +010049#ifdef __LP64__
Tom Cherry2c05c0f2017-11-10 10:57:21 -080050 EXPECT_EQ(NULL, pwd->pw_gecos);
Calin Juravlec7688742014-05-09 21:50:53 +010051#endif
Kenny Root2a54e5e2012-09-13 10:52:52 -070052
53 if (uid_type == TYPE_SYSTEM) {
Tom Cherry2c05c0f2017-11-10 10:57:21 -080054 EXPECT_STREQ("/", pwd->pw_dir);
Yabin Cuia04c79b2014-11-18 16:14:54 -080055 } else {
Tom Cherry2c05c0f2017-11-10 10:57:21 -080056 EXPECT_STREQ("/data", pwd->pw_dir);
Kenny Root2a54e5e2012-09-13 10:52:52 -070057 }
Tom Cherry2c05c0f2017-11-10 10:57:21 -080058 EXPECT_STREQ("/system/bin/sh", pwd->pw_shell);
Kenny Root2a54e5e2012-09-13 10:52:52 -070059}
Yabin Cuia04c79b2014-11-18 16:14:54 -080060
61static void check_getpwuid(const char* username, uid_t uid, uid_type_t uid_type) {
62 errno = 0;
63 passwd* pwd = getpwuid(uid);
64 ASSERT_EQ(0, errno);
65 SCOPED_TRACE("getpwuid");
66 check_passwd(pwd, username, uid, uid_type);
67}
68
69static void check_getpwnam(const char* username, uid_t uid, uid_type_t uid_type) {
70 errno = 0;
71 passwd* pwd = getpwnam(username);
72 ASSERT_EQ(0, errno);
73 SCOPED_TRACE("getpwnam");
74 check_passwd(pwd, username, uid, uid_type);
75}
76
77static void check_getpwuid_r(const char* username, uid_t uid, uid_type_t uid_type) {
78 passwd pwd_storage;
79 char buf[512];
80 int result;
81
82 errno = 0;
83 passwd* pwd = NULL;
84 result = getpwuid_r(uid, &pwd_storage, buf, sizeof(buf), &pwd);
85 ASSERT_EQ(0, result);
86 ASSERT_EQ(0, errno);
87 SCOPED_TRACE("getpwuid_r");
88 check_passwd(pwd, username, uid, uid_type);
89}
90
91static void check_getpwnam_r(const char* username, uid_t uid, uid_type_t uid_type) {
92 passwd pwd_storage;
93 char buf[512];
94 int result;
95
96 errno = 0;
97 passwd* pwd = NULL;
98 result = getpwnam_r(username, &pwd_storage, buf, sizeof(buf), &pwd);
99 ASSERT_EQ(0, result);
100 ASSERT_EQ(0, errno);
101 SCOPED_TRACE("getpwnam_r");
102 check_passwd(pwd, username, uid, uid_type);
103}
104
105static void check_get_passwd(const char* username, uid_t uid, uid_type_t uid_type) {
106 check_getpwuid(username, uid, uid_type);
107 check_getpwnam(username, uid, uid_type);
108 check_getpwuid_r(username, uid, uid_type);
109 check_getpwnam_r(username, uid, uid_type);
110}
111
112#else // !defined(__BIONIC__)
113
114static void check_get_passwd(const char* /* username */, uid_t /* uid */, uid_type_t /* uid_type */) {
115 GTEST_LOG_(INFO) << "This test is about uid/username translation for Android, which does nothing on libc other than bionic.\n";
116}
117
Christopher Ferrisf04935c2013-12-20 18:43:21 -0800118#endif
Kenny Root2a54e5e2012-09-13 10:52:52 -0700119
Elliott Hughes5367d1b2016-12-12 17:32:14 -0800120TEST(pwd, getpwnam_system_id_root) {
Yabin Cuia04c79b2014-11-18 16:14:54 -0800121 check_get_passwd("root", 0, TYPE_SYSTEM);
Kenny Root2a54e5e2012-09-13 10:52:52 -0700122}
123
Elliott Hughes5367d1b2016-12-12 17:32:14 -0800124TEST(pwd, getpwnam_system_id_system) {
Yabin Cuia04c79b2014-11-18 16:14:54 -0800125 check_get_passwd("system", 1000, TYPE_SYSTEM);
Kenny Root2a54e5e2012-09-13 10:52:52 -0700126}
127
Elliott Hughes5367d1b2016-12-12 17:32:14 -0800128TEST(pwd, getpwnam_app_id_radio) {
Yabin Cuia04c79b2014-11-18 16:14:54 -0800129 check_get_passwd("radio", 1001, TYPE_SYSTEM);
Kenny Root2a54e5e2012-09-13 10:52:52 -0700130}
131
Elliott Hughes5367d1b2016-12-12 17:32:14 -0800132TEST(pwd, getpwnam_oem_id_5000) {
Mark Salyzyn8d387ee2016-04-05 09:24:59 -0700133 check_get_passwd("oem_5000", 5000, TYPE_SYSTEM);
Jorge Lucangeli Obesa39e3012015-09-22 11:46:43 -0700134}
135
Elliott Hughes5367d1b2016-12-12 17:32:14 -0800136TEST(pwd, getpwnam_oem_id_5999) {
Mark Salyzyn8d387ee2016-04-05 09:24:59 -0700137 check_get_passwd("oem_5999", 5999, TYPE_SYSTEM);
138}
139
Elliott Hughes5367d1b2016-12-12 17:32:14 -0800140TEST(pwd, getpwnam_oem_id_2900) {
Mark Salyzyn8d387ee2016-04-05 09:24:59 -0700141 check_get_passwd("oem_2900", 2900, TYPE_SYSTEM);
142}
143
Elliott Hughes5367d1b2016-12-12 17:32:14 -0800144TEST(pwd, getpwnam_oem_id_2999) {
Mark Salyzyn8d387ee2016-04-05 09:24:59 -0700145 check_get_passwd("oem_2999", 2999, TYPE_SYSTEM);
Jorge Lucangeli Obesa39e3012015-09-22 11:46:43 -0700146}
147
Elliott Hughes5367d1b2016-12-12 17:32:14 -0800148TEST(pwd, getpwnam_app_id_nobody) {
Yabin Cuia04c79b2014-11-18 16:14:54 -0800149 check_get_passwd("nobody", 9999, TYPE_SYSTEM);
Kenny Root8a05a012012-09-13 14:31:50 -0700150}
151
Elliott Hughes5367d1b2016-12-12 17:32:14 -0800152TEST(pwd, getpwnam_app_id_u0_a0) {
Yabin Cuia04c79b2014-11-18 16:14:54 -0800153 check_get_passwd("u0_a0", 10000, TYPE_APP);
Kenny Root2a54e5e2012-09-13 10:52:52 -0700154}
155
Elliott Hughes5367d1b2016-12-12 17:32:14 -0800156TEST(pwd, getpwnam_app_id_u0_a1234) {
Yabin Cuia04c79b2014-11-18 16:14:54 -0800157 check_get_passwd("u0_a1234", 11234, TYPE_APP);
Kenny Root2a54e5e2012-09-13 10:52:52 -0700158}
159
Yabin Cuia04c79b2014-11-18 16:14:54 -0800160// Test the difference between uid and shared gid.
Elliott Hughes5367d1b2016-12-12 17:32:14 -0800161TEST(pwd, getpwnam_app_id_u0_a49999) {
Yabin Cuia04c79b2014-11-18 16:14:54 -0800162 check_get_passwd("u0_a49999", 59999, TYPE_APP);
Kenny Root2a54e5e2012-09-13 10:52:52 -0700163}
164
Elliott Hughes5367d1b2016-12-12 17:32:14 -0800165TEST(pwd, getpwnam_app_id_u0_i1) {
Yabin Cuia04c79b2014-11-18 16:14:54 -0800166 check_get_passwd("u0_i1", 99001, TYPE_APP);
167}
168
Elliott Hughes5367d1b2016-12-12 17:32:14 -0800169TEST(pwd, getpwnam_app_id_u1_root) {
Yabin Cuia04c79b2014-11-18 16:14:54 -0800170 check_get_passwd("u1_root", 100000, TYPE_SYSTEM);
Kenny Root2a54e5e2012-09-13 10:52:52 -0700171}
172
Elliott Hughes5367d1b2016-12-12 17:32:14 -0800173TEST(pwd, getpwnam_app_id_u1_radio) {
Yabin Cuia04c79b2014-11-18 16:14:54 -0800174 check_get_passwd("u1_radio", 101001, TYPE_SYSTEM);
Kenny Root2a54e5e2012-09-13 10:52:52 -0700175}
176
Elliott Hughes5367d1b2016-12-12 17:32:14 -0800177TEST(pwd, getpwnam_app_id_u1_a0) {
Yabin Cuia04c79b2014-11-18 16:14:54 -0800178 check_get_passwd("u1_a0", 110000, TYPE_APP);
179}
180
Elliott Hughes5367d1b2016-12-12 17:32:14 -0800181TEST(pwd, getpwnam_app_id_u1_a40000) {
Yabin Cuia04c79b2014-11-18 16:14:54 -0800182 check_get_passwd("u1_a40000", 150000, TYPE_APP);
Kenny Root2a54e5e2012-09-13 10:52:52 -0700183}
184
Elliott Hughes5367d1b2016-12-12 17:32:14 -0800185TEST(pwd, getpwnam_app_id_u1_i0) {
Yabin Cuia04c79b2014-11-18 16:14:54 -0800186 check_get_passwd("u1_i0", 199000, TYPE_APP);
187}
188
Elliott Hughes5367d1b2016-12-12 17:32:14 -0800189TEST(pwd, getpwent_iterate) {
Mark Salyzyn722ab052016-04-06 10:35:48 -0700190 passwd* pwd;
191 std::bitset<10000> exist;
192 bool application = false;
193
194 exist.reset();
195
196 setpwent();
197 while ((pwd = getpwent()) != NULL) {
198 ASSERT_TRUE(NULL != pwd->pw_name);
Tom Cherry2c05c0f2017-11-10 10:57:21 -0800199 EXPECT_EQ(pwd->pw_gid, pwd->pw_uid) << "pwd->pw_uid: " << pwd->pw_uid;
200 EXPECT_EQ(NULL, pwd->pw_passwd) << "pwd->pw_uid: " << pwd->pw_uid;
Mark Salyzyn722ab052016-04-06 10:35:48 -0700201#ifdef __LP64__
Tom Cherry2c05c0f2017-11-10 10:57:21 -0800202 EXPECT_TRUE(NULL == pwd->pw_gecos) << "pwd->pw_uid: " << pwd->pw_uid;
Mark Salyzyn722ab052016-04-06 10:35:48 -0700203#endif
Tom Cherry2c05c0f2017-11-10 10:57:21 -0800204 EXPECT_TRUE(NULL != pwd->pw_shell);
Mark Salyzyn722ab052016-04-06 10:35:48 -0700205 if (pwd->pw_uid >= exist.size()) {
Tom Cherry2c05c0f2017-11-10 10:57:21 -0800206 EXPECT_STREQ("/data", pwd->pw_dir) << "pwd->pw_uid: " << pwd->pw_uid;
Mark Salyzyn722ab052016-04-06 10:35:48 -0700207 application = true;
208 } else {
Tom Cherry2c05c0f2017-11-10 10:57:21 -0800209 EXPECT_STREQ("/", pwd->pw_dir) << "pwd->pw_uid: " << pwd->pw_uid;
Tom Cherrya14485a2017-08-04 11:07:19 -0700210 // TODO(b/27999086): fix this check with the OEM range
211 // If OEMs add their own AIDs to private/android_filesystem_config.h, this check will fail.
212 // Long term we want to create a better solution for OEMs adding AIDs, but we're not there
213 // yet, so therefore we do not check for uid's in the OEM range.
214 if (!(pwd->pw_uid >= 2900 && pwd->pw_uid <= 2999) &&
215 !(pwd->pw_uid >= 5000 && pwd->pw_uid <= 5999)) {
Tom Cherry2c05c0f2017-11-10 10:57:21 -0800216 EXPECT_FALSE(exist[pwd->pw_uid]) << "pwd->pw_uid: " << pwd->pw_uid;
Tom Cherrya14485a2017-08-04 11:07:19 -0700217 }
Mark Salyzyn722ab052016-04-06 10:35:48 -0700218 exist[pwd->pw_uid] = true;
219 }
220 }
221 endpwent();
222
223 // Required content
224 for (size_t n = 0; n < android_id_count; ++n) {
Tom Cherry2c05c0f2017-11-10 10:57:21 -0800225 EXPECT_TRUE(exist[android_ids[n].aid]) << "android_ids[n].aid: " << android_ids[n].aid;
Mark Salyzyn722ab052016-04-06 10:35:48 -0700226 }
227 for (size_t n = 2900; n < 2999; ++n) {
Tom Cherry2c05c0f2017-11-10 10:57:21 -0800228 EXPECT_TRUE(exist[n]) << "n: " << n;
Mark Salyzyn722ab052016-04-06 10:35:48 -0700229 }
230 for (size_t n = 5000; n < 5999; ++n) {
Tom Cherry2c05c0f2017-11-10 10:57:21 -0800231 EXPECT_TRUE(exist[n]) << "n: " << n;
Mark Salyzyn722ab052016-04-06 10:35:48 -0700232 }
Tom Cherry2c05c0f2017-11-10 10:57:21 -0800233 EXPECT_TRUE(application);
Mark Salyzyn722ab052016-04-06 10:35:48 -0700234}
235
Yabin Cuia04c79b2014-11-18 16:14:54 -0800236static void check_group(const group* grp, const char* group_name, gid_t gid) {
237 ASSERT_TRUE(grp != NULL);
Tom Cherry2c05c0f2017-11-10 10:57:21 -0800238 EXPECT_STREQ(group_name, grp->gr_name);
239 EXPECT_EQ(gid, grp->gr_gid);
Yabin Cuia04c79b2014-11-18 16:14:54 -0800240 ASSERT_TRUE(grp->gr_mem != NULL);
Tom Cherry2c05c0f2017-11-10 10:57:21 -0800241 EXPECT_STREQ(group_name, grp->gr_mem[0]);
242 EXPECT_TRUE(grp->gr_mem[1] == NULL);
Yabin Cuia04c79b2014-11-18 16:14:54 -0800243}
244
Yabin Cuic4786d32015-07-20 19:46:26 -0700245#if defined(__BIONIC__)
246
Yabin Cuia04c79b2014-11-18 16:14:54 -0800247static void check_getgrgid(const char* group_name, gid_t gid) {
248 errno = 0;
249 group* grp = getgrgid(gid);
250 ASSERT_EQ(0, errno);
251 SCOPED_TRACE("getgrgid");
252 check_group(grp, group_name, gid);
253}
254
255static void check_getgrnam(const char* group_name, gid_t gid) {
256 errno = 0;
257 group* grp = getgrnam(group_name);
258 ASSERT_EQ(0, errno);
259 SCOPED_TRACE("getgrnam");
260 check_group(grp, group_name, gid);
261}
262
Yabin Cuic4786d32015-07-20 19:46:26 -0700263static void check_getgrgid_r(const char* group_name, gid_t gid) {
264 group grp_storage;
265 char buf[512];
266 group* grp;
267
268 errno = 0;
269 int result = getgrgid_r(gid, &grp_storage, buf, sizeof(buf), &grp);
270 ASSERT_EQ(0, result);
271 ASSERT_EQ(0, errno);
272 SCOPED_TRACE("getgrgid_r");
273 check_group(grp, group_name, gid);
274}
275
276static void check_getgrnam_r(const char* group_name, gid_t gid) {
277 group grp_storage;
278 char buf[512];
279 group* grp;
280
281 errno = 0;
282 int result = getgrnam_r(group_name, &grp_storage, buf, sizeof(buf), &grp);
283 ASSERT_EQ(0, result);
284 ASSERT_EQ(0, errno);
285 SCOPED_TRACE("getgrnam_r");
286 check_group(grp, group_name, gid);
287}
288
Yabin Cuia04c79b2014-11-18 16:14:54 -0800289static void check_get_group(const char* group_name, gid_t gid) {
290 check_getgrgid(group_name, gid);
291 check_getgrnam(group_name, gid);
Yabin Cuic4786d32015-07-20 19:46:26 -0700292 check_getgrgid_r(group_name, gid);
293 check_getgrnam_r(group_name, gid);
Yabin Cuia04c79b2014-11-18 16:14:54 -0800294}
295
296#else // !defined(__BIONIC__)
297
Yabin Cuic4786d32015-07-20 19:46:26 -0700298static void print_no_getgrnam_test_info() {
Yabin Cuia04c79b2014-11-18 16:14:54 -0800299 GTEST_LOG_(INFO) << "This test is about gid/group_name translation for Android, which does nothing on libc other than bionic.\n";
300}
301
Yabin Cuic4786d32015-07-20 19:46:26 -0700302static void check_get_group(const char*, gid_t) {
303 print_no_getgrnam_test_info();
304}
305
Yabin Cuia04c79b2014-11-18 16:14:54 -0800306#endif
307
Elliott Hughes5367d1b2016-12-12 17:32:14 -0800308TEST(grp, getgrnam_system_id_root) {
Yabin Cuia04c79b2014-11-18 16:14:54 -0800309 check_get_group("root", 0);
310}
311
Elliott Hughes5367d1b2016-12-12 17:32:14 -0800312TEST(grp, getgrnam_system_id_system) {
Yabin Cuia04c79b2014-11-18 16:14:54 -0800313 check_get_group("system", 1000);
314}
315
Elliott Hughes5367d1b2016-12-12 17:32:14 -0800316TEST(grp, getgrnam_app_id_radio) {
Yabin Cuia04c79b2014-11-18 16:14:54 -0800317 check_get_group("radio", 1001);
318}
319
Elliott Hughes5367d1b2016-12-12 17:32:14 -0800320TEST(grp, getgrnam_oem_id_5000) {
Mark Salyzyn8d387ee2016-04-05 09:24:59 -0700321 check_get_group("oem_5000", 5000);
Jorge Lucangeli Obesa39e3012015-09-22 11:46:43 -0700322}
323
Elliott Hughes5367d1b2016-12-12 17:32:14 -0800324TEST(grp, getgrnam_oem_id_5999) {
Mark Salyzyn8d387ee2016-04-05 09:24:59 -0700325 check_get_group("oem_5999", 5999);
326}
327
Elliott Hughes5367d1b2016-12-12 17:32:14 -0800328TEST(grp, getgrnam_oem_id_2900) {
Mark Salyzyn8d387ee2016-04-05 09:24:59 -0700329 check_get_group("oem_2900", 2900);
330}
331
Elliott Hughes5367d1b2016-12-12 17:32:14 -0800332TEST(grp, getgrnam_oem_id_2999) {
Mark Salyzyn8d387ee2016-04-05 09:24:59 -0700333 check_get_group("oem_2999", 2999);
Jorge Lucangeli Obesa39e3012015-09-22 11:46:43 -0700334}
335
Elliott Hughes5367d1b2016-12-12 17:32:14 -0800336TEST(grp, getgrnam_app_id_nobody) {
Yabin Cuia04c79b2014-11-18 16:14:54 -0800337 check_get_group("nobody", 9999);
338}
339
Elliott Hughes5367d1b2016-12-12 17:32:14 -0800340TEST(grp, getgrnam_app_id_u0_a0) {
Yabin Cuia04c79b2014-11-18 16:14:54 -0800341 check_get_group("u0_a0", 10000);
342}
343
Elliott Hughes5367d1b2016-12-12 17:32:14 -0800344TEST(grp, getgrnam_app_id_u0_a1234) {
Yabin Cuia04c79b2014-11-18 16:14:54 -0800345 check_get_group("u0_a1234", 11234);
346}
347
Elliott Hughes5367d1b2016-12-12 17:32:14 -0800348TEST(grp, getgrnam_app_id_u0_a9999) {
Yabin Cuia04c79b2014-11-18 16:14:54 -0800349 check_get_group("u0_a9999", 19999);
350}
351
Jeff Sharkey934bc862016-12-13 14:03:19 -0700352TEST(getgrnam, app_id_u0_a0_cache) {
353 check_get_group("u0_a0_cache", 20000);
354}
355
356TEST(getgrnam, app_id_u0_a1234_cache) {
357 check_get_group("u0_a1234_cache", 21234);
358}
359
360TEST(getgrnam, app_id_u0_a9999_cache) {
361 check_get_group("u0_a9999_cache", 29999);
362}
363
364TEST(getgrnam, app_id_u10_a1234_cache) {
365 check_get_group("u10_a1234_cache", 1021234);
366}
367
Yabin Cuia04c79b2014-11-18 16:14:54 -0800368// Test the difference between uid and shared gid.
Elliott Hughes5367d1b2016-12-12 17:32:14 -0800369TEST(grp, getgrnam_app_id_all_a9999) {
Yabin Cuia04c79b2014-11-18 16:14:54 -0800370 check_get_group("all_a9999", 59999);
371}
372
Elliott Hughes5367d1b2016-12-12 17:32:14 -0800373TEST(grp, getgrnam_app_id_u0_i1) {
Yabin Cuia04c79b2014-11-18 16:14:54 -0800374 check_get_group("u0_i1", 99001);
375}
376
Elliott Hughes5367d1b2016-12-12 17:32:14 -0800377TEST(grp, getgrnam_app_id_u1_root) {
Yabin Cuia04c79b2014-11-18 16:14:54 -0800378 check_get_group("u1_root", 100000);
379}
380
Elliott Hughes5367d1b2016-12-12 17:32:14 -0800381TEST(grp, getgrnam_app_id_u1_radio) {
Yabin Cuia04c79b2014-11-18 16:14:54 -0800382 check_get_group("u1_radio", 101001);
383}
384
Elliott Hughes5367d1b2016-12-12 17:32:14 -0800385TEST(grp, getgrnam_app_id_u1_a0) {
Yabin Cuia04c79b2014-11-18 16:14:54 -0800386 check_get_group("u1_a0", 110000);
387}
388
Elliott Hughes5367d1b2016-12-12 17:32:14 -0800389TEST(grp, getgrnam_app_id_u1_a40000) {
Yabin Cuia04c79b2014-11-18 16:14:54 -0800390 check_get_group("u1_a40000", 150000);
391}
392
Elliott Hughes5367d1b2016-12-12 17:32:14 -0800393TEST(grp, getgrnam_app_id_u1_i0) {
Yabin Cuia04c79b2014-11-18 16:14:54 -0800394 check_get_group("u1_i0", 199000);
Kenny Root2a54e5e2012-09-13 10:52:52 -0700395}
Yabin Cuic4786d32015-07-20 19:46:26 -0700396
Elliott Hughes5367d1b2016-12-12 17:32:14 -0800397TEST(grp, getgrnam_r_reentrancy) {
Yabin Cuic4786d32015-07-20 19:46:26 -0700398#if defined(__BIONIC__)
399 group grp_storage[2];
400 char buf[2][512];
401 group* grp[3];
402 int result = getgrnam_r("root", &grp_storage[0], buf[0], sizeof(buf[0]), &grp[0]);
403 ASSERT_EQ(0, result);
404 check_group(grp[0], "root", 0);
405 grp[1] = getgrnam("system");
406 check_group(grp[1], "system", 1000);
407 result = getgrnam_r("radio", &grp_storage[1], buf[1], sizeof(buf[1]), &grp[2]);
408 ASSERT_EQ(0, result);
409 check_group(grp[2], "radio", 1001);
410 check_group(grp[0], "root", 0);
411 check_group(grp[1], "system", 1000);
412#else
413 print_no_getgrnam_test_info();
414#endif
415}
416
Elliott Hughes5367d1b2016-12-12 17:32:14 -0800417TEST(grp, getgrgid_r_reentrancy) {
Yabin Cuic4786d32015-07-20 19:46:26 -0700418#if defined(__BIONIC__)
419 group grp_storage[2];
420 char buf[2][512];
421 group* grp[3];
422 int result = getgrgid_r(0, &grp_storage[0], buf[0], sizeof(buf[0]), &grp[0]);
423 ASSERT_EQ(0, result);
424 check_group(grp[0], "root", 0);
425 grp[1] = getgrgid(1000);
426 check_group(grp[1], "system", 1000);
427 result = getgrgid_r(1001, &grp_storage[1], buf[1], sizeof(buf[1]), &grp[2]);
428 ASSERT_EQ(0, result);
429 check_group(grp[2], "radio", 1001);
430 check_group(grp[0], "root", 0);
431 check_group(grp[1], "system", 1000);
432#else
433 print_no_getgrnam_test_info();
434#endif
435}
436
Elliott Hughes5367d1b2016-12-12 17:32:14 -0800437TEST(grp, getgrnam_r_large_enough_suggested_buffer_size) {
Yabin Cuic4786d32015-07-20 19:46:26 -0700438 long size = sysconf(_SC_GETGR_R_SIZE_MAX);
439 ASSERT_GT(size, 0);
440 char buf[size];
441 group grp_storage;
442 group* grp;
443 ASSERT_EQ(0, getgrnam_r("root", &grp_storage, buf, size, &grp));
444 check_group(grp, "root", 0);
445}
Mark Salyzyn722ab052016-04-06 10:35:48 -0700446
Elliott Hughes5367d1b2016-12-12 17:32:14 -0800447TEST(grp, getgrent_iterate) {
Mark Salyzyn722ab052016-04-06 10:35:48 -0700448 group* grp;
449 std::bitset<10000> exist;
450 bool application = false;
451
452 exist.reset();
453
454 setgrent();
455 while ((grp = getgrent()) != NULL) {
Tom Cherry2c05c0f2017-11-10 10:57:21 -0800456 ASSERT_TRUE(grp->gr_name != NULL) << "grp->gr_gid: " << grp->gr_gid;
457 ASSERT_TRUE(grp->gr_mem != NULL) << "grp->gr_gid: " << grp->gr_gid;
458 EXPECT_STREQ(grp->gr_name, grp->gr_mem[0]) << "grp->gr_gid: " << grp->gr_gid;
459 EXPECT_TRUE(grp->gr_mem[1] == NULL) << "grp->gr_gid: " << grp->gr_gid;
Mark Salyzyn722ab052016-04-06 10:35:48 -0700460 if (grp->gr_gid >= exist.size()) {
461 application = true;
462 } else {
Tom Cherrya14485a2017-08-04 11:07:19 -0700463 // TODO(b/27999086): fix this check with the OEM range
464 // If OEMs add their own AIDs to private/android_filesystem_config.h, this check will fail.
465 // Long term we want to create a better solution for OEMs adding AIDs, but we're not there
466 // yet, so therefore we do not check for gid's in the OEM range.
467 if (!(grp->gr_gid >= 2900 && grp->gr_gid <= 2999) &&
468 !(grp->gr_gid >= 5000 && grp->gr_gid <= 5999)) {
Tom Cherry2c05c0f2017-11-10 10:57:21 -0800469 EXPECT_FALSE(exist[grp->gr_gid]) << "grp->gr_gid: " << grp->gr_gid;
Tom Cherrya14485a2017-08-04 11:07:19 -0700470 }
Mark Salyzyn722ab052016-04-06 10:35:48 -0700471 exist[grp->gr_gid] = true;
472 }
473 }
474 endgrent();
475
476 // Required content
477 for (size_t n = 0; n < android_id_count; ++n) {
Tom Cherry2c05c0f2017-11-10 10:57:21 -0800478 EXPECT_TRUE(exist[android_ids[n].aid]) << "android_ids[n].aid: " << android_ids[n].aid;
Mark Salyzyn722ab052016-04-06 10:35:48 -0700479 }
480 for (size_t n = 2900; n < 2999; ++n) {
Tom Cherry2c05c0f2017-11-10 10:57:21 -0800481 EXPECT_TRUE(exist[n]) << "n: " << n;
Mark Salyzyn722ab052016-04-06 10:35:48 -0700482 }
483 for (size_t n = 5000; n < 5999; ++n) {
Tom Cherry2c05c0f2017-11-10 10:57:21 -0800484 EXPECT_TRUE(exist[n]) << "n: " << n;
Mark Salyzyn722ab052016-04-06 10:35:48 -0700485 }
Tom Cherry2c05c0f2017-11-10 10:57:21 -0800486 EXPECT_TRUE(application);
Mark Salyzyn722ab052016-04-06 10:35:48 -0700487}