usb_webcam: UVC: guard against NULL config or interface from USB device
This commit is contained in:
@@ -83,9 +83,13 @@ UVCCamDevice::UVCCamDevice(CamDeviceAddon& _addon, BUSBDevice* _device)
|
|||||||
|
|
||||||
for (uint32 i = 0; i < _device->CountConfigurations(); i++) {
|
for (uint32 i = 0; i < _device->CountConfigurations(); i++) {
|
||||||
config = _device->ConfigurationAt(i);
|
config = _device->ConfigurationAt(i);
|
||||||
|
if (config == NULL)
|
||||||
|
continue;
|
||||||
_device->SetConfiguration(config);
|
_device->SetConfiguration(config);
|
||||||
for (uint32 j = 0; j < config->CountInterfaces(); j++) {
|
for (uint32 j = 0; j < config->CountInterfaces(); j++) {
|
||||||
interface = config->InterfaceAt(j);
|
interface = config->InterfaceAt(j);
|
||||||
|
if (interface == NULL)
|
||||||
|
continue;
|
||||||
|
|
||||||
if (interface->Class() == CC_VIDEO && interface->Subclass()
|
if (interface->Class() == CC_VIDEO && interface->Subclass()
|
||||||
== SC_VIDEOCONTROL) {
|
== SC_VIDEOCONTROL) {
|
||||||
@@ -696,6 +700,8 @@ UVCCamDevice::_SelectBestAlternate()
|
|||||||
printf("UVCCamDevice::_SelectBestAlternate()\n");
|
printf("UVCCamDevice::_SelectBestAlternate()\n");
|
||||||
const BUSBConfiguration* config = fDevice->ActiveConfiguration();
|
const BUSBConfiguration* config = fDevice->ActiveConfiguration();
|
||||||
const BUSBInterface* streaming = config->InterfaceAt(fStreamingIndex);
|
const BUSBInterface* streaming = config->InterfaceAt(fStreamingIndex);
|
||||||
|
if (streaming == NULL)
|
||||||
|
return B_BAD_INDEX;
|
||||||
|
|
||||||
uint32 bestBandwidth = 0;
|
uint32 bestBandwidth = 0;
|
||||||
uint32 alternateIndex = 0;
|
uint32 alternateIndex = 0;
|
||||||
@@ -743,6 +749,8 @@ UVCCamDevice::_SelectIdleAlternate()
|
|||||||
printf("UVCCamDevice::_SelectIdleAlternate()\n");
|
printf("UVCCamDevice::_SelectIdleAlternate()\n");
|
||||||
const BUSBConfiguration* config = fDevice->ActiveConfiguration();
|
const BUSBConfiguration* config = fDevice->ActiveConfiguration();
|
||||||
const BUSBInterface* streaming = config->InterfaceAt(fStreamingIndex);
|
const BUSBInterface* streaming = config->InterfaceAt(fStreamingIndex);
|
||||||
|
if (streaming == NULL)
|
||||||
|
return B_BAD_INDEX;
|
||||||
if (((BUSBInterface*)streaming)->SetAlternate(0) != B_OK) {
|
if (((BUSBInterface*)streaming)->SetAlternate(0) != B_OK) {
|
||||||
fprintf(stderr, "UVCCamDevice::_SelectIdleAlternate()"
|
fprintf(stderr, "UVCCamDevice::_SelectIdleAlternate()"
|
||||||
" selecting alternate failed\n");
|
" selecting alternate failed\n");
|
||||||
@@ -957,9 +965,13 @@ UVCCamDevice::AddParameters(BParameterGroup* group, int32& index)
|
|||||||
|
|
||||||
for (uint32 i = 0; i < fDevice->CountConfigurations(); i++) {
|
for (uint32 i = 0; i < fDevice->CountConfigurations(); i++) {
|
||||||
config = fDevice->ConfigurationAt(i);
|
config = fDevice->ConfigurationAt(i);
|
||||||
|
if (config == NULL)
|
||||||
|
continue;
|
||||||
fDevice->SetConfiguration(config);
|
fDevice->SetConfiguration(config);
|
||||||
for (uint32 j = 0; j < config->CountInterfaces(); j++) {
|
for (uint32 j = 0; j < config->CountInterfaces(); j++) {
|
||||||
interface = config->InterfaceAt(j);
|
interface = config->InterfaceAt(j);
|
||||||
|
if (interface == NULL)
|
||||||
|
continue;
|
||||||
if (interface->Class() != CC_VIDEO || interface->Subclass()
|
if (interface->Class() != CC_VIDEO || interface->Subclass()
|
||||||
!= SC_VIDEOCONTROL)
|
!= SC_VIDEOCONTROL)
|
||||||
continue;
|
continue;
|
||||||
|
|||||||
Reference in New Issue
Block a user