rime / librime

Rime Input Method Engine, the core library
https://rime.im
BSD 3-Clause "New" or "Revised" License
3.37k stars 551 forks source link

Coredump when permission denied in old log cleaning #871

Closed Timicasto closed 5 months ago

Timicasto commented 5 months ago

Describe the bug Recently I soft-linked a directory that belongs to another user to my home folder, and rime engine can't startup after a reboot. I have debugged the coredump file and got the following informations.

    at /usr/src/debug/gcc/gcc-build/x86_64-pc-linux-gnu/libstdc++-v3/include/bits/new_allocator.h:104
        ec = std::error_code = {"generic": EACCES}
        result = {_M_type = <optimized out>, _M_perms = <optimized out>}
#9  0x00007901d5d71ec1 in std::filesystem::__cxx11::directory_entry::status (this=0x64249dae56c0) at /usr/include/c++/13.2.1/bits/fs_dir.h:279
#10 std::filesystem::__cxx11::directory_entry::_M_file_type (this=0x64249dae56c0) at /usr/include/c++/13.2.1/bits/fs_dir.h:346
#11 std::filesystem::__cxx11::directory_entry::_M_file_type (this=0x64249dae56c0) at /usr/include/c++/13.2.1/bits/fs_dir.h:342
#12 std::filesystem::__cxx11::directory_entry::is_regular_file (this=0x64249dae56c0) at /usr/include/c++/13.2.1/bits/fs_dir.h:222
#13 rime::CleanOldLogFiles::Run (this=<optimized out>, deployer=<optimized out>) at /usr/src/debug/librime/librime/src/rime/lever/deployment_tasks.cc:649
--Type <RET> for more, q to quit, c to continue without paging--c
        file_name = "music"
        entry = @0x64249dae56c0: {_M_path = filesystem::path "./music" = {[0] = ".", [1] = "music"}, _M_type = std::filesystem::file_type::symlink}
        __for_range = @0x7fff1d227af0: {_M_dir = {<std::__shared_ptr_access<std::filesystem::__cxx11::_Dir, (__gnu_cxx::_Lock_policy)2, false, false>> = {<No data fields>}, _M_ptr = 0x64249dae5690, _M_refcount = {_M_pi = 0x64249dae5680}}}
        __for_begin = {_M_dir = {<std::__shared_ptr_access<std::filesystem::__cxx11::_Dir, (__gnu_cxx::_Lock_policy)2, false, false>> = {<No data fields>}, _M_ptr = 0x64249dae5690, _M_refcount = {_M_pi = 0x64249dae5680}}}
        __for_end = {_M_dir = {<std::__shared_ptr_access<std::filesystem::__cxx11::_Dir, (__gnu_cxx::_Lock_policy)2, false, false>> = {<No data fields>}, _M_ptr = <optimized out>, _M_refcount = {_M_pi = <optimized out>}}}
        files = std::vector of length 0, capacity 0
        dir = <optimized out>
        __for_range = std::vector of length 2, capacity 2 = {"/tmp/", "./"}
        __for_begin = Python Exception <class 'gdb.error'>: value has been optimized out

        __for_end = Python Exception <class 'gdb.error'>: value has been optimized out

        success = <optimized out>
        ymd = ".20240512\000\000"
        now = 1715447299
        today = ".20240512"
        dirs = std::vector of length 2, capacity 2 = {"/tmp/", "./"}
        removed = <optimized out>

So I think the problem is caused by https://github.com/rime/librime/blob/master/src/rime/lever/deployment_tasks.cc#L647 It got a permission denied while judging whether the path is a symbolic link, and blew up

Flavor(please complete the following information): Select your flavor:

Package:

eagleoflqj commented 5 months ago

Not a use case that librime supports.