вторник, 25 марта 2014 г.

Ошибка закачки файлов с длинными именами

В DC++ клиентах найдена проблема.















Пример файла TTH = 7RNOHVHMMYX6TMHUKBXZ2I42MYCCVZSTNRY273I
он у некоторых пользователей имеет имя

Носов Евгений, Павлов Сергей, Пидоренко Игорь, Пищенко Виталий, Пухов Михаил, Пьянкова Таисия, Силецкий Александр, Сыч Евгений, Ткаченко Игорь, Федотов Дмитрий, Чарушников Олег, Шалин Анатолий - Румбы фантастики. 1988 год. Том II.fb2

После беглого просмотра скрина ошибки SCALOlaz выдал прикольную версию - виновен третий писатель этой коллекции электронных книг :) ... но ошибка оказалось совсем в другом

Windows накладывает ограничение на максимальную длину пути= 260 (MAX_PATH)
Длина этого имени файла 233 символа.

Смотрим на алгоритм получения временного файла для закачки в оригинальном DC++
данный код без изменений мигрировал во все дочерние клиенты.
dcplusplus\dcpp\QueueItem.cpp

namespace {
    const string TEMP_EXTENSION = ".dctmp";

    string getTempName(const string& aFileName, const TTHValue& aRoot) {
        string tmp(aFileName);
        tmp += "." + aRoot.toBase32();
        tmp += TEMP_EXTENSION;
        return tmp;
    }
}

он приводит к тому, что итоговый размер имени файла становится
на 46 символов длиннее т.к. к нему приписывает TTH, точка и временное расширение .dctmp
а это приводит к гарантированной ошибке открытия временного файла
в классе SharedFileStream 233 + 44 > 260

В ветках r5xx и r4xx данная проблема уже исправлена.



Комментариев нет: