summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorcheatfate <ka@hardcore.kiev.ua>2016-03-31 02:39:53 +0300
committercheatfate <ka@hardcore.kiev.ua>2016-03-31 02:39:53 +0300
commit40f4fe997f73176cc2d8bab755c37c90196a046e (patch)
tree06f616862684d4a72671f4faa18932d5ab1dfbd3
parent3b732259c04dcb9ee763caf9f7697677624b7dc3 (diff)
downloadNim-40f4fe997f73176cc2d8bab755c37c90196a046e.tar.gz
Replace csprintf() in windows version of nimGetProcAddr to pure nim's implementation, to avoid possible overflow.
-rw-r--r--lib/system/dyncalls.nim25
1 files changed, 23 insertions, 2 deletions
diff --git a/lib/system/dyncalls.nim b/lib/system/dyncalls.nim
index 3b3d1f87d..61777e514 100644
--- a/lib/system/dyncalls.nim
+++ b/lib/system/dyncalls.nim
@@ -109,9 +109,30 @@ elif defined(windows) or defined(dos):
   proc nimGetProcAddr(lib: LibHandle, name: cstring): ProcAddr =
     result = getProcAddress(cast[THINSTANCE](lib), name)
     if result != nil: return
-    var decorated: array[250, char]
+    const decorated_length = 250
+    var decorated: array[decorated_length, char]
+    decorated[0] = '_'
+    var m = 1
+    while m < (decorated_length - 5):
+      if name[m - 1] == '\x00': break
+      decorated[m] = name[m - 1]
+      inc(m)
+    decorated[m] = '@'
     for i in countup(0, 50):
-      discard csprintf(decorated, "_%s@%ld", name, i*4)
+      var k = i * 4
+      if k div 100 == 0: 
+        if k div 10 == 0:
+          m = m + 1
+        else:
+          m = m + 2
+      else:
+        m = m + 3
+      decorated[m + 1] = '\x00'
+      while true:
+        decorated[m] = chr(ord('0') + (k %% 10))
+        dec(m)
+        k = k div 10
+        if k == 0: break
       result = getProcAddress(cast[THINSTANCE](lib), decorated)
       if result != nil: return
     procAddrError(name)
kkartik.com> 2022-05-20 08:55:45 -0700 committer Kartik K. Agaram <vc@akkartik.com> 2022-05-20 08:55:45 -0700 first stab at supporting wrapping in cursor up' href='/akkartik/view.love/commit/manual_tests?id=7e6705a113c53bda16cf9d6ba937f79b9f98b307'>7e6705a ^
c28f6ba ^
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28