Optionally ignore EACCES in realpath.

GitOrigin-RevId: 8043b753ec748b6ff21accb5efde782047e5cd50
This commit is contained in:
levlam 2018-01-26 16:47:46 +03:00
parent a40619aa64
commit 55b16026c5
5 changed files with 14 additions and 8 deletions

View File

@ -4374,7 +4374,7 @@ Status Td::fix_parameters(TdParameters &parameters) {
dir += TD_DIR_SLASH; dir += TD_DIR_SLASH;
} }
TRY_STATUS(mkpath(dir, 0750)); TRY_STATUS(mkpath(dir, 0750));
TRY_RESULT(real_dir, realpath(dir)); TRY_RESULT(real_dir, realpath(dir, true));
if (dir.back() != TD_DIR_SLASH) { if (dir.back() != TD_DIR_SLASH) {
dir += TD_DIR_SLASH; dir += TD_DIR_SLASH;
} }

View File

@ -466,7 +466,7 @@ Status FileManager::check_local_location(FullLocalFileLocation &location, int64
if (location.path_.empty()) { if (location.path_.empty()) {
return Status::Error("File must have non-empty path"); return Status::Error("File must have non-empty path");
} }
TRY_RESULT(path, realpath(location.path_)); TRY_RESULT(path, realpath(location.path_, true));
if (bad_paths_.count(path) != 0) { if (bad_paths_.count(path) != 0) {
return Status::Error("Sending of internal database files is forbidden"); return Status::Error("Sending of internal database files is forbidden");
} }

View File

@ -719,7 +719,7 @@ Status HttpReader::open_temp_file(CSlice desired_file_name) {
return Status::Error("Can't find temporary directory"); return Status::Error("Can't find temporary directory");
} }
TRY_RESULT(dir, realpath(tmp_dir)); TRY_RESULT(dir, realpath(tmp_dir, true));
CHECK(!dir.empty()); CHECK(!dir.empty());
auto first_try = try_open_temp_file(dir, desired_file_name); auto first_try = try_open_temp_file(dir, desired_file_name);

View File

@ -81,13 +81,19 @@ Status rename(CSlice from, CSlice to) {
return Status::OK(); return Status::OK();
} }
Result<string> realpath(CSlice slice) { Result<string> realpath(CSlice slice, bool ignore_access_denied) {
char full_path[PATH_MAX + 1]; char full_path[PATH_MAX + 1];
string res;
char *err = skip_eintr([&] { return ::realpath(slice.c_str(), full_path); }); char *err = skip_eintr([&] { return ::realpath(slice.c_str(), full_path); });
if (err != full_path) { if (err != full_path) {
return OS_ERROR(PSLICE() << "Realpath failed for \"" << slice << '"'); if (ignore_access_denied && errno == EACCES) {
res = slice.str();
} else {
return OS_ERROR(PSLICE() << "Realpath failed for \"" << slice << '"');
}
} else {
res = full_path;
} }
string res = full_path;
if (res.empty()) { if (res.empty()) {
return Status::Error("Empty path"); return Status::Error("Empty path");
} }
@ -225,7 +231,7 @@ Status rename(CSlice from, CSlice to) {
return Status::OK(); return Status::OK();
} }
Result<string> realpath(CSlice slice) { Result<string> realpath(CSlice slice, bool /*ignore_access_denied*/) {
wchar_t buf[MAX_PATH + 1]; wchar_t buf[MAX_PATH + 1];
TRY_RESULT(wslice, to_wstring(slice)); TRY_RESULT(wslice, to_wstring(slice));
auto status = GetFullPathNameW(wslice.c_str(), MAX_PATH, buf, nullptr); auto status = GetFullPathNameW(wslice.c_str(), MAX_PATH, buf, nullptr);

View File

@ -38,7 +38,7 @@ namespace td {
Status mkdir(CSlice dir, int32 mode = 0700) TD_WARN_UNUSED_RESULT; Status mkdir(CSlice dir, int32 mode = 0700) TD_WARN_UNUSED_RESULT;
Status mkpath(CSlice path, int32 mode = 0700) TD_WARN_UNUSED_RESULT; Status mkpath(CSlice path, int32 mode = 0700) TD_WARN_UNUSED_RESULT;
Status rename(CSlice from, CSlice to) TD_WARN_UNUSED_RESULT; Status rename(CSlice from, CSlice to) TD_WARN_UNUSED_RESULT;
Result<string> realpath(CSlice slice) TD_WARN_UNUSED_RESULT; Result<string> realpath(CSlice slice, bool ignore_access_denied = false) TD_WARN_UNUSED_RESULT;
Status chdir(CSlice dir) TD_WARN_UNUSED_RESULT; Status chdir(CSlice dir) TD_WARN_UNUSED_RESULT;
Status rmdir(CSlice dir) TD_WARN_UNUSED_RESULT; Status rmdir(CSlice dir) TD_WARN_UNUSED_RESULT;
Status unlink(CSlice path) TD_WARN_UNUSED_RESULT; Status unlink(CSlice path) TD_WARN_UNUSED_RESULT;