Ver Fonte

Merge pull request #9339 from tytan652/prevent_simde_contamination

Contain simde diagnostic pragmas and replace variable-length arrays
Lain há 2 anos atrás
pai
commit
796e2d5815

+ 1 - 1
libobs/obs-cocoa.m

@@ -463,7 +463,7 @@ static bool code_to_str(int code, struct dstr *str)
 void obs_key_to_str(obs_key_t key, struct dstr *str)
 void obs_key_to_str(obs_key_t key, struct dstr *str)
 {
 {
     const UniCharCount max_length = 16;
     const UniCharCount max_length = 16;
-    UniChar buffer[max_length];
+    UniChar buffer[16];
 
 
     if (localized_key_to_str(key, str))
     if (localized_key_to_str(key, str))
         return;
         return;

+ 4 - 0
libobs/util/sse-intrin.h

@@ -17,6 +17,8 @@
 
 
 #pragma once
 #pragma once
 
 
+#include "c99defs.h"
+
 #if (defined(_MSC_VER) || defined(__MINGW32__)) && \
 #if (defined(_MSC_VER) || defined(__MINGW32__)) && \
 	((defined(_M_X64) && !defined(_M_ARM64EC)) || defined(_M_IX86))
 	((defined(_M_X64) && !defined(_M_ARM64EC)) || defined(_M_IX86))
 #include <emmintrin.h>
 #include <emmintrin.h>
@@ -25,5 +27,7 @@
 #define WIN32_LEAN_AND_MEAN
 #define WIN32_LEAN_AND_MEAN
 #endif
 #endif
 #define SIMDE_ENABLE_NATIVE_ALIASES
 #define SIMDE_ENABLE_NATIVE_ALIASES
+PRAGMA_WARN_PUSH
 #include "simde/x86/sse2.h"
 #include "simde/x86/sse2.h"
+PRAGMA_WARN_POP
 #endif
 #endif

+ 34 - 11
plugins/linux-pipewire/pipewire.c

@@ -811,13 +811,22 @@ static void process_video_sync(obs_pipewire_stream *obs_pw_stream)
 
 
 	if (buffer->datas[0].type == SPA_DATA_DmaBuf) {
 	if (buffer->datas[0].type == SPA_DATA_DmaBuf) {
 		uint32_t planes = buffer->n_datas;
 		uint32_t planes = buffer->n_datas;
-		uint32_t offsets[planes];
-		uint32_t strides[planes];
-		uint64_t modifiers[planes];
-		int fds[planes];
+		DARRAY(uint32_t) offsets;
+		DARRAY(uint32_t) strides;
+		DARRAY(uint64_t) modifiers;
+		DARRAY(int) fds;
 		bool use_modifiers;
 		bool use_modifiers;
 		bool corrupt = false;
 		bool corrupt = false;
 
 
+		da_init(offsets);
+		da_reserve(offsets, planes);
+		da_init(strides);
+		da_reserve(strides, planes);
+		da_init(modifiers);
+		da_reserve(modifiers, planes);
+		da_init(fds);
+		da_reserve(fds, planes);
+
 #ifdef DEBUG_PIPEWIRE
 #ifdef DEBUG_PIPEWIRE
 		blog(LOG_DEBUG,
 		blog(LOG_DEBUG,
 		     "[pipewire] DMA-BUF info: fd:%ld, stride:%d, offset:%u, size:%dx%d",
 		     "[pipewire] DMA-BUF info: fd:%ld, stride:%d, offset:%u, size:%dx%d",
@@ -838,11 +847,13 @@ static void process_video_sync(obs_pipewire_stream *obs_pw_stream)
 		}
 		}
 
 
 		for (uint32_t plane = 0; plane < planes; plane++) {
 		for (uint32_t plane = 0; plane < planes; plane++) {
-			fds[plane] = buffer->datas[plane].fd;
-			offsets[plane] = buffer->datas[plane].chunk->offset;
-			strides[plane] = buffer->datas[plane].chunk->stride;
-			modifiers[plane] =
-				obs_pw_stream->format.info.raw.modifier;
+			da_push_back(fds, &buffer->datas[plane].fd);
+			da_push_back(offsets,
+				     &buffer->datas[plane].chunk->offset);
+			da_push_back(strides,
+				     &buffer->datas[plane].chunk->stride);
+			da_push_back(modifiers,
+				     &obs_pw_stream->format.info.raw.modifier);
 			corrupt |= (buffer->datas[plane].chunk->flags &
 			corrupt |= (buffer->datas[plane].chunk->flags &
 				    SPA_CHUNK_FLAG_CORRUPTED) > 0;
 				    SPA_CHUNK_FLAG_CORRUPTED) > 0;
 		}
 		}
@@ -850,6 +861,12 @@ static void process_video_sync(obs_pipewire_stream *obs_pw_stream)
 		if (corrupt) {
 		if (corrupt) {
 			blog(LOG_DEBUG,
 			blog(LOG_DEBUG,
 			     "[pipewire] buffer contains corrupted data");
 			     "[pipewire] buffer contains corrupted data");
+
+			da_free(offsets);
+			da_free(strides);
+			da_free(modifiers);
+			da_free(fds);
+
 			goto read_metadata;
 			goto read_metadata;
 		}
 		}
 
 
@@ -860,8 +877,14 @@ static void process_video_sync(obs_pipewire_stream *obs_pw_stream)
 		obs_pw_stream->texture = gs_texture_create_from_dmabuf(
 		obs_pw_stream->texture = gs_texture_create_from_dmabuf(
 			obs_pw_stream->format.info.raw.size.width,
 			obs_pw_stream->format.info.raw.size.width,
 			obs_pw_stream->format.info.raw.size.height,
 			obs_pw_stream->format.info.raw.size.height,
-			format_data.drm_format, GS_BGRX, planes, fds, strides,
-			offsets, use_modifiers ? modifiers : NULL);
+			format_data.drm_format, GS_BGRX, planes, fds.array,
+			strides.array, offsets.array,
+			use_modifiers ? modifiers.array : NULL);
+
+		da_free(offsets);
+		da_free(strides);
+		da_free(modifiers);
+		da_free(fds);
 
 
 		if (obs_pw_stream->texture == NULL) {
 		if (obs_pw_stream->texture == NULL) {
 			remove_modifier_from_format(
 			remove_modifier_from_format(

+ 18 - 16
plugins/mac-virtualcam/src/obs-plugin/plugin-main.mm

@@ -369,27 +369,25 @@ static bool virtualcam_output_start(void *data)
                                            .mScope = kCMIOObjectPropertyScopeGlobal,
                                            .mScope = kCMIOObjectPropertyScopeGlobal,
                                            .mElement = kCMIOObjectPropertyElementMain};
                                            .mElement = kCMIOObjectPropertyElementMain};
         CMIOObjectGetPropertyDataSize(kCMIOObjectSystemObject, &address, 0, NULL, &size);
         CMIOObjectGetPropertyDataSize(kCMIOObjectSystemObject, &address, 0, NULL, &size);
-        size_t num_devices = size / sizeof(CMIOObjectID);
-        CMIOObjectID cmio_devices[num_devices];
-        CMIOObjectGetPropertyData(kCMIOObjectSystemObject, &address, 0, NULL, size, &used, &cmio_devices);
+        NSMutableData *cmioDevices = [NSMutableData dataWithLength:size];
+        void *device_data = [cmioDevices mutableBytes];
+        CMIOObjectGetPropertyData(kCMIOObjectSystemObject, &address, 0, NULL, size, &used, device_data);
 
 
         vcam->deviceID = 0;
         vcam->deviceID = 0;
-
         NSString *OBSVirtualCamUUID = [[NSBundle bundleWithIdentifier:@"com.obsproject.mac-virtualcam"]
         NSString *OBSVirtualCamUUID = [[NSBundle bundleWithIdentifier:@"com.obsproject.mac-virtualcam"]
             objectForInfoDictionaryKey:@"OBSCameraDeviceUUID"];
             objectForInfoDictionaryKey:@"OBSCameraDeviceUUID"];
-        for (size_t i = 0; i < num_devices; i++) {
-            CMIOObjectID cmio_device = cmio_devices[i];
-            address.mSelector = kCMIODevicePropertyDeviceUID;
+        for (size_t i = 0; i < (used * sizeof(CMIOObjectID)); i++) {
+            CMIOObjectID cmioDevice;
+            [cmioDevices getBytes:&cmioDevice range:NSMakeRange(i * sizeof(CMIOObjectID), sizeof(CMIOObjectID))];
 
 
+            address.mSelector = kCMIODevicePropertyDeviceUID;
             UInt32 device_name_size;
             UInt32 device_name_size;
-            CMIOObjectGetPropertyDataSize(cmio_device, &address, 0, NULL, &device_name_size);
-
+            CMIOObjectGetPropertyDataSize(cmioDevice, &address, 0, NULL, &device_name_size);
             CFStringRef uid;
             CFStringRef uid;
-            CMIOObjectGetPropertyData(cmio_device, &address, 0, NULL, device_name_size, &used, &uid);
-
+            CMIOObjectGetPropertyData(cmioDevice, &address, 0, NULL, device_name_size, &used, &uid);
             const char *uid_string = CFStringGetCStringPtr(uid, kCFStringEncodingUTF8);
             const char *uid_string = CFStringGetCStringPtr(uid, kCFStringEncodingUTF8);
             if (uid_string && strcmp(uid_string, OBSVirtualCamUUID.UTF8String) == 0) {
             if (uid_string && strcmp(uid_string, OBSVirtualCamUUID.UTF8String) == 0) {
-                vcam->deviceID = cmio_device;
+                vcam->deviceID = cmioDevice;
                 CFRelease(uid);
                 CFRelease(uid);
                 break;
                 break;
             } else {
             } else {
@@ -404,11 +402,15 @@ static bool virtualcam_output_start(void *data)
 
 
         address.mSelector = kCMIODevicePropertyStreams;
         address.mSelector = kCMIODevicePropertyStreams;
         CMIOObjectGetPropertyDataSize(vcam->deviceID, &address, 0, NULL, &size);
         CMIOObjectGetPropertyDataSize(vcam->deviceID, &address, 0, NULL, &size);
-        CMIOStreamID stream_ids[(size / sizeof(CMIOStreamID))];
+        NSMutableData *streamIds = [NSMutableData dataWithLength:size];
+        void *stream_data = [streamIds mutableBytes];
+        CMIOObjectGetPropertyData(vcam->deviceID, &address, 0, NULL, size, &used, stream_data);
 
 
-        CMIOObjectGetPropertyData(vcam->deviceID, &address, 0, NULL, size, &used, &stream_ids);
-
-        vcam->streamID = stream_ids[1];
+        if (used < (2 * sizeof(CMIOStreamID))) {
+            obs_output_set_last_error(vcam->output, obs_module_text("Error.SystemExtension.CameraNotStarted"));
+            return false;
+        }
+        [streamIds getBytes:&vcam->streamID range:NSMakeRange(sizeof(CMIOStreamID), sizeof(CMIOStreamID))];
 
 
         CMIOStreamCopyBufferQueue(
         CMIOStreamCopyBufferQueue(
             vcam->streamID, [](CMIOStreamID, void *, void *) {
             vcam->streamID, [](CMIOStreamID, void *, void *) {