OLD | NEW |
---|---|
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "base/file_util.h" | 5 #include "base/file_util.h" |
6 | 6 |
7 #include <dirent.h> | 7 #include <dirent.h> |
8 #include <errno.h> | 8 #include <errno.h> |
9 #include <fcntl.h> | 9 #include <fcntl.h> |
10 #include <fnmatch.h> | 10 #include <fnmatch.h> |
(...skipping 922 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
933 | 933 |
934 if (HANDLE_EINTR(close(infile)) < 0) | 934 if (HANDLE_EINTR(close(infile)) < 0) |
935 result = false; | 935 result = false; |
936 if (HANDLE_EINTR(close(outfile)) < 0) | 936 if (HANDLE_EINTR(close(outfile)) < 0) |
937 result = false; | 937 result = false; |
938 | 938 |
939 return result; | 939 return result; |
940 } | 940 } |
941 #endif // defined(OS_MACOSX) | 941 #endif // defined(OS_MACOSX) |
942 | 942 |
943 // Test that a path is owned by a specific user, and not writable | |
944 // by all users. This is useful for checking that a config file | |
945 // is administrator-controlled. All components of |path| after |base| | |
946 // are checked. Note that |base| is not checked, and |base| must be a | |
947 // parent of |path|. | |
Evan Martin
2011/08/24 22:38:53
These comments belong in the header.
Sam Kerner (Chrome)
2011/08/25 14:04:37
Done.
| |
948 bool IsPathControlledByUser(const FilePath& base, | |
949 const FilePath& path, | |
950 uid_t owner_uid) { | |
951 if (path == base) | |
TVL
2011/08/25 14:07:28
do you need to sanity check that base is the prefi
Sam Kerner (Chrome)
2011/08/26 19:59:15
Sanity checks added. Unit test IsPathControlledBy
| |
952 return true; | |
953 | |
954 | |
Evan Martin
2011/08/24 22:38:53
Is the double-newline here intentional?
Sam Kerner (Chrome)
2011/08/25 14:04:37
No. Removed.
| |
955 if (!IsPathControlledByUser(base, path.DirName(), owner_uid)) | |
TVL
2011/08/25 14:07:28
could this be done with a loop to avoid the recurs
Sam Kerner (Chrome)
2011/08/26 19:59:15
Done.
| |
956 return false; | |
957 | |
958 stat_wrapper_t stat_info; | |
959 if (CallStat(path.value().c_str(), &stat_info) != 0) { | |
960 LOG(ERROR) << "Failed to get information on path " << path.value(); | |
Evan Martin
2011/08/24 22:38:53
Use PLOG() for functions like this that use errno
Sam Kerner (Chrome)
2011/08/25 14:04:37
Done.
| |
961 return false; | |
962 } | |
963 | |
964 if (stat_info.st_uid != owner_uid) { | |
965 LOG(ERROR) << "Path " << path.value() | |
966 << " is owned by the wrong user."; | |
967 return false; | |
968 } | |
969 | |
970 if (stat_info.st_mode & S_IWOTH) { | |
971 LOG(ERROR) << "Path "<< path.value() << " is writable by any user."; | |
972 return false; | |
973 } | |
974 | |
975 return true; | |
976 } | |
977 | |
978 bool IsPathControlledByAdmin(const FilePath& path) { | |
979 const unsigned kRootUid = 0; | |
980 const FilePath kFileSystemRoot(FILE_PATH_LITERAL("/")); | |
Evan Martin
2011/08/24 22:38:53
Since this is in POSIX code, you can use "/" witho
Sam Kerner (Chrome)
2011/08/25 14:04:37
Done.
| |
981 return IsPathControlledByUser(kFileSystemRoot, path, kRootUid); | |
982 } | |
983 | |
943 } // namespace file_util | 984 } // namespace file_util |
OLD | NEW |