Commit 2aaf593a authored by Philip Withnall's avatar Philip Withnall
Browse files

gwin32: Use gsize internally in g_wcsdup()



This allows it to handle strings up to length `G_MAXSIZE` — previously
it would overflow with such strings.

Update the several copies of it identically.
Signed-off-by: Philip Withnall's avatarPhilip Withnall <pwithnall@endlessos.org>
Helps: #2319
parent f9ee2275
...@@ -16,11 +16,12 @@ ...@@ -16,11 +16,12 @@
* along with this library; if not, see <http://www.gnu.org/licenses/>. * along with this library; if not, see <http://www.gnu.org/licenses/>.
*/ */
#include "gstrfuncsprivate.h"
static gssize static gsize
g_utf16_len (const gunichar2 *str) g_utf16_len (const gunichar2 *str)
{ {
gssize result; gsize result;
for (result = 0; str[0] != 0; str++, result++) for (result = 0; str[0] != 0; str++, result++)
; ;
...@@ -31,17 +32,20 @@ g_utf16_len (const gunichar2 *str) ...@@ -31,17 +32,20 @@ g_utf16_len (const gunichar2 *str)
static gunichar2 * static gunichar2 *
g_wcsdup (const gunichar2 *str, gssize str_len) g_wcsdup (const gunichar2 *str, gssize str_len)
{ {
gssize str_size; gsize str_len_unsigned;
gsize str_size;
g_return_val_if_fail (str != NULL, NULL); g_return_val_if_fail (str != NULL, NULL);
if (str_len == -1) if (str_len < 0)
str_len = g_utf16_len (str); str_len_unsigned = g_utf16_len (str);
else
str_len_unsigned = (gsize) str_len;
g_assert (str_len <= G_MAXSIZE / sizeof (gunichar2) - 1); g_assert (str_len_unsigned <= G_MAXSIZE / sizeof (gunichar2) - 1);
str_size = (str_len + 1) * sizeof (gunichar2); str_size = (str_len_unsigned + 1) * sizeof (gunichar2);
return g_memdup (str, str_size); return g_memdup2 (str, str_size);
} }
static const gunichar2 * static const gunichar2 *
......
...@@ -127,16 +127,34 @@ typedef enum ...@@ -127,16 +127,34 @@ typedef enum
G_WIN32_REGISTRY_UPDATED_PATH = 1, G_WIN32_REGISTRY_UPDATED_PATH = 1,
} GWin32RegistryKeyUpdateFlag; } GWin32RegistryKeyUpdateFlag;
static gsize
g_utf16_len (const gunichar2 *str)
{
gsize result;
for (result = 0; str[0] != 0; str++, result++)
;
return result;
}
static gunichar2 * static gunichar2 *
g_wcsdup (const gunichar2 *str, g_wcsdup (const gunichar2 *str, gssize str_len)
gssize str_size)
{ {
if (str_size == -1) gsize str_len_unsigned;
{ gsize str_size;
str_size = wcslen (str) + 1;
str_size *= sizeof (gunichar2); g_return_val_if_fail (str != NULL, NULL);
}
return g_memdup (str, str_size); if (str_len < 0)
str_len_unsigned = g_utf16_len (str);
else
str_len_unsigned = (gsize) str_len;
g_assert (str_len_unsigned <= G_MAXSIZE / sizeof (gunichar2) - 1);
str_size = (str_len_unsigned + 1) * sizeof (gunichar2);
return g_memdup2 (str, str_size);
} }
/** /**
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment