On Thu, Mar 30, 2006 at 02:23:17PM +0400, Dmitry V. Levin wrote:
> On Thu, Mar 30, 2006 at 02:10:18PM +0400, Anton Farygin wrote:
> > Sergey Bolshakov wrote:
> > >>>>>> "Anton" == Anton Farygin <rider-u2l5PoMzF/VWk0Htik3J/[EMAIL
> > >>>>>> PROTECTED]> writes:
> > >>>>>>
> > > [skipped]
> > > >>> testcase я вроде как нашёл, который воспроизводит багу с неответом
> > > от
> > > >>> apt-pipe:
> > > >>>
> > > >>> запустить apt-shell
> > > >>> далее делаем такую последовательность команд:
> > > >>> ls -g
> > > >>> ls -G Sound
> > > >>> ls -g
> > > >>> ls
> > > >>>
> > > >>> после этого наблюдаем вывод от команды ls в стиле ls -G Sound
> > >
> > > Если ты запускаешь именно apt-shell, то это последствия
> > > последнего чанка из apt-0.5.15cnc6-alt-apt-shell.patch,
> > > в apt-pipe это место выглядит иначе.
> > >
> > Да, я уже забрал из apt-pipe это поведение.
> >
> > В общем сейчас у меня никаких нареканий нет.
>
> Так, у кого из вас сейчас самая последняя сборка apt'а?
> Мне тоже нужно кое-что проверить.
Дима, я тут покопался ещё и есть кое-какие вопросы и к тебе.
Пересмотри там пару кусков про rpm - что-то оно подозрительно выглядит.
+++++++++++++ versionmatch.cc
// CNC:2003-11-05 - Patch by ALT-Linux, which ignores the release
// if it was not provided, and the epoch.
string s(A), sc(A);
const char *Ab = s.c_str(), *Ac = sc.c_str();
for (string::iterator i = s.begin(), k = sc.begin(); i != s.end(); ++i,++k)
{
if (*i == ':')
{
Ab = &(*i) + 1;
Ac = &(*k) + 1;
}
else if (*i == '-')
{
*i = 0;
break;
}
}
+++++++++++++
Опять опасные игры с c_str(), компилятор может запросто выделить один и тот же
статический буфер и под Ab, и под Ac, в результате последующие хаки на самом
деле будут корёжить один и тот же буфер. Если требуется временный буфер для
char*, то надо использовать vector, а не string.
+++++++++++++ tagfile.cc
Buffer = 0;
Start = End = Buffer = 0;
+++++++++++++
Из разряда приколов, Buffer видимо для уверенности два раза обнуляется.
Но это ещё не всё, дальше идёт вызов Fill
+++++++++++++
memmove(Buffer,Start,EndSize);
Start = Buffer;
End = Buffer + EndSize;
+++++++++++++
Наверное с нулевыми указателями всё-таки авторам стоило бы быть острожнее, хотя
там везде нули.
++++++++++++
unsigned char Visited[256]; // Bit 1 is Order, Bit 2 is Rewrite
for (unsigned I = 0; I != 256; I++)
Visited[I] = 0;
++++++++++++
Очередной прикол.
++++++++++++ pkgcache.cc
pkgCache::Version **pkgCache::DepIterator::AllTargets()
++++++++++++
Уникальный по производительности код (кажется voins уже находил его)
Сначала бегаем два раза по циклам только для того чтобы вычислить
какой же размер нужен нам для списка.
потом ещё раз бегаем два раза по тем же циклам, но уже заполняем-таки
результирующий список значениями.
+++++++++++ acquire.cc
while (Items.size() != 0)
delete Items[0];
+++++++++++
Странная чистка вектора.
++++++++++++ rpm/rpmindexfile.cc
string rpmSinglePkgIndex::ArchiveURI(string File) const
{
char *cwd = getcwd(NULL,0);
.....
free(cwd);
}
++++++++++++
Из документации:
--
If buf is NULL, the behaviour of getcwd() is undefined.
--
Аналогичный код в string rpmSingleSrcIndex::ArchiveURI(string File) const
+++++++++++++ rpm/rpmlistparser.cc
char **strings = NULL;
res = headerGetEntry(header, *sec, &type, (void **)&strings, &count);
.....
+++++++++++++
Дима, наверное тебе стоит пересмотреть этот кусок, кажется тут теряется память,
аналогично в bool rpmListParser::ParseDepends(pkgCache::VerIterator Ver,
unsigned int Type)
Там как-то странно делается освобождение.
_______________________________________________
Devel-conf mailing list
[email protected]
https://lists.altlinux.org/mailman/listinfo/devel-conf