[glib: 7/12] gwin32: Use gsize internally in g_wcsdup()




commit 9acebef777f4a669819155d844f5dd75a38fdbc8
Author: Philip Withnall <pwithnall endlessos org>
Date:   Thu Feb 4 13:50:37 2021 +0000

    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 <pwithnall endlessos org>
    Helps: #2319

 gio/giowin32-private.c    | 19 +++++++++++--------
 gio/gwin32packageparser.c | 19 +++++++++++--------
 gio/gwin32registrykey.c   | 34 ++++++++++++++++++++++++++--------
 3 files changed, 48 insertions(+), 24 deletions(-)
---
diff --git a/gio/giowin32-private.c b/gio/giowin32-private.c
index 7120ae0ea..6e1926daa 100644
--- a/gio/giowin32-private.c
+++ b/gio/giowin32-private.c
@@ -17,10 +17,10 @@
  */
 
 
-static gssize
+static gsize
 g_utf16_len (const gunichar2 *str)
 {
-  gssize result;
+  gsize result;
 
   for (result = 0; str[0] != 0; str++, result++)
     ;
@@ -31,17 +31,20 @@ g_utf16_len (const gunichar2 *str)
 static gunichar2 *
 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);
 
-  if (str_len == -1)
-    str_len = g_utf16_len (str);
+  if (str_len < 0)
+    str_len_unsigned = g_utf16_len (str);
+  else
+    str_len_unsigned = (gsize) str_len;
 
-  g_assert (str_len <= G_MAXSIZE / sizeof (gunichar2) - 1);
-  str_size = (str_len + 1) * sizeof (gunichar2);
+  g_assert (str_len_unsigned <= G_MAXSIZE / sizeof (gunichar2) - 1);
+  str_size = (str_len_unsigned + 1) * sizeof (gunichar2);
 
-  return g_memdup (str, str_size);
+  return g_memdup2 (str, str_size);
 }
 
 static const gunichar2 *
diff --git a/gio/gwin32packageparser.c b/gio/gwin32packageparser.c
index 745f1f522..ad5302270 100755
--- a/gio/gwin32packageparser.c
+++ b/gio/gwin32packageparser.c
@@ -62,10 +62,10 @@ typedef HRESULT (STDAPICALLTYPE *CreateXmlReader_func)(REFIID riid, void **ppvOb
 #define sax_CreateXmlReader sax->CreateXmlReader
 #endif
 
-static gssize
+static gsize
 g_utf16_len (const gunichar2 *str)
 {
-  gssize result;
+  gsize result;
 
   for (result = 0; str[0] != 0; str++, result++)
     ;
@@ -76,17 +76,20 @@ g_utf16_len (const gunichar2 *str)
 static gunichar2 *
 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);
 
-  if (str_len == -1)
-    str_len = g_utf16_len (str);
+  if (str_len < 0)
+    str_len_unsigned = g_utf16_len (str);
+  else
+    str_len_unsigned = (gsize) str_len;
 
-  g_assert (str_len <= G_MAXSIZE / sizeof (gunichar2) - 1);
-  str_size = (str_len + 1) * sizeof (gunichar2);
+  g_assert (str_len_unsigned <= G_MAXSIZE / sizeof (gunichar2) - 1);
+  str_size = (str_len_unsigned + 1) * sizeof (gunichar2);
 
-  return g_memdup (str, str_size);
+  return g_memdup2 (str, str_size);
 }
 
 static BOOL
diff --git a/gio/gwin32registrykey.c b/gio/gwin32registrykey.c
index 57ad1a318..398d8f45b 100644
--- a/gio/gwin32registrykey.c
+++ b/gio/gwin32registrykey.c
@@ -125,16 +125,34 @@ typedef enum
   G_WIN32_REGISTRY_UPDATED_PATH = 1,
 } GWin32RegistryKeyUpdateFlag;
 
+static gsize
+g_utf16_len (const gunichar2 *str)
+{
+  gsize result;
+
+  for (result = 0; str[0] != 0; str++, result++)
+    ;
+
+  return result;
+}
+
 static gunichar2 *
-g_wcsdup (const gunichar2 *str,
-          gssize           str_size)
+g_wcsdup (const gunichar2 *str, gssize str_len)
 {
-  if (str_size == -1)
-    {
-      str_size = wcslen (str) + 1;
-      str_size *= sizeof (gunichar2);
-    }
-  return g_memdup (str, str_size);
+  gsize str_len_unsigned;
+  gsize str_size;
+
+  g_return_val_if_fail (str != NULL, NULL);
+
+  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);
 }
 
 /**


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]