diff --git a/src/libcamera/camera_manager.cpp b/src/libcamera/camera_manager.cpp
index 6280b2b3e485..a8b36bcea2d4 100644
--- a/src/libcamera/camera_manager.cpp
+++ b/src/libcamera/camera_manager.cpp
@@ -83,8 +83,10 @@ void CameraManager::Private::run()
 	mutex_.unlock();
 	cv_.notify_one();
 
-	if (ret < 0)
+	if (ret < 0) {
+		cleanup();
 		return;
+	}
 
 	/* Now start processing events and messages. */
 	exec();
