decklink: Fix broken COM string conversion
authorSeungha Yang <seungha@centricular.com>
Mon, 9 Oct 2023 10:09:15 +0000 (19:09 +0900)
committerTim-Philipp Müller <tim@centricular.com>
Mon, 9 Oct 2023 14:34:44 +0000 (15:34 +0100)
WideCharToMultiByte return is the string length without null terminate
character if passed "cchWideChar" does not include the null terminate
character size. Instead of passing the exact string length, pass -1 so that
the API can understand the input string is null terminated already and
returned value from the API includes the character.

Fixes: https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/3023
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5446>

subprojects/gst-plugins-bad/sys/decklink/gstdecklink.h

index 7c811e0..5c66351 100644 (file)
 #define COMSTR_T BSTR
 #define CONVERT_COM_STRING(s) G_STMT_START { \
   BSTR _s = (BSTR)s; \
-  int _s_length = ::SysStringLen(_s); \
-  int _length = ::WideCharToMultiByte(CP_ACP, 0, (wchar_t*)_s, _s_length, NULL, 0, NULL, NULL); \
+  int _length = ::WideCharToMultiByte(CP_ACP, 0, (wchar_t*)_s, -1, NULL, 0, NULL, NULL); \
   s = (char *) malloc(_length); \
-  ::WideCharToMultiByte(CP_ACP, 0, (wchar_t*)_s, _s_length, s, _length, NULL, NULL); \
+  ::WideCharToMultiByte(CP_ACP, 0, (wchar_t*)_s, -1, s, _length, NULL, NULL); \
   ::SysFreeString(_s); \
 } G_STMT_END
 #define FREE_COM_STRING(s) free(s);
 #define CONVERT_TO_COM_STRING(s) G_STMT_START { \
   char * _s = (char *)s; \
-  int _s_length = strlen((char*)_s); \
-  int _length = ::MultiByteToWideChar(CP_ACP, 0, (char*)_s, _s_length, NULL, 0); \
+  int _length = ::MultiByteToWideChar(CP_ACP, 0, (char*)_s, -1, NULL, 0); \
   s = ::SysAllocStringLen(NULL, _length); \
-  ::MultiByteToWideChar(CP_ACP, 0, (char*)_s, _s_length, s, _length); \
+  ::MultiByteToWideChar(CP_ACP, 0, (char*)_s, -1, s, _length); \
   g_free(_s); \
 } G_STMT_END
 #elif defined(__APPLE__)