From f254805b430448b7f97b25c79863acc7ea29c425 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Revol?= Date: Wed, 22 Nov 2017 13:50:31 +0100 Subject: [PATCH] usb_webcam: UVC: guard against NULL config or interface from USB device --- .../usb_webcam/addons/uvc/UVCCamDevice.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/add-ons/media/media-add-ons/usb_webcam/addons/uvc/UVCCamDevice.cpp b/src/add-ons/media/media-add-ons/usb_webcam/addons/uvc/UVCCamDevice.cpp index 8973d756d3..e383206c17 100644 --- a/src/add-ons/media/media-add-ons/usb_webcam/addons/uvc/UVCCamDevice.cpp +++ b/src/add-ons/media/media-add-ons/usb_webcam/addons/uvc/UVCCamDevice.cpp @@ -83,9 +83,13 @@ UVCCamDevice::UVCCamDevice(CamDeviceAddon& _addon, BUSBDevice* _device) for (uint32 i = 0; i < _device->CountConfigurations(); i++) { config = _device->ConfigurationAt(i); + if (config == NULL) + continue; _device->SetConfiguration(config); for (uint32 j = 0; j < config->CountInterfaces(); j++) { interface = config->InterfaceAt(j); + if (interface == NULL) + continue; if (interface->Class() == CC_VIDEO && interface->Subclass() == SC_VIDEOCONTROL) { @@ -696,6 +700,8 @@ UVCCamDevice::_SelectBestAlternate() printf("UVCCamDevice::_SelectBestAlternate()\n"); const BUSBConfiguration* config = fDevice->ActiveConfiguration(); const BUSBInterface* streaming = config->InterfaceAt(fStreamingIndex); + if (streaming == NULL) + return B_BAD_INDEX; uint32 bestBandwidth = 0; uint32 alternateIndex = 0; @@ -743,6 +749,8 @@ UVCCamDevice::_SelectIdleAlternate() printf("UVCCamDevice::_SelectIdleAlternate()\n"); const BUSBConfiguration* config = fDevice->ActiveConfiguration(); const BUSBInterface* streaming = config->InterfaceAt(fStreamingIndex); + if (streaming == NULL) + return B_BAD_INDEX; if (((BUSBInterface*)streaming)->SetAlternate(0) != B_OK) { fprintf(stderr, "UVCCamDevice::_SelectIdleAlternate()" " selecting alternate failed\n"); @@ -957,9 +965,13 @@ UVCCamDevice::AddParameters(BParameterGroup* group, int32& index) for (uint32 i = 0; i < fDevice->CountConfigurations(); i++) { config = fDevice->ConfigurationAt(i); + if (config == NULL) + continue; fDevice->SetConfiguration(config); for (uint32 j = 0; j < config->CountInterfaces(); j++) { interface = config->InterfaceAt(j); + if (interface == NULL) + continue; if (interface->Class() != CC_VIDEO || interface->Subclass() != SC_VIDEOCONTROL) continue;