Alexey Korop
2005-03-16 05:37:06 UTC
Привет, All!
Я попытался разобраться, почему новый DN/2 у многих падает в архивах. Hачал
тыкаться во все подряд архивы, какие у меня есть, нашёл такой, в котором
устойчиво падает. В нём же при тех же операциях ни beta16, ни DN OSP 490 не
падают.
Дошагал до падения и слегка обалдел. Почему новый DN падает, вроде,
понятно. А вот почему не падают все остальные - этого я понять не могу.
Вот фрагмент из ARCVIEW.PAS, TArcDrive.GetDirectory, ближе к концу. Это из
форматированного DN/2, в beta13 DN/2 и в DN OSP 490 то же самое, с точностью до
форматирования.
{else FD^.Insert(F);}
else
FD^.AtInsert(si, F);
end
else
Continue;
if AFiles^.Search(F, si) then
DelFileRec(F)
{else AFiles^.Insert(F);}
else
AFiles^.AtInsert(si, F);
end;
NoMemory := MAvail <= MemReq;
FreeSpace := '';
TotalInfo := TTL;
История падения такая:
FD^.AtInsert(si, F);
if AFiles^.Search(F, si) then
DelFileRec(F)
Перед этим F^.UsageCount=1, так что DelFileRec освобождает память, а в FD^
ссылка на эту память остаётся.
По-моему, это заведомый баг в программе. Почему оно не падает в других
версиях - я не понимаю.
Падение появляется после патча mv50225a.dif (переименованный
dn2a08-archivers_optimization.patch):
======== OS/2 clipboard start
изменено определено LIM и SQZ (longint вместо string)
вычищает всякий мусор (ненужные использования строковых переменных)
оптимизировано добавление файла в ArcDrive
======== OS/2 clipboard end
Похоже на то, что в программе всегда была заложена эта мина, а теперь
Максим на неё наступил. Я ему отписал, пусть попробует разминировать.
Hу а пока следует откатить mv50225a.dif.
С уважением, Alexey.
...В действительности всё совсем не так, как на самом деле.
Я попытался разобраться, почему новый DN/2 у многих падает в архивах. Hачал
тыкаться во все подряд архивы, какие у меня есть, нашёл такой, в котором
устойчиво падает. В нём же при тех же операциях ни beta16, ни DN OSP 490 не
падают.
Дошагал до падения и слегка обалдел. Почему новый DN падает, вроде,
понятно. А вот почему не падают все остальные - этого я понять не могу.
Вот фрагмент из ARCVIEW.PAS, TArcDrive.GetDirectory, ближе к концу. Это из
форматированного DN/2, в beta13 DN/2 и в DN OSP 490 то же самое, с точностью до
форматирования.
{else FD^.Insert(F);}
else
FD^.AtInsert(si, F);
end
else
Continue;
if AFiles^.Search(F, si) then
DelFileRec(F)
{else AFiles^.Insert(F);}
else
AFiles^.AtInsert(si, F);
end;
NoMemory := MAvail <= MemReq;
FreeSpace := '';
TotalInfo := TTL;
История падения такая:
FD^.AtInsert(si, F);
if AFiles^.Search(F, si) then
DelFileRec(F)
Перед этим F^.UsageCount=1, так что DelFileRec освобождает память, а в FD^
ссылка на эту память остаётся.
По-моему, это заведомый баг в программе. Почему оно не падает в других
версиях - я не понимаю.
Падение появляется после патча mv50225a.dif (переименованный
dn2a08-archivers_optimization.patch):
======== OS/2 clipboard start
изменено определено LIM и SQZ (longint вместо string)
вычищает всякий мусор (ненужные использования строковых переменных)
оптимизировано добавление файла в ArcDrive
======== OS/2 clipboard end
Похоже на то, что в программе всегда была заложена эта мина, а теперь
Максим на неё наступил. Я ему отписал, пусть попробует разминировать.
Hу а пока следует откатить mv50225a.dif.
С уважением, Alexey.
...В действительности всё совсем не так, как на самом деле.