xref: /llvm-project/compiler-rt/test/sanitizer_common/TestCases/Posix/getpw_getgr.cpp (revision 03d593dd7e6de269381ac71d0269a207f4dd1eeb)
174989affSNico Weber // RUN: %clangxx %s -o %t && %run %t
274989affSNico Weber 
374989affSNico Weber #include <assert.h>
474989affSNico Weber #include <grp.h>
574989affSNico Weber #include <memory>
674989affSNico Weber #include <pwd.h>
774989affSNico Weber #include <stdio.h>
874989affSNico Weber #include <stdlib.h>
974989affSNico Weber #include <string.h>
1074989affSNico Weber 
1174989affSNico Weber std::unique_ptr<char []> any_group;
1274989affSNico Weber const int N = 123456;
1374989affSNico Weber 
Check(const char * str)1474989affSNico Weber void Check(const char *str) {
1574989affSNico Weber   if (!str)
1674989affSNico Weber     return;
1774989affSNico Weber   assert(strlen(str) != N);
1874989affSNico Weber }
1974989affSNico Weber 
Check(const passwd * result)2074989affSNico Weber void Check(const passwd *result) {
2174989affSNico Weber   Check(result->pw_name);
2274989affSNico Weber   Check(result->pw_passwd);
2374989affSNico Weber   assert(result->pw_uid != N);
2474989affSNico Weber   assert(result->pw_gid != N);
2574989affSNico Weber #if !defined(__ANDROID__)
2674989affSNico Weber   Check(result->pw_gecos);
2774989affSNico Weber #endif
2874989affSNico Weber   Check(result->pw_dir);
2974989affSNico Weber 
3074989affSNico Weber #if defined(__APPLE__) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)
3174989affSNico Weber   assert(result->pw_change != N);
3274989affSNico Weber   Check(result->pw_class);
3374989affSNico Weber   assert(result->pw_expire != N);
3474989affSNico Weber #endif
3574989affSNico Weber 
3674989affSNico Weber #if defined(__FreeBSD__)
3774989affSNico Weber   assert(result->pw_fields != N);
3874989affSNico Weber #endif
3974989affSNico Weber 
4074989affSNico Weber   // SunOS also has pw_age and pw_comment which are documented as unused.
4174989affSNico Weber }
4274989affSNico Weber 
Check(const group * result)4374989affSNico Weber void Check(const group *result) {
4474989affSNico Weber   Check(result->gr_name);
4574989affSNico Weber   Check(result->gr_passwd);
4674989affSNico Weber   assert(result->gr_gid != N);
4774989affSNico Weber   for (char **mem = result->gr_mem; *mem; ++mem)
4874989affSNico Weber     Check(*mem);
4974989affSNico Weber   if (!any_group) {
5074989affSNico Weber     auto length = strlen(result->gr_name);
5174989affSNico Weber     any_group.reset(new char[length + 1]);
5274989affSNico Weber     memcpy(any_group.get(), result->gr_name, length + 1);
5374989affSNico Weber   }
5474989affSNico Weber }
5574989affSNico Weber 
5674989affSNico Weber template <class T, class Fn, class... Args>
test(Fn f,Args...args)5774989affSNico Weber void test(Fn f, Args... args) {
5874989affSNico Weber   T *result = f(args...);
5974989affSNico Weber   Check(result);
6074989affSNico Weber }
6174989affSNico Weber 
6274989affSNico Weber template <class T, class Fn, class... Args>
test_r(Fn f,Args...args)6374989affSNico Weber void test_r(Fn f, Args... args) {
6474989affSNico Weber   T gr;
6574989affSNico Weber   T *result;
6674989affSNico Weber   char buff[10000];
6774989affSNico Weber   assert(!f(args..., &gr, buff, sizeof(buff), &result));
6874989affSNico Weber   Check(&gr);
6974989affSNico Weber   Check(result);
7074989affSNico Weber }
7174989affSNico Weber 
main(int argc,const char * argv[])7274989affSNico Weber int main(int argc, const char *argv[]) {
7374989affSNico Weber   test<passwd>(&getpwuid, 0);
7474989affSNico Weber   test<passwd>(&getpwnam, "root");
7574989affSNico Weber   test<group>(&getgrgid, 0);
7674989affSNico Weber   test<group>(&getgrnam, any_group.get());
7774989affSNico Weber 
7874989affSNico Weber #if !defined(__ANDROID__)
7974989affSNico Weber   setpwent();
8074989affSNico Weber   test<passwd>(&getpwent);
8174989affSNico Weber   setgrent();
8274989affSNico Weber   test<group>(&getgrent);
8374989affSNico Weber 
84*03d593ddSRainer Orth #if !defined(__APPLE__) && !(defined(__sun__) && defined(__svr4__))
8574989affSNico Weber   setpwent();
8674989affSNico Weber   test_r<passwd>(&getpwent_r);
8774989affSNico Weber   setgrent();
8874989affSNico Weber   test_r<group>(&getgrent_r);
8974989affSNico Weber #endif
9074989affSNico Weber 
9174989affSNico Weber   test_r<passwd>(&getpwuid_r, 0);
9274989affSNico Weber   test_r<passwd>(&getpwnam_r, "root");
9374989affSNico Weber 
9474989affSNico Weber   test_r<group>(&getgrgid_r, 0);
9574989affSNico Weber   test_r<group>(&getgrnam_r, any_group.get());
9674989affSNico Weber 
9774989affSNico Weber #if defined(__linux__)
9874989affSNico Weber   auto pwd_file = [] {
9974989affSNico Weber     return std::unique_ptr<FILE, decltype(&fclose)>(fopen("/etc/passwd", "r"),
10074989affSNico Weber                                                     &fclose);
10174989affSNico Weber   };
10274989affSNico Weber   auto gr_file = [] {
10374989affSNico Weber     return std::unique_ptr<FILE, decltype(&fclose)>(fopen("/etc/group", "r"),
10474989affSNico Weber                                                     &fclose);
10574989affSNico Weber   };
10674989affSNico Weber   test<passwd>(&fgetpwent, pwd_file().get());
10774989affSNico Weber   test<group>(&fgetgrent, gr_file().get());
10874989affSNico Weber   test_r<passwd>(&fgetpwent_r, pwd_file().get());
10974989affSNico Weber   test_r<group>(&fgetgrent_r, gr_file().get());
11074989affSNico Weber #endif
11174989affSNico Weber 
11274989affSNico Weber #endif // __ANDROID__
11374989affSNico Weber 
11474989affSNico Weber   return 0;
11574989affSNico Weber }
116