rts: Don't use strndup
authorBen Gamari <bgamari.foss@gmail.com>
Mon, 18 Apr 2016 20:32:59 +0000 (22:32 +0200)
committerBen Gamari <ben@smart-cactus.org>
Tue, 19 Apr 2016 08:03:17 +0000 (10:03 +0200)
Reviewers: austin

Subscribers: thomie

Differential Revision: https://phabricator.haskell.org/D2125

(cherry picked from commit d1ce35d2271ac8b79cb5e37677b1a989749e611c)

rts/RtsFlags.c
rts/RtsUtils.c
rts/RtsUtils.h

index 5ecb5e0..46a7de1 100644 (file)
@@ -1607,7 +1607,7 @@ static rtsBool read_heap_profiling_flag(const char *arg_in)
                 if (!right)
                     right = arg + strlen(arg);
 
-                char *selector = strndup(left, right - left);
+                char *selector = stgStrndup(left, right - left + 1);
 
                 switch (arg[2]) {
                 case 'c': // cost centre label select
index a36532c..c837143 100644 (file)
@@ -112,6 +112,18 @@ stgCallocBytes (int n, int m, char *msg)
     return space;
 }
 
+/* borrowed from the MUSL libc project */
+char *stgStrndup(const char *s, size_t n)
+{
+    size_t l = strnlen(s, n);
+    char *d = stgMallocBytes(l+1, "stgStrndup");
+    if (!d) return NULL;
+    memcpy(d, s, l);
+    d[l] = 0;
+    return d;
+}
+
+
 /* To simplify changing the underlying allocator used
  * by stgMallocBytes(), provide stgFree() as well.
  */
index 5d825a2..d76c921 100644 (file)
@@ -26,6 +26,8 @@ void *stgReallocBytes(void *p, int n, char *msg);
 void *stgCallocBytes(int n, int m, char *msg)
      GNUC3_ATTRIBUTE(__malloc__);
 
+char *stgStrndup(const char *s, size_t n);
+
 void stgFree(void* p);
 
 /* -----------------------------------------------------------------------------