2016-02-24

история одного обновления

Я очень давно ненавижу тот путь, по которому движется разработка софта, в частности KDE (plasma).

И сегодня я вам расскажу одну из слезливых историй "почему".

После очередного незаметного обновления в очередной раз "поломался" sddm и kscreensaver:
после lock screen при попытке unlock мой пароль не принимается, а после 4х попыток ввода пароля получаю сообщение:


The screen locker is broken and unlocking is not possible anymore.
In order to unlock switch to a virtual terminal (e.g. Ctrl+Alt+F2),
log in and execute the command:
loginctl unlock-sessions
Afterwards switch back to the running session (Ctrl+Alt+F%1).



Гугл нашел эту "фичу" - у кого-то при краше greeter (окна входа) система делает crash loop, и это "пофиксили".

Еще гугл находит что проблема связана (!!!) с OpenGL, с драйверами NVidia и Intel Haswell ucode.

Естественно это все не мой случай :) - быстрое применение всех фиксов проблему не решает.
Значит надо копать.


Расскажу кратко КАК я ИСКАЛ причину, может алгоритм кому-то еще пригодится.

1. Найти точную причину и ключевые слова для гугла поможет backtrace.
Теперь, в эру systemd это Б***Ь непросто!
В логах этот сраный systemd даже не пишет что именно покрашилось:


Feb 24 17:47:40 archy systemd[1]: Started Process Core Dump (PID 3840/UID 0).
Feb 24 17:47:40 archy kdeinit5[1489]: QDBusAbstractAdaptor: Cannot relay signal KDEDModule::moduleDeleted(KDEDModule*): Pointers are not supported: KDEDModule*
Feb 24 17:47:40 archy systemd-coredump[3842]: Coredump file descriptor missing.
Feb 24 17:47:40 archy kdeinit5[1489]: The X11 connection broke: I/O error (code 1)
Feb 24 17:47:40 archy drkonqi[3836]: The X11 connection broke: I/O error (code 1)
Feb 24 17:47:40 archy systemd[1]: Started Process Core Dump (PID 3847/UID 0).
Feb 24 17:47:40 archy systemd-coredump[3848]: Coredump file descriptor missing.

т.е. предполагается, что по PID я сам угадаю какой процесс пару минут назад был запущен. Да и вообще между строк прочитаю всю информацию о креше.

но ладно, найдем корки:


#ls -la /var/lib/systemd/coredump 
-rw-r-----+ 1 root root 3427883 Feb 24 13:42 core.drkonqi.1000.a053e839a290482a902aea45b03ad468.1348.1456314160000000000000.lz4
-rw-r-----+ 1 root root 3678241 Feb 24 12:52 core.drkonqi.1000.ca67dc2d7ad64c77996b6e6d43ec7f45.3502.1456311160000000000000.lz4

-rw-r-----+ 1 root root 4229665 Feb 24 14:56 core.klipper.1000.a053e839a290482a902aea45b03ad468.2159.1456318565000000000000.lz4
-rw-r-----+ 1 root root 3313889 Feb 24 17:45 core.klipper.1000.a053e839a290482a902aea45b03ad468.2181.1456328750000000000000.lz4
-rw-r-----+ 1 root root 4757578 Feb 24 13:58 core.systemsettings5.1000.a053e839a290482a902aea45b03ad468.1754.1456315120000000000000.lz4


drkonqi - это графическая уведомлялка "ой, что-то покрашилось. отправить отчет ган^Wразработчикам?"
klipper - удобный менеджер буфера обмена. к входу в систему точно отношения не имеет.
systemsettings - утилита настройки обоев рабочего стола.
Странно что нет ни sddm, ни kscreensaver - но надо посмотреть на то что есть.

2. анализ дампа
* распаковываем core: unlz4  
* ищем исходный бинарник: file


govno: ELF 64-bit LSB core file x86-64, version 1 (SYSV), SVR4-style, from '/usr/lib/drkonqi --appname drkonqi --apppath /usr/lib --signal 8 --pid 3500 --s'


 * открываем отладчик:


# gdb /usr/lib/drkonqi
/var/lib/systemd/coredump/
core.drkonqi.1000.a053e839a290482a902aea45b03ad468.1348.1456314160000000000000

...
Reading symbols from /usr/lib/drkonqi...(no debugging symbols found)...done.
[New LWP 3502]

warning: Could not load shared library symbols for linux-vdso.so.1.
Do you need "set solib-search-path" or "set sysroot"?
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/usr/lib/libthread_db.so.1".
Core was generated by `/usr/lib/drkonqi --appname drkonqi --apppath /usr/lib --signal 8 --pid 3500 --s'.
Program terminated with signal SIGFPE, Arithmetic exception.
#0  0x00007f75971772a8 in raise () from /usr/lib/libc.so.6
 


тут видим что креш по SIGFPE , а у всех нагугленых проблем SIGSEGV, т.е. источник проблемы другой чем у "умных" форумчан которые трейс показывали.
Но может совпасть с проблемой "тупых" форумчан, который кроме "ой, все, ниче не работает" ничего о своей проблеме не написали.

* смотрим бектрейс: bt


(gdb) bt
#0  0x00007f75971772a8 in raise () from /usr/lib/libc.so.6
#1  0x00007f7599f16e97 in KCrash::defaultCrashHandler(int) () from /usr/lib/libKF5Crash.so.5
#2 
#3  0x00007f75958b4c19 in pthread_barrier_destroy () from /usr/lib/libpthread.so.0
#4  0x00007f757d4a796f in ?? () from /usr/lib/xorg/modules/dri/swrast_dri.so
#5  0x00007f757d4b3441 in ?? () from /usr/lib/xorg/modules/dri/swrast_dri.so
#6  0x00007f757d15254f in ?? () from /usr/lib/xorg/modules/dri/swrast_dri.so
#7  0x00007f757d1525f5 in ?? () from /usr/lib/xorg/modules/dri/swrast_dri.so
#8  0x00007f757d150a2f in ?? () from /usr/lib/xorg/modules/dri/swrast_dri.so
#9  0x00007f75945d9522 in ?? () from /usr/lib/libGL.so.1
#10 0x00007f75945b5506 in ?? () from /usr/lib/libGL.so.1
#11 0x00007f75945b5589 in ?? () from /usr/lib/libGL.so.1
#12 0x00007f75945b56de in ?? () from /usr/lib/libGL.so.1
#13 0x00007f7595fefc52 in XCloseDisplay () from /usr/lib/libX11.so.6
#14 0x00007f758caf20a6 in QXcbConnection::~QXcbConnection() () from /usr/lib/libQt5XcbQpa.so.5
#15 0x00007f758caf2409 in QXcbConnection::~QXcbConnection() () from /usr/lib/libQt5XcbQpa.so.5
#16 0x00007f758caf3ea6 in QXcbIntegration::~QXcbIntegration() () from /usr/lib/libQt5XcbQpa.so.5
#17 0x00007f758caf3fb9 in QXcbIntegration::~QXcbIntegration() () from /usr/lib/libQt5XcbQpa.so.5
#18 0x00007f7597e24d43 in QGuiApplicationPrivate::~QGuiApplicationPrivate() () from /usr/lib/libQt5Gui.so.5
#19 0x00007f75983dba09 in QApplicationPrivate::~QApplicationPrivate() () from /usr/lib/libQt5Widgets.so.5
#20 0x00007f7597b24618 in QObject::~QObject() () from /usr/lib/libQt5Core.so.5
#21 0x00007f75983dd7f9 in QApplication::~QApplication() () from /usr/lib/libQt5Widgets.so.5
#22 0x0000000000433f5d in main ()

Рассмотрим основные:
* все креши идут из-за рендеринга libX11 и libGL (т.е. проблема может быть и в дровах видео,
* но есть swrast_dri.so - т.е. сейчас нет аппаратной акселерации и потому nvidia и intel не при чем.


3. проверяем по логам обновлений какие пакеты обновлялись, и тут сюрприз - обновился именно libc:
 upgraded binutils (2.25.1-3 -> 2.26-1)
 upgraded gcc-libs (5.3.0-4 -> 5.3.0-5)
 upgraded gcc (5.3.0-4 -> 5.3.0-5)
 upgraded lib32-glibc (2.22-4 -> 2.23-1)
 upgraded lib32-gcc-libs (5.3.0-4 -> 5.3.0-5)
 upgraded lib32-sqlite (3.10.1-1 -> 3.11.0-1)
 upgraded lib32-systemd (228-1 -> 229-1)
 upgraded libfbclient (2.5.4.26856-3 -> 2.5.5.26952-1)
 upgraded xorg-xrandr (1.4.3-1 -> 1.5.0-1)
так как ни libGL, ни библиотеки X11, ни DRI последние несколько месяцев не обновлялись - можем пока их исключить.
даунгрейдим libc до предыдущей версии, той где все еще присутствует критическая уязвимость CVE-2015-7547 :-D

делаем ребут (libc увы используется почти всей системой, потому для эфекта нужно перезапустить буквально все) - и все работает.

4. Для профилактики CVE-2015-7547 перепроверяем что у нас весь dns идет через закрытый dns forwarder(ключевое слово dnsmasq).

4. Благодарим гребаных "програмистов" за "хорошую" работу.