Bug 17352 - [3.5.10-alt4] kcontrol падает при запуске kcmshell mouse
Summary: [3.5.10-alt4] kcontrol падает при запуске kcmshell mouse
Status: CLOSED FIXED
Alias: None
Product: Sisyphus
Classification: Development
Component: kdebase-kcontrol (show other bugs)
Version: unstable
Hardware: all Linux
: P2 major
Assignee: Nobody's working on this, feel free to take it
QA Contact: qa-sisyphus
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2008-09-26 17:30 MSD by Konstantin Baev
Modified: 2008-10-05 22:41 MSD (History)
1 user (show)

See Also:


Attachments
Логи падения kcmshell (2.52 KB, application/octet-stream)
2008-09-29 12:56 MSD, Konstantin Baev
no flags Details
лог strace (478.87 KB, text/plain)
2008-10-05 22:41 MSD, Konstantin Baev
no flags Details

Note You need to log in before you can comment on or make changes to this bug.
Description Konstantin Baev 2008-09-26 17:30:01 MSD
Наблюдалось в версии kdebase-kcontrol-3.5.10-alt4

При запуске kcmshell mouse или, что тоже самое, в Центре управления КДЕ запустить пункт "Периферия" - "Мышь", мы видим фатальный сбой в КДЕ (сигнал 11)

[kipruss@localhost ~]$ kcmshell mouse
KCrash: Application 'kcmshell' crashing...
Comment 1 Sergey V Turchin 2008-09-26 17:34:58 MSD
Вывод от gdb там есть какой-нибудь? А то у меня не падает.
Comment 2 Konstantin Baev 2008-09-26 17:43:58 MSD
(In reply to comment #1)
> Вывод от gdb там есть какой-нибудь? А то у меня не падает.
> 

Я это в виртуалке увидел, а там gdb не установлено. А на хосте у меня alt1 и пока что-то обновляться боюсь. :) Сегодня не успею, а в понедельник или, может, в выходные, если получится, я выдам что говорит gdb. В strace ничего интересного не увидел.

И, возможно, не падает из за версии. Падает именно версия alt4
Comment 3 Sergey V Turchin 2008-09-26 19:07:25 MSD
Причина скорее всего где-то в другом месте. В X-ах, например
Comment 4 Konstantin Baev 2008-09-29 12:56:55 MSD
Created attachment 2962 [details]
Логи падения kcmshell

Прикладываю лог вывода gdm из виртуалбокса. Хост я обновил только что - не обнаружил ошибки. Возможно, это из-за виртуалбокса или ещё из-за чего-нибудь.
Comment 5 Konstantin Baev 2008-09-29 12:59:24 MSD
Понижаю багу в звании.
Comment 6 Sergey V Turchin 2008-09-29 13:00:51 MSD
100 пудов, связано с новой libusb, но бага скорее всего в kde
Comment 7 Sergey V Turchin 2008-09-29 13:08:58 MSD
Саш! Судя по тому, что kde зависит от libusb-0.1.so.4, а в трейсе libusb-1.0.so.0, то это наверняка libusb-0.1.so.4 виноват?
Comment 8 Alexander Bokovoy 2008-09-29 16:45:47 MSD
Скорее всего проблема в KDE в коде, который перебирает USB устройства. Смотри место, где вызывается usb_open() -- наверняка там нет проверки, что usb_open() вернул NULL.

В http://websvn.kde.org/trunk/KDE/kdebase/workspace/kcontrol/input/ я вижу нормальную обработку usb_open() в logitechmouse.cpp. Есть ли еще места в KDE, где используется libusb?
Comment 9 Sergey V Turchin 2008-09-29 17:19:19 MSD
Да, usb_open только там.
А usb_close(NULL) не падает?
Comment 10 Sergey V Turchin 2008-09-29 17:25:20 MSD
(In reply to comment #8)
> Есть ли еще места в KDE, где используется libusb?
apt-cache whatdepends libusb-0.1.so.4 ничего не находит, кроме аналогичного в KDE4
KDE-шный просмотр устройств парсит /sys/bys/usb/devices

Comment 11 Alexander Bokovoy 2008-09-29 17:34:36 MSD
API_EXPORTED int usb_close(usb_dev_handle *dev)
{
        usbi_dbg("");
        libusb_close(dev->handle);
        free(dev);
        return 0;
}

Как видишь, крайне легко падает. Предлагаю вставить везде в KDE проверку на
NULL при usb_close(), в частности, в KDE/kdebase/workspace/kcontrol/input/logitechmouse.cpp:
111 : 	  	  	LogitechMouse::~LogitechMouse()
112 : 	  	  	{
113 : 	  	  	usb_close( m_usbDeviceHandle );
114 : 	  	  	} 

Конечно, можно будет и в libusb-compat этот кусок кода поправить, но тогда такие ошибки будут скрываться. В libsub 1.0 они снова вылезут, потому что там предполагается, что за целостностью указателей должна следить вызывающая программа (и это правильно).
Comment 12 Sergey V Turchin 2008-09-29 19:28:11 MSD
(In reply to comment #11)
> вставить везде в KDE проверку на NULL при usb_close()
ok

[...]
> предполагается, что за целостностью указателей должна следить вызывающая
> программа (и это правильно).
IMHO если на производительность не влияет, то зря

Comment 13 Alexander Bokovoy 2008-10-01 01:09:56 MSD
Решил добавить небольшой патч, который предотвращает падение при usb_close(NULL) в libusb. Это должно помочь KDE и прочим, но сам по себе факт некорректной работы с нераспределенными структурами является поводом переписать код приложения. 
Comment 14 Sergey V Turchin 2008-10-01 13:35:36 MSD
2 kipruss:
А какая мышь, кстати?
Comment 15 Konstantin Baev 2008-10-01 17:19:32 MSD
(In reply to comment #14)
> 2 kipruss:
> А какая мышь, кстати?
> 

Мышь - PS/2
A4Tech, 2X Quick Mouse
Model: OP-3D
Comment 16 Sergey V Turchin 2008-10-03 17:10:53 MSD
Проверьте с kdebase-3.5.10 > alt4 или libusb-0.9.3 > alt0
В них одинаковая проверка добавлена.
Comment 17 Konstantin Baev 2008-10-04 00:42:46 MSD
(In reply to comment #16)
> Проверьте с kdebase-3.5.10 > alt4 или libusb-0.9.3 > alt0
> В них одинаковая проверка добавлена.
> 

[kipruss@localhost ~]$ rpm -q kdebase-kcontrol
kdebase-kcontrol-3.5.10-alt6
[kipruss@localhost ~]$ rpm -q libusb
libusb-0.9.3-alt3.0
[kipruss@localhost ~]$ kcmshell mouse
KCrash: Application 'kcmshell' crashing...
Comment 18 Alexander Bokovoy 2008-10-04 08:06:21 MSD
Не могу воспроизвести. Что дает strace -e trace -o log.txt kcmshell mouse ?
Приложите сюда log.txt.

У меня ожидаемая последовательность при работе с USB шиной (мыши на шине нет, только сканер отпечатков):
open("/dev/bus/usb", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY) = 12
stat64("/sys/bus/usb/devices", {st_mode=S_IFDIR|0755, st_size=0, ...}) = 0
open("/sys/bus/usb/devices", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY) = 12
stat64("/sys/bus/usb/devices/usb1/descriptors", {st_mode=S_IFREG|0444, st_size=65553, ...}) = 0
open("/sys/bus/usb/devices/usb1/busnum", O_RDONLY) = 13
open("/sys/bus/usb/devices/usb1/devnum", O_RDONLY) = 13
open("/sys/bus/usb/devices/usb1/descriptors", O_RDONLY) = 13
open("/sys/bus/usb/devices/usb2/busnum", O_RDONLY) = 13
open("/sys/bus/usb/devices/usb2/devnum", O_RDONLY) = 13
open("/sys/bus/usb/devices/usb2/descriptors", O_RDONLY) = 13
open("/sys/bus/usb/devices/usb3/busnum", O_RDONLY) = 13
open("/sys/bus/usb/devices/usb3/devnum", O_RDONLY) = 13
open("/sys/bus/usb/devices/usb3/descriptors", O_RDONLY) = 13
open("/sys/bus/usb/devices/usb4/busnum", O_RDONLY) = 13
open("/sys/bus/usb/devices/usb4/devnum", O_RDONLY) = 13
open("/sys/bus/usb/devices/usb4/descriptors", O_RDONLY) = 13
open("/sys/bus/usb/devices/usb5/busnum", O_RDONLY) = 13
open("/sys/bus/usb/devices/usb5/devnum", O_RDONLY) = 13
open("/sys/bus/usb/devices/usb5/descriptors", O_RDONLY) = 13
open("/sys/bus/usb/devices/usb6/busnum", O_RDONLY) = 13
open("/sys/bus/usb/devices/usb6/devnum", O_RDONLY) = 13
open("/sys/bus/usb/devices/usb6/descriptors", O_RDONLY) = 13
open("/sys/bus/usb/devices/usb7/busnum", O_RDONLY) = 13
open("/sys/bus/usb/devices/usb7/devnum", O_RDONLY) = 13
open("/sys/bus/usb/devices/usb7/descriptors", O_RDONLY) = 13
open("/sys/bus/usb/devices/1-2/busnum", O_RDONLY) = 13
open("/sys/bus/usb/devices/1-2/devnum", O_RDONLY) = 13
open("/sys/bus/usb/devices/1-2/descriptors", O_RDONLY) = 13
open("/sys/bus/usb/devices", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY) = 12
open("/sys/bus/usb/devices/usb1/busnum", O_RDONLY) = 13
open("/sys/bus/usb/devices/usb1/devnum", O_RDONLY) = 13
open("/sys/bus/usb/devices/usb1/descriptors", O_RDONLY) = 13
open("/sys/bus/usb/devices/usb2/busnum", O_RDONLY) = 13
open("/sys/bus/usb/devices/usb2/devnum", O_RDONLY) = 13
open("/sys/bus/usb/devices/usb2/descriptors", O_RDONLY) = 13
open("/sys/bus/usb/devices/usb3/busnum", O_RDONLY) = 13
open("/sys/bus/usb/devices/usb3/devnum", O_RDONLY) = 13
open("/sys/bus/usb/devices/usb3/descriptors", O_RDONLY) = 13
open("/sys/bus/usb/devices/usb4/busnum", O_RDONLY) = 13
open("/sys/bus/usb/devices/usb4/devnum", O_RDONLY) = 13
open("/sys/bus/usb/devices/usb4/descriptors", O_RDONLY) = 13
open("/sys/bus/usb/devices/usb5/busnum", O_RDONLY) = 13
open("/sys/bus/usb/devices/usb5/devnum", O_RDONLY) = 13
open("/sys/bus/usb/devices/usb5/descriptors", O_RDONLY) = 13
open("/sys/bus/usb/devices/usb6/busnum", O_RDONLY) = 13
open("/sys/bus/usb/devices/usb6/devnum", O_RDONLY) = 13
open("/sys/bus/usb/devices/usb6/descriptors", O_RDONLY) = 13
open("/sys/bus/usb/devices/usb7/busnum", O_RDONLY) = 13
open("/sys/bus/usb/devices/usb7/devnum", O_RDONLY) = 13
open("/sys/bus/usb/devices/usb7/descriptors", O_RDONLY) = 13
open("/sys/bus/usb/devices/1-2/busnum", O_RDONLY) = 13
open("/sys/bus/usb/devices/1-2/devnum", O_RDONLY) = 13
open("/sys/bus/usb/devices/1-2/descriptors", O_RDONLY) = 13
open("/sys/bus/usb/devices/1-2/descriptors", O_RDONLY) = 12
open("/dev/bus/usb/001/003", O_RDONLY)  = -1 EACCES (Permission denied)
open("/sys/bus/usb/devices/usb1/descriptors", O_RDONLY) = 12
open("/dev/bus/usb/001/001", O_RDONLY)  = -1 EACCES (Permission denied)
open("/sys/bus/usb/devices/usb2/descriptors", O_RDONLY) = 12
open("/dev/bus/usb/002/001", O_RDONLY)  = -1 EACCES (Permission denied)
open("/sys/bus/usb/devices/usb3/descriptors", O_RDONLY) = 12
open("/dev/bus/usb/003/001", O_RDONLY)  = -1 EACCES (Permission denied)
open("/sys/bus/usb/devices/usb4/descriptors", O_RDONLY) = 12
open("/dev/bus/usb/004/001", O_RDONLY)  = -1 EACCES (Permission denied)
open("/sys/bus/usb/devices/usb5/descriptors", O_RDONLY) = 12
open("/dev/bus/usb/005/001", O_RDONLY)  = -1 EACCES (Permission denied)
open("/sys/bus/usb/devices/usb6/descriptors", O_RDONLY) = 12
open("/dev/bus/usb/006/001", O_RDONLY)  = -1 EACCES (Permission denied)
open("/sys/bus/usb/devices/usb7/descriptors", O_RDONLY) = 12
open("/dev/bus/usb/007/001", O_RDONLY)  = -1 EACCES (Permission denied)
Comment 19 Konstantin Baev 2008-10-05 22:41:11 MSD
Created attachment 2971 [details]
лог strace

[kipruss@localhost ~]$ strace -e trace -o log1.txt kcmshell mouse
strace: invalid system call `trace'

лог вызова

$ strace -o log1.txt kcmshell mouse

прилагается

Ещё раз напоминаю, что ошибка воспроизводится на ОС внутри Virtualbox OSE. А там usb нет в принципе.