gstreamer: Check if Stream configurations were generated correctly
Currently, the gst_libcamera_device_new() function assumes that a call to Camera::generateConfiguration() will always succeed, but that may not be the case and the return value must to be checked. Otherwise, this could lead to a NULL pointer dereference if the pipeline handler fails to generate a config for the VideoRecording stream role. Signed-off-by: Javier Martinez Canillas <javierm@redhat.com> Reviewed-by: Nicolas Dufresne <nicolas.dufresne@collabora.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
This commit is contained in:
committed by
Laurent Pinchart
parent
31403b0f2a
commit
f0139ed11a
@@ -132,6 +132,10 @@ gst_libcamera_device_new(const std::shared_ptr<Camera> &camera)
|
||||
|
||||
roles.push_back(StreamRole::VideoRecording);
|
||||
std::unique_ptr<CameraConfiguration> config = camera->generateConfiguration(roles);
|
||||
if (!config || config->size() != roles.size()) {
|
||||
GST_ERROR("Failed to generate a default configuration for %s", name);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
for (const StreamConfiguration &stream_cfg : *config) {
|
||||
GstCaps *sub_caps = gst_libcamera_stream_formats_to_caps(stream_cfg.formats());
|
||||
@@ -189,8 +193,16 @@ gst_libcamera_provider_probe(GstDeviceProvider *provider)
|
||||
|
||||
for (const std::shared_ptr<Camera> &camera : cm->cameras()) {
|
||||
GST_INFO_OBJECT(self, "Found camera '%s'", camera->id().c_str());
|
||||
|
||||
GstDevice *dev = gst_libcamera_device_new(camera);
|
||||
if (!dev) {
|
||||
GST_ERROR_OBJECT(self, "Failed to add camera '%s'",
|
||||
camera->id().c_str());
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
devices = g_list_append(devices,
|
||||
g_object_ref_sink(gst_libcamera_device_new(camera)));
|
||||
g_object_ref_sink(dev));
|
||||
}
|
||||
|
||||
return devices;
|
||||
|
||||
Reference in New Issue
Block a user