From f76324d66398ae45772134f51d1b0e031c35e149 Mon Sep 17 00:00:00 2001 From: Coldwings Date: Mon, 17 Feb 2025 12:33:52 +0800 Subject: [PATCH 1/2] fix on path Walker --- fs/localfs.cpp | 5 +++-- fs/path.cpp | 37 +++++++++++++++++++------------------ fs/path.h | 6 +++--- 3 files changed, 25 insertions(+), 23 deletions(-) diff --git a/fs/localfs.cpp b/fs/localfs.cpp index e133bfad..0ddaf280 100644 --- a/fs/localfs.cpp +++ b/fs/localfs.cpp @@ -316,8 +316,9 @@ namespace fs virtual dirent* get() override { if (direntp) { - memcpy(&m_dirent, direntp, sizeof(m_dirent)); - return &m_dirent; + memcpy(&m_dirent, direntp, + std::min(sizeof(m_dirent), (size_t)direntp->d_reclen)); + return &m_dirent; } return direntp; } diff --git a/fs/path.cpp b/fs/path.cpp index 5d95b4db..196df6c8 100644 --- a/fs/path.cpp +++ b/fs/path.cpp @@ -254,13 +254,14 @@ namespace fs } int ret = next(); if (ret < 0) - m_path = {0, 0}; + m_path_len = 0; } int Walker::enter_dir() { auto dir = m_filesystem->opendir(m_path_buffer); if (!dir) - LOG_ERRNO_RETURN(0, -1, "failed to opendir(`)", m_path); + LOG_ERRNO_RETURN(0, -1, "failed to opendir(`)", + std::string_view(m_path_buffer, m_path_len)); m_stack.emplace(dir); return 0; } @@ -273,36 +274,36 @@ namespace fs struct stat st; auto ret = m_filesystem->lstat(m_path_buffer, &st); if (ret < 0) - LOG_ERRNO_RETURN(0, -1, "failed to lstat '`'", m_path); + LOG_ERRNO_RETURN(0, -1, "failed to lstat '`'", + std::string_view(m_path_buffer, m_path_len)); return S_ISDIR(st.st_mode); } return 0; } - void Walker::path_push_back(string_view s) - { - auto len0 = m_path.length(); + void Walker::path_push_back(string_view s) { + auto len0 = m_path_len; auto len1 = s.length(); assert(len0 + len1 < sizeof(m_path_buffer) - 1); memcpy(m_path_buffer + len0, s.data(), len1 + 1); - m_path = string_view(m_path_buffer, len0 + len1); + m_path_len = len0 + len1; } - void Walker::path_pop_back(size_t len1) - { - auto len0 = m_path.length(); + void Walker::path_pop_back(size_t len1) { + auto len0 = m_path_len; assert(len0 > len1); len0 -= len1; m_path_buffer[len0] = '\0'; - m_path = string_view(m_path_buffer, len0); + m_path_len = len0; } int Walker::next() { again: - if (m_path.empty()) return -1; - if (m_path.back() != '/') + if (m_path_len == 0) return -1; + std::string_view path(m_path_buffer, m_path_len); + if (path.back() != '/') { - auto m = m_path.rfind('/'); - if (m != m_path.npos) { - auto len0 = m_path.length(); + auto m = path.rfind('/'); + if (m != path.npos) { + auto len0 = path.length(); path_pop_back(len0 - m - 1); m_stack.top()->next(); } @@ -321,10 +322,10 @@ namespace fs m_stack.pop(); if (m_stack.empty()) { - m_path.remove_prefix(m_path.length()); + m_path_len = 0; return -1; // finished walking } - assert(m_path.back() == '/'); + assert(m_path_buffer[m_path_len - 1] == '/'); path_pop_back(1); goto again; } diff --git a/fs/path.h b/fs/path.h index 98d52ada..23bdf4d1 100644 --- a/fs/path.h +++ b/fs/path.h @@ -168,13 +168,13 @@ namespace fs { public: Walker(IFileSystem* fs, string_view path); - string_view path() { return m_path; } + string_view path() { return {m_path_buffer, m_path_len}; } string_view get() { return path(); } - bool valid() { return !m_path.empty(); } + bool valid() { return m_path_len; } int next(); protected: - string_view m_path; + size_t m_path_len; IFileSystem* m_filesystem; std::stack> m_stack; char m_path_buffer[PATH_MAX]; From 9b489ea2dbb8ecc7365dff97433224a02dcf9f20 Mon Sep 17 00:00:00 2001 From: Coldwings Date: Mon, 17 Feb 2025 12:33:52 +0800 Subject: [PATCH 2/2] fix on path Walker --- fs/path.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/fs/path.h b/fs/path.h index 23bdf4d1..227c89aa 100644 --- a/fs/path.h +++ b/fs/path.h @@ -174,7 +174,11 @@ namespace fs int next(); protected: +<<<<<<< HEAD size_t m_path_len; +======= + size_t m_path_len = 0; +>>>>>>> 143de49 (fix on path Walker) IFileSystem* m_filesystem; std::stack> m_stack; char m_path_buffer[PATH_MAX];