summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--lib/windows/registry.nim18
-rw-r--r--tests/stdlib/tregistry.nim15
2 files changed, 25 insertions, 8 deletions
diff --git a/lib/windows/registry.nim b/lib/windows/registry.nim
index c17f2f455..ab7d0b1fe 100644
--- a/lib/windows/registry.nim
+++ b/lib/windows/registry.nim
@@ -54,16 +54,18 @@ proc getUnicodeValue*(path, key: string; handle: HKEY): string =
     var newHandle: HKEY
     call regOpenKeyEx(handle, hh, 0, KEY_READ or KEY_WOW64_64KEY, newHandle)
     call regGetValue(newHandle, nil, kk, flags, nil, nil, addr bufsize)
-    var res = newWideCString("", bufsize)
-    call regGetValue(newHandle, nil, kk, flags, nil, cast[pointer](res),
-                   addr bufsize)
-    result = res $ bufsize
+    if bufSize > 0:
+      var res = newWideCString(bufsize)
+      call regGetValue(newHandle, nil, kk, flags, nil, addr res[0],
+                    addr bufsize)
+      result = res $ bufsize
     call regCloseKey(newHandle)
   else:
-    var res = newWideCString("", bufsize)
-    call regGetValue(handle, hh, kk, flags, nil, cast[pointer](res),
-                   addr bufsize)
-    result = res $ bufsize
+    if bufSize > 0:
+      var res = newWideCString(bufsize)
+      call regGetValue(handle, hh, kk, flags, nil, addr res[0],
+                    addr bufsize)
+      result = res $ bufsize
 
 proc regSetValue(key: HKEY, lpSubKey, lpValueName: WideCString,
                  dwType: int32; lpData: WideCString; cbData: int32): int32 {.
diff --git a/tests/stdlib/tregistry.nim b/tests/stdlib/tregistry.nim
new file mode 100644
index 000000000..8bf084f6d
--- /dev/null
+++ b/tests/stdlib/tregistry.nim
@@ -0,0 +1,15 @@
+discard """
+  disabled: "unix"
+  matrix: "--gc:refc; --gc:arc"
+"""
+
+when defined(windows):
+  import std/registry
+
+  block: # bug #14010
+    let path = "Environment"
+    let key = "D20210328T202842_key"
+    let val = "D20210328T202842_val"
+    let handle = HKEY_CURRENT_USER
+    setUnicodeValue("Environment", key, val, handle)
+    doAssert getUnicodeValue(path, key, handle) == val