summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'media-video/pipewire/files/pipewire-0.3.38-libcamera-null-deref.patch')
-rw-r--r--media-video/pipewire/files/pipewire-0.3.38-libcamera-null-deref.patch70
1 files changed, 70 insertions, 0 deletions
diff --git a/media-video/pipewire/files/pipewire-0.3.38-libcamera-null-deref.patch b/media-video/pipewire/files/pipewire-0.3.38-libcamera-null-deref.patch
new file mode 100644
index 000000000000..beabd1a30291
--- /dev/null
+++ b/media-video/pipewire/files/pipewire-0.3.38-libcamera-null-deref.patch
@@ -0,0 +1,70 @@
+https://gitlab.freedesktop.org/pipewire/pipewire/-/commit/d71a10b7fa9b5c560485b6bbde409c10d3fdd114.patch
+
+From: Wim Taymans <wtaymans@redhat.com>
+Date: Thu, 30 Sep 2021 12:54:29 +0200
+Subject: [PATCH] libcamera: handle failure gracefully
+
+Don't try to access NULL pointers
+--- a/spa/plugins/libcamera/libcamera-client.c
++++ b/spa/plugins/libcamera/libcamera-client.c
+@@ -210,10 +210,10 @@ impl_init(const struct spa_handle_factory *factory,
+ SPA_DEVICE_CHANGE_MASK_PROPS;
+ this->info.flags = 0;
+
+- if(this->dev.camera == NULL) {
++ if(this->dev.camera == NULL)
+ this->dev.camera = (LibCamera*)newLibCamera();
++ if(this->dev.camera != NULL)
+ libcamera_set_log(this->dev.camera, this->dev.log);
+- }
+
+ return 0;
+ }
+--- a/spa/plugins/libcamera/libcamera-source.c
++++ b/spa/plugins/libcamera/libcamera-source.c
+@@ -994,10 +994,10 @@ impl_init(const struct spa_handle_factory *factory,
+ port->dev.log = this->log;
+ port->dev.fd = -1;
+
+- if(port->dev.camera == NULL) {
++ if(port->dev.camera == NULL)
+ port->dev.camera = (LibCamera*)newLibCamera();
++ if(port->dev.camera != NULL)
+ libcamera_set_log(port->dev.camera, port->dev.log);
+- }
+
+ if (info && (str = spa_dict_lookup(info, SPA_KEY_API_LIBCAMERA_PATH))) {
+ strncpy(this->props.device, str, 63);
+--- a/spa/plugins/libcamera/libcamera_wrapper.cpp
++++ b/spa/plugins/libcamera/libcamera_wrapper.cpp
+@@ -540,7 +540,8 @@ extern "C" {
+ }
+
+ void LibCamera::close() {
+- this->cam_->release();
++ if (this->cam_)
++ this->cam_->release();
+ }
+
+ void LibCamera::connect()
+@@ -775,6 +776,9 @@ extern "C" {
+ std::unique_ptr<CameraManager> cm = std::make_unique<CameraManager>();
+ LibCamera* camera = new LibCamera();
+
++ pthread_mutexattr_init(&attr);
++ pthread_mutex_init(&camera->lock, &attr);
++
+ ret = cm->start();
+ if (ret) {
+ deleteLibCamera(camera);
+@@ -794,9 +798,6 @@ extern "C" {
+ return nullptr;
+ }
+
+- pthread_mutexattr_init(&attr);
+- pthread_mutex_init(&camera->lock, &attr);
+-
+ camera->ring_buffer_init();
+
+ return camera;
+GitLab