| Summary: | Падает при отсутствии usb | ||
|---|---|---|---|
| Product: | Sisyphus | Reporter: | Anton Farygin <rider> |
| Component: | usbutils | Assignee: | Alexey Shabalin <shaba> |
| Status: | CLOSED FIXED | QA Contact: | qa-sisyphus |
| Severity: | normal | ||
| Priority: | P2 | CC: | ab, antohami, evg, rider, shaba |
| Version: | unstable | ||
| Hardware: | all | ||
| OS: | Linux | ||
Присылайте патчи, тестировать на машине без USB не могу. Воспроизводится в qemu 0.81 проверь. branch-5.0 теперь не интересен. В Sisyphus всё тоже-самое. После установки в kvm, падает. да, падает версия 0.86 lsusb не лазит в файлы само. . Падает оно, потому что lsusb не обрабатывает код возврата от usb_init() из libusb. Т.е. - libusb конечно виновато, но не так что бы очень. Вот тут: usb_init(); usb_find_busses(); usb_find_devices(); (В ответ на комментарий №8) > Падает оно, потому что lsusb не обрабатывает код возврата от usb_init() из > libusb. void usb_init(void); да, тогда все вопросы внутрь libusb Проблема тут в том, что API, используемое lsusb -- это старое API libusb, предоставляемое libusb-compat. В этом API нет возможности сообщить о провале инициализации:
API_EXPORTED void usb_init(void)
{
int r;
usbi_dbg("");
if (!ctx) {
r = libusb_init(&ctx);
if (r < 0) {
usbi_err("initialization failed!");
return;
}
/* usb_set_debug can be called before usb_init */
if (usb_debug)
libusb_set_debug(ctx, 3);
}
}
Как результат, внутренний (общий для всех пользователей libusb-compat) контекст ctx будет NULL, но это не должно создавать проблему, поскольку указание пустого контекста внутри libusb (не libusb-compat!) означает использование "контекста по умолчанию").
Соответственно, проблемы в ошибочной инициализации в usb_init() не должны приводить к падению приложения. А вот проверять код возврата usb_find_busses() необходимо. Делает ли это lsusb?
нет, не проверяет. Но и падает оно внутри usb_find_busses() В таком случае необходимо сделать две вещи: 1. Продемонстрировать мне, где конкретно оно падает (у меня не воспроизводится). 2. Исправить код в lsusb, чтобы он правильно работал с libusb-compat API. В идеале, usbutils нужно перевести на текущее API libusb. Старое уже практически не поддерживается никем. (В ответ на комментарий №13) > 2. Исправить код в lsusb, чтобы он правильно работал с libusb-compat API. > > В идеале, usbutils нужно перевести на текущее API libusb. Старое уже > практически не поддерживается никем. Это к KH. Я могу написать ему и в linux-usb@, в принципе. Учитывая, что usbutils относительно простой и пример основы lsusb есть в lsusb-1.0.5/examples/, можно переписать самостоятельно. Посмотрим. KH ответил, что версии для libusb-1.0 не будет, будет для libudev: http://github.com/gregkh/lsusb.git/ То есть, lsusb перестанет зависить от libusb-compat в частности и libusb в целом? В таком случае предлагаю закрыть эту ошибку как только usbutils будут обновлены до версии с поддержкой libudev. usbutils v008 собраны с поддержкой udev. |
usbutils-0.73-alt1 4442 open("/dev/bus/usb", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY|O_CLOEXEC) = -1 ENOENT (No such file or directory) 4442 open("/proc/bus/usb", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY|O_CLOEXEC) = -1 ENOENT (No such file or directory) 4442 open("/sys/bus/usb/devices", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY|O_CLOEXEC) = -1 ENOENT (No such file or directory) 4442 --- SIGSEGV (Segmentation fault) @ 0 (0) --- 4442 +++ killed by SIGSEGV +++