При подключении kio_ftp к FTP-серверу, который анонсирует MLST в ответе FEAT, но отклоняет команду MLSD (550), листинг каталога разбирается как MLSD-факты, хотя сервер вернул обычный LIST (unix-формат). В результате имена файлов содержат фрагменты колонок LIST. Регрессия: в kf6-kio 6.30.0-alt1 fallback на LIST работает корректно; ломано в 6.31.0-alt1 (воспроизведено на актуальном Sisyphus и на p11 с заданием 437689). Шаги воспроизведения: 1. Запустить FTP-сервер, который: - в ответ на FEAT возвращает " MLST Type*;Size*;Modify*;UNIX.mode*;" - на команду MLSD отвечает "550" - на LIST возвращает стандартный unix-listing (минимальный сервер на python прилагается: ftpsrv.py, режим "reject", запуск: python3 ftpsrv.py reject 2121, docroot /srv/ftproot) 2. Выполнить: kioclient ls ftp://127.0.0.1:2121/ Ожидаемый результат (kf6-kio 6.30): .hidden hello.txt link_to_hello subdir world .txt файл кириллица.txt Фактический результат (kf6-kio 6.31): 1 root root 7 Oct 27 14:45 .hidden 1 root root 6 Oct 27 14:45 hello.txt 1 root root 9 Oct 27 14:45 link_to_hello -> hello.txt 1 root root 4096 Oct 27 14:45 subdir 1 root root 6 Oct 27 14:45 world .txt 1 root root 4 Oct 27 14:45 файл кириллица.txt Т.е. в "имени" каждого элемента — хвост строки LIST (nlink, owner, group, size, дата), а не имя файла. В Dolphin/KIO-приложениях такие FTP-ресурсы показывают битые имена (скриншот прилагается). Анализ исходников (kio 6.30.0 vs 6.31.0, src/kioworkers/ftp/ftp.cpp): в 6.31 добавлен MLSD-режим. В listDir при неудаче MLSD есть fallback на LIST, но в ftpReadDir выбор парсера делается по флагу m_mlsdSupported, который выставляется по FEAT и не сбрасывается при отказе 550 на MLSD. Поэтому ответ LIST разбирается как MLSD-факты: factsPart = "-rw-r--r--", name = всё после первого пробела. Фикс: запоминать, какая команда (MLSD или LIST) реально открыла data-соединение, и выбирать парсер по ней (либо сбрасывать m_mlsdSupported при 550 на MLSD). Воспроизведено на свежей установке Sisyphus (kf6-kio-6.31.0-alt1). Контроль: kf6-kio-6.30.0-alt1 (p11) — корректно. Приложения: ftpsrv.py (сервер для воспроизведения), скриншот Dolphin.
Created attachment 22822 [details] Минимальный FTP-сервер для воспроизведения (режим reject: FEAT с MLST, MLSD → 550) FTP-сервер для воспроизведения: python3 ftpsrv.py reject 2121, затем kioclient ls ftp://127.0.0.1:2121/
Created attachment 22823 [details] Dolphin на Sisyphus (kf6-kio 6.31.0): битые имена FTP-листинга при reject-режиме сервера Скриншот Dolphin: ftp://127.0.0.1:2121, kf6-kio-6.31.0-alt1 (Sisyphus). Имена файлов содержат колонки LIST.
Created attachment 22824 [details] FTP-сервер для воспроизведения, v2: docroot без root (~/ftproot или argv[3]) Обновлённая версия ftpsrv.py: docroot по умолчанию ~/ftproot (root не нужен), путь можно передать третьим аргументом. Предыдущий attachment 22822 [details] с жёстким /srv/ftproot прошу считать устаревшим (obsolete выставлю в веб-интерфейсе).
kf6-kio-6.31.0-alt2 -> sisyphus: Thu Oct 29 2026 Sergey V Turchin <zerg@altlinux> 6.31.0-alt2 - add fix against KDE BUG #492660 (closes: 61243) - fix ftp listing (closes: 61241)