Bug 35722

Summary: Роняет apt-get с SIGSEGV
Product: Sisyphus Reporter: Evgenii Terechkov <evg>
Component: rpm-plugin-syslogAssignee: placeholder <placeholder>
Status: CLOSED FIXED QA Contact: qa-sisyphus
Severity: critical    
Priority: P3 CC: at, glebfm, imz, iv, ldv, placeholder, sotor, vt
Version: unstable   
Hardware: all   
OS: Linux   

Description Evgenii Terechkov 2018-12-04 08:00:29 MSK
После установки rpm-plugin-syslog апт падает при попытке выполнить любую транзакцию, таким образом:

=8<=========================================================================
[Пн дек  3 15:44:32 2018] show_signal_msg: 73 callbacks suppressed
[Пн дек  3 15:44:32 2018] apt-get[25378]: segfault at 0 ip 00007fe269c0ac68 sp 00007ffc8423a2c0 error 4 in syslog.so[7fe269c0a000+1000]
[Пн дек  3 15:44:32 2018] Code: 00 48 89 c3 e8 99 fc ff ff a8 03 74 06 c7 03 00 00 00 00 48 89 ef e8 e7 fc ff ff 48 8d 3d b0 00 00 00 48 89 c6 b9 02 00 00 00 <f3> a6 0f 97 c0 1c 00 84 c0 74 15 c7 03 00 00 00 00 48 83 c4 08 31
=8<=========================================================================

увы, коредамп собрать не получилось.
Comment 1 Ivan A. Melnikov 2019-02-14 13:54:43 MSK
Воспроизводится на раз. В gdb:

Program received signal SIGSEGV, Segmentation fault.
syslog_tsm_pre (plugin=plugin@entry=0x4b87220, ts=ts@entry=0x4b6b260) at syslog.c:46
46          if (!rstreq(rpmtsRootDir(ts), "/"))
(gdb) bt
#0  syslog_tsm_pre (plugin=plugin@entry=0x4b87220, ts=ts@entry=0x4b6b260) at syslog.c:46
#1  0x00007ffff7a829c8 in rpmpluginsCallTsmPre (plugins=0x4b0300, ts=ts@entry=0x4b6b260) at rpmplugins.c:231
#2  0x00007ffff7a7be3a in rpmtsRun (ts=0x4b6b260, okProbs=okProbs@entry=0x0, ignoreSet=<optimized out>) at transaction.c:1507
#3  0x00007ffff7f0ec10 in pkgRPMLibPM::Process (this=0x4876a10, install=..., upgrade=std::vector of length 1, capacity 1 = {...}, uninstall=...) at rpm/rpmpm.cc:1029
#4  0x00007ffff7f106f2 in pkgRPMPM::Go (this=0x4876a10) at rpm/rpmpm.cc:402
#5  0x00007ffff7f4e335 in pkgPackageManager::DoInstall (this=this@entry=0x4876a10) at packagemanager.cc:673
#6  0x0000000000410011 in InstallPackages (Cache=..., ShwKept=<optimized out>, Ask=<optimized out>, Saftey=<optimized out>) at apt-get.cc:497
#7  0x000000000041334a in DoInstall (CmdL=...) at apt-get.cc:1733
#8  0x00007ffff7ee3cce in CommandLine::DispatchArg (this=this@entry=0x7fffffffd9d0, Map=Map@entry=0x7fffffffda10, NoMatch=NoMatch@entry=true) at contrib/cmndline.cc:360
#9  0x00000000004086eb in main (argc=<optimized out>, argv=<optimized out>) at apt-get.cc:2897
(gdb) p ts
$1 = (rpmts) 0x4b6b260
(gdb) p ts->rootDir
$2 = 0x0

rstreq -- тонкая обёртка над strcmp, которая естественно в NULL'ы не умеет.

Вроде бы rpmtsRootDir имеет право возвращать NULL -- в паре мест где она вызывается этот случай обработан явно. Очевидно проблемных места я нашёл два:
* plugins/syslog.c:46
* rpmbuild.c:442 -- но тут не упадёт, потому что вначале main у rpmbuild вызывается rpmtsSetRootDir, после которого ts->rootDir NULL'ом быть не может.

Похоже, нужно просто добавить проверку на NULL в syslog_tsm_pre.
Comment 2 Ivan A. Melnikov 2019-06-11 14:39:30 MSK
> Похоже, нужно просто добавить проверку на NULL в syslog_tsm_pre.

Например, так:

http://git.altlinux.org/people/iv/packages/rpm.git?p=rpm.git;a=commitdiff;h=6c659545d2af01e7683338848c96b5167bf3a8f9
Comment 3 Repository Robot 2019-06-11 16:29:45 MSK
rpm-4.13.0.1-alt8 -> sisyphus:

Tue Jun 11 2019 Ivan A. Melnikov <iv@altlinux> 4.13.0.1-alt8
- Fix crash in syslog plugin (closes: #35722).
- Fix setting permissions for hardlinked files even if some
  of the files are skipped (closes: #32997).