Summary: | SegFault при удалении пакета с пустым тегом Arch | ||
---|---|---|---|
Product: | Sisyphus | Reporter: | Vitaly Lipatov <lav> |
Component: | libapt | Assignee: | Ivan Zakharyaschev <imz> |
Status: | CLOSED FIXED | QA Contact: | qa-sisyphus |
Severity: | major | ||
Priority: | P5 | CC: | a, aen, boyarsh, darktemplaralt, glebfm, imz, klark, ldv, nbr, placeholder, rider |
Version: | unstable | ||
Hardware: | x86_64 | ||
OS: | Linux | ||
Bug Depends on: | |||
Bug Blocks: | 41405 |
Description
Vitaly Lipatov
2020-06-25 19:49:51 MSK
... > rpm/rpmpm.cc:84: > Name = Name + "." + Pkg.CurrentVer().Arch(); Предполагаю, что падение из-за реализации Arch(), которая способна вернуть 0: pkgCache::VerIterator::Arch (this=<optimized out>, this=<optimized out>) at ../include/apt-pkg/cacheiterators.h:137 137 inline const char *Arch() const {return Ver->Arch == 0?0:Owner->StrP + Ver->Arch;}; С помощью $ rpm -q --queryformat "%{name}:%{ARCH}\n" выявил пакет с незаполненным ARCH, это оказался $ rpm -qi gpg-pubkey Name : gpg-pubkey Version : df7587c3 Release : 576a5c23 Architecture: (none) Install Date: Вс 10 дек 2017 16:32:01 Group : Public Keys Size : 0 License : pubkey Signature : (none) Source RPM : (none) Build Date : Ср 22 июн 2016 12:36:35 Build Host : localhost Relocations : (not relocatable) Packager : Skype Linux Client Repository <se-um@microsoft.com> Summary : gpg(Skype Linux Client Repository <se-um@microsoft.com>) apt-get remove gpg-pubkey давало падение, так что удалил его через rpm -e и проблема ушла. Вывод: надо бы добавить проверку на пустой Arch() перед прибавлением к Name + "." + ... Это поведение уже давным давно исправлено уже даже не знаю в каком баге и коммите. Ждём нового apt от ментейнеров. (In reply to Vitaly Lipatov from comment #1) > ... (In reply to Anton Farygin from comment #2) > Это поведение уже давным давно исправлено уже даже не знаю в каком баге и > коммите. > > Ждём нового apt от ментейнеров. Всё верно. Проблема в пакете gpg-pubkey, который создаётся командой rpm --import ${gpg_key_filename}. Патч также был давно предложен мэйнтейнерам apt: https://lists.altlinux.org/pipermail/devel/2020-January/209748.html (Ответ для Aleksei Nikiforov на комментарий #3) > (In reply to Vitaly Lipatov from comment #1) > > ... > > (In reply to Anton Farygin from comment #2) > > Это поведение уже давным давно исправлено уже даже не знаю в каком баге и > > коммите. > > > > Ждём нового apt от ментейнеров. > > Всё верно. Проблема в пакете gpg-pubkey, который создаётся командой rpm > --import ${gpg_key_filename}. Патч также был давно предложен мэйнтейнерам > apt: > > https://lists.altlinux.org/pipermail/devel/2020-January/209748.html А мэйнтейнеры apt не могут принимать короткие багфиксы? *** Bug 38381 has been marked as a duplicate of this bug. *** Спасибо! В 0.5.15lorg2-alt72 исправляется. И есть тест http://git.altlinux.org/gears/a/apt.git?p=apt.git;a=blob;f=test/integration/test-apt-remove-gpg-pubkey;h=ccfc5530f0b8e5d03b4fb94f798a3a9cfd9341c1;hb=HEAD : #!/bin/bash set -eu TESTDIR=$(readlink -f $(dirname $0)) . $TESTDIR/framework if [ -z "${APT_TEST_GPGPUBKEY}" ]; then msgskip exit 0 fi setupenvironment testpkginstalled 'gpg-pubkey' testsuccess aptget -y remove 'gpg-pubkey' testpkgnotinstalled 'gpg-pubkey' который включен, если при запуске тестов в переменной APT_TEST_GPGPUBKEY передать путь к ключу для предварительного импорта в setupenvironment(). (In reply to Ivan Zakharyaschev from comment #6) > Спасибо! > > В 0.5.15lorg2-alt72 исправляется. http://git.altlinux.org/gears/a/apt.git?p=apt.git;a=commitdiff;h=8f8259650bf3bd660710da31d872791d1fbca61e commit 8f8259650bf3bd660710da31d872791d1fbca61e Author: Aleksei Nikiforov <darktemplar@altlinux.org> Date: Fri Jan 31 10:24:42 2020 +0300 Fix crash when removing 3rd-party packages with some tags missing (ALT#38381, ALT#38642) (cherry picked from commit 5395de392b261c394da31fe41c8a949a60b83277) diff --git a/apt-pkg/rpm/rpmpm.cc b/apt-pkg/rpm/rpmpm.cc index b1da515bd..287de77e2 100644 --- a/apt-pkg/rpm/rpmpm.cc +++ b/apt-pkg/rpm/rpmpm.cc @@ -67,7 +67,14 @@ std::string rpm_name_conversion(const pkgCache::PkgIterator &Pkg) // This is needed for removal to work on multilib packages, but old // rpm versions don't support name.arch in RPMDBI_LABEL, oh well... - Name = Name + "." + Pkg.CurrentVer().Arch(); + { + const char * const Arch = Pkg.CurrentVer().Arch(); + + // Note: some 3rd-party packages may still miss arch, so only use it + // when it's present + if (Arch && *Arch) + Name = Name + "." + Arch; + } return Name; } diff --git a/test/integration/test-apt-remove-gpg-pubkey b/test/integration/test-apt-remove-gpg-pubkey index dcf0a04a4..ccfc5530f 100755 --- a/test/integration/test-apt-remove-gpg-pubkey +++ b/test/integration/test-apt-remove-gpg-pubkey @@ -1,8 +1,6 @@ #!/bin/bash set -eu -APT_TEST_XFAIL=YES - TESTDIR=$(readlink -f $(dirname $0)) . $TESTDIR/framework Хорошо бы добавить тест на все поля, которые не должны быть null, если они есть. |