diff options
author | mrlolthe1st <mrlolthe1st@yandex-team.com> | 2024-03-06 11:58:00 +0300 |
---|---|---|
committer | mrlolthe1st <mrlolthe1st@yandex-team.com> | 2024-03-06 12:14:29 +0300 |
commit | 4647a9220b623aad5b9c60f90550cf542d8622b9 (patch) | |
tree | 201bc40a5f5917dcbcc5b900cc7dd1e28293b530 /util/folder/iterator.h | |
parent | b72e88953a917095b4a964e8d12251f293692162 (diff) | |
download | ydb-4647a9220b623aad5b9c60f90550cf542d8622b9.tar.gz |
Fix TDirIterator
В силу того, что аллокации могут приводить к syscalls, которые портят errno, а lstat не чистит errno после успешного выполнения, между errno=0/ClearLastSystemError() и LastSystemError() что-то может попортить errno, следует учитывать errno только в случае неуспешного завершения lstat.
ee85894d4fb742827b7ea77e06b9b2c990537d86
Diffstat (limited to 'util/folder/iterator.h')
-rw-r--r-- | util/folder/iterator.h | 7 |
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_ << "'"; } } |