aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormrlolthe1st <mrlolthe1st@yandex-team.com>2024-03-06 11:58:00 +0300
committermrlolthe1st <mrlolthe1st@yandex-team.com>2024-03-06 12:14:29 +0300
commit4647a9220b623aad5b9c60f90550cf542d8622b9 (patch)
tree201bc40a5f5917dcbcc5b900cc7dd1e28293b530
parentb72e88953a917095b4a964e8d12251f293692162 (diff)
downloadydb-4647a9220b623aad5b9c60f90550cf542d8622b9.tar.gz
Fix TDirIterator
В силу того, что аллокации могут приводить к syscalls, которые портят errno, а lstat не чистит errno после успешного выполнения, между errno=0/ClearLastSystemError() и LastSystemError() что-то может попортить errno, следует учитывать errno только в случае неуспешного завершения lstat. ee85894d4fb742827b7ea77e06b9b2c990537d86
-rw-r--r--util/folder/iterator.h7
1 files changed, 2 insertions, 5 deletions
diff --git a/util/folder/iterator.h b/util/folder/iterator.h
index 69e025b9c4..c79d56c654 100644
--- a/util/folder/iterator.h
+++ b/util/folder/iterator.h
@@ -69,13 +69,10 @@ public:
Trees_[0] = Path_.begin();
Trees_[1] = nullptr;
- ClearLastSystemError();
FileTree_.Reset(yfts_open(Trees_, Options_.FtsOptions, Options_.Cmp));
- const int err = LastSystemError();
-
- if (err) {
- ythrow TError(err) << "can not open '" << Path_ << "'";
+ if (!FileTree_.Get() || FileTree_->fts_cur->fts_link->fts_errno) {
+ ythrow TError(FileTree_.Get() ? FileTree_->fts_cur->fts_link->fts_errno : LastSystemError()) << "can not open '" << Path_ << "'";
}
}