Bug 930

Summary: 1Cv77: Ошибка в установке конфигурации "1С Универсал"
Product: WINE@Etersoft Reporter: Константин Кондратюк <kondratyuk>
Component: Установка программ / MSIAssignee: Svetlana Zhukova <svzhu>
Status: CLOSED FIXED QA Contact:
Severity: normal    
Priority: P5 CC: baraka, lav, pda, svzhu, vitperov
Version: 1.0.9   
Target Milestone: ---   
Hardware: PC   
OS: Linux   
Whiteboard:
Заявки RT: Связано с:
Дата напоминания:
Bug Depends on: 1317    
Bug Blocks: 777, 961, 7107    
Attachments: ci-temp0.cab
?1
?2

Description Константин Кондратюк 2007-12-11 10:50:46 MSK
Конфигурация не устанавливается с ошибкой 
"FDICopy() failed: code 2 [ci-temp0.cab]"
на этапе создания временных файлов.
Comment 1 Константин Кондратюк 2007-12-11 10:58:53 MSK
trace:file:CreateFileW returning 0x64
trace:file:ReadFile 0x64 0x7e429764 36 0x7e4296e8 (nil)
err:cabinet:FDICopy FDIIsCabinet failed.
Comment 2 Константин Кондратюк 2007-12-11 11:01:37 MSK
Код, возвращающий ошибку:
  /* check if it's really a cabfile. Note that this doesn't implement the bug */
  if (!FDI_read_entries(hfdi, cabhf, &fdici, &(CAB(mii)))) {
    ERR("FDIIsCabinet failed.\n");
    PFDI_CLOSE(hfdi, cabhf);
    return FALSE;
  }
Comment 3 Константин Кондратюк 2007-12-11 12:34:24 MSK
Проверка проваливается, если cab-файл не содержит файлов или каталогов. А исследуемый файл весит всего 36 байт.
Comment 4 Константин Кондратюк 2007-12-11 12:35:28 MSK
Created attachment 213 [details]
ci-temp0.cab
Comment 5 Константин Кондратюк 2007-12-12 10:32:28 MSK
Подстановка нативного cabinet.dll позволяет обойти проблему маленького cab-файла.
Впоследствии может возникнуть проблема с кодировками имён файлов. Системная кодировка не должна быть KOI8 (проверено - на CP1251 работает).
Comment 6 Vitaly Lipatov 2007-12-15 19:56:28 MSK
Когда мы будем писать комментарии, в которых будет суть проблемы?
Один из файлов в архиве содержит в имени знак № (номер), и установка не сможет пройти в кодировке локали, которая не имеет такого знака (например, с кодировкой koi8-r).

По коду проверки CAB-файла - нужен патч, отключающий return FALSE, с сохранением сообщения об ошибке.
Comment 7 Vitaly Lipatov 2007-12-28 21:32:36 MSK
Почему разборки с багами начинаются, и не заканчиваются?
Надо уж написать тест красивый, отправить в wine-patches,
проблему исправить...
Comment 8 Vitaly Lipatov 2008-03-12 21:37:16 MSK
Надо исправить окончательно к релизу.
Comment 9 Виталий Перов 2008-03-13 21:16:24 MSK
Как я понял, FDICopy вызвает функцию FDI_read_entries, в которой и происходит ошибка.
А ошибка в следующем:
Где-то в FDI_read_entries (fdi.c:565) идёт проверка на то сколько директорий содержит cab-файл. Если не содержит ни одной, то возвращает FALSE.
Далее FDICopy видит, что проверка не выполнилась, и тоже возвращает FALSE.
А Windows в этом случае возвращает TRUE
Comment 10 Виталий Перов 2008-03-17 18:34:45 MSK
Проверил: могут быть такие cab-файлы, которые содержат файлы, но не содержат директории (бага 1086 - тестовый файл test6.cab)

Очевидно, что проверку на отсутствие директорий надо просто выкинуть.
При этом функция FDI_read_entries() или вызывающая её FDICopy() может работать с ошибками. Надо проверить
Comment 11 Виталий Перов 2008-03-17 19:34:49 MSK
Проверил: Если в cab-файле нету папок, но есть, хотя бы один файл, то комманда 
num_folders = EndGetI16(buf+cfhead_NumFolders);
Всё-равно находит 1 директорию.

В случает, если в cab-файле нет ни папок, ни файлов, то данная комманда говорит, что директорий 0.

Думаю, что в данном случае, не следует удалять проверку на количесво директорий, а сделать так, чтобы она возвращала, например, EMPTY_CABINET.
Далее FDI_Copy смотрит возвращаемое значение, и если оно EMPTY_CABINET, то просто возвращает TRUE.

Таким образом, если папок 0, значит сab-файл пустой. Значит можно сразу возвратить TRUE (т.к он правильный, но нечего распаковывать)
Comment 12 Виталий Перов 2008-03-18 13:24:09 MSK
Проблемы могут возникнуть в том случае, когда cab-файл битый, а мы будем считать его правильным.
Но думаю, что это не произойдёт, ведь до проверки на наличие папок стоит ещё несколько проверок.
Comment 13 Виталий Перов 2008-03-18 15:30:18 MSK
Исправил. Тест проходит.

Ещё несколько функций используют FDI_read_entries(). И если она возвратит EMPTY_CABINET, то они будут считать это как TRUE.

Попробовал убрать в FDICopy() проверку на EMPTY_CABINET (т.е FDICopy считает, что  
FDI_read_entries() возвращает TRUE, и идёт дальше. В результате возникает ошибка доступа.

Получается, что просто TRUE или EMPTY_CABINET возвращать нельзя. Иначе придётся переписывать и другие функции, чтобы они тоже ловили EMPTY_CABINET.
Comment 14 Виталий Перов 2008-03-18 15:46:01 MSK
Попробовал просто убрать проверку на наличие директорий и файлов.
В итоге FDI_read_entries() завершается без ошибок, а ошибка возникает в FDICopy() при чтении папок
Comment 15 Виталий Перов 2008-03-18 16:05:12 MSK
Нет, всё-таки чтение папок и файлов проходит нормально, а ошибка возникает при чтени файлов в выражении:
for (file = CAB(firstfile); (file); file = file->next) { .... 
Comment 16 Виталий Перов 2008-03-18 16:40:22 MSK
Заполнение структуры pfdici происходит в конце функции FDI_read_entries().

Поэтому, если количество папок=0, то возвращать EMPTY_CABINET надо не сразу после проверки на количество папок, а в самом конце, перед выходом. Тогда структура pfdici будет нормально заполнена.

Ещё можно добавить проверку на ситуацию когда папок не 0, а файлов 0. Такого быть  не может. 
Comment 17 Виталий Перов 2008-03-18 18:26:38 MSK
Думаю, что бага исправлена.
Патч находится в wine-etersoft-public/patches/check/dlls_cabinet_empty-cab.patch
Comment 18 Vitaly Lipatov 2008-03-19 11:11:50 MSK
Ты не можешь возвращать из FDI_read_entries
TRUE, FALSE, EMPTY_CABINET
надо 3 самостоятельные константы.

И нельзя ли всё-таки обустроить так, чтобы FDI_read_entries возвращала TRUE/FALSE, а дальше с 0 количеством файлов разборка шла как-то общим порядком (без особого исключения для 0 количества файлов)
Comment 19 Виталий Перов 2008-03-20 18:23:38 MSK
Согласен, что мой вариант не особо красивый. Но возвращать какие-то константы вместо TRUE и FALSE нельзя: ведь другие функции, использующие FDI_read_entries() ожидают именно TRUE или FALSE.
Но всё должно работать потому, что EMPTY_CABINET != 0 , а следовательно другие программы считают его за TRUE.
Comment 20 Виталий Перов 2008-04-01 20:58:21 MSD
Переписал.
Теперь при пустом cab-файле FDI_read_entries() возвращает TRUE.
При этом пришлось поправить FDICopy(), так как она при этом падала
Comment 21 Vitaly Lipatov 2008-05-27 09:54:45 MSD
Итак, каков результат по данной баге?
Comment 22 Виталий Перов 2008-05-27 15:34:45 MSD
Всё должно работать, надо только проверить в "1С Универсал".
Последнюю версию патча я, вроде, не закоммитил. Надо проверить
Comment 23 Виталий Перов 2008-06-22 14:27:44 MSD
в текущей версии патч отсутствует.
Сделал патч для git. Осталось только проверить 1С Универсал
Comment 24 Vitaly Lipatov 2008-06-22 14:48:02 MSD
Будет в сборке -eter12

commit 5e3b980bb4d0079b3472617605cc128367f1c513
Author: Vitaly Perov <vitperov@etersoft.ru>
Date:   Sun Jun 22 14:10:02 2008 +0400

    cabinet: fix bug #930: empty *.cab is count as invalid
Comment 25 Dmitry A. Petuhov 2008-07-08 16:45:24 MSD
(In reply to comment #24)
> Будет в сборке -eter12
> 
> commit 5e3b980bb4d0079b3472617605cc128367f1c513
> Author: Vitaly Perov <vitperov@etersoft.ru>
> Date:   Sun Jun 22 14:10:02 2008 +0400
> 
>     cabinet: fix bug #930: empty *.cab is count as invalid
> 

Проверил на последней бете - не работает
Comment 26 Vitaly Lipatov 2008-07-08 18:18:35 MSD
Конфигурация для тестирования установки:
/var/ftp/pvt/Windows/1C/2008-07/universal-080707-full.exe
Comment 27 Andrey Vusik 2008-07-08 20:26:32 MSD
Created attachment 555 [details]
?1

И снова эти квадратики...
Comment 28 Andrey Vusik 2008-07-08 20:28:28 MSD
Created attachment 556 [details]
?2

Вылет
Comment 29 Andrey Vusik 2008-07-08 20:31:51 MSD
Такого файла в директории нет.
Comment 30 Vitaly Lipatov 2008-07-08 21:33:54 MSD
Установку нельзя запускать в локали koi8-r (в этой кодировке нет символа №)
запускай через
$ LANG=ru_RU.CP1251 wine
Comment 31 Andrey Vusik 2008-07-08 21:53:04 MSD
Да -так всё работает. сборка wine-1.0.9-alt15