diff --git a/api/GenApi.py b/api/GenApi.py
index e2c2c1ac4d93981690e0dab93e6851103ddf89fe..41dcd1b07ce68ea98916359fe5425dfedbeefe6a 100644
--- a/api/GenApi.py
+++ b/api/GenApi.py
@@ -908,7 +908,8 @@ template<typename t>
 {{
   *p = (char**){0}Malloc(sizeof(char*) * v.size());
   for(size_t i = 0; i < v.size(); ++i){{
-    (*p)[i] = strdup(v[i].c_str());
+    (*p)[i] = (char*){0}Malloc(sizeof(char) * (v[i].size() + 1));
+    strcpy((*p)[i], v[i].c_str());
   }}
   *size = v.size();
 }}
diff --git a/api/gmsh.h_cwrap b/api/gmsh.h_cwrap
index 9186a90a1461211a2bcf963f7cca1dcd955ead32..9bbfb2b6f815ce817546541147a4f40e4bdb753e 100644
--- a/api/gmsh.h_cwrap
+++ b/api/gmsh.h_cwrap
@@ -72,7 +72,8 @@ namespace gmsh {
   {
     *p = (char**)gmshMalloc(sizeof(char*) * v.size());
     for(size_t i = 0; i < v.size(); ++i){
-      (*p)[i] = strdup(v[i].c_str());
+      (*p)[i] = (char*)gmshMalloc(sizeof(char) * (v[i].size() + 1));
+      strcpy((*p)[i], v[i].c_str());
     }
     *size = v.size();
   }
diff --git a/api/gmshc.cpp b/api/gmshc.cpp
index 0a58c67be6e2bbb7dc27851fa108df252dbf8a1c..ba94f89242bbeb368fb409c51f77d2d06f3df693 100644
--- a/api/gmshc.cpp
+++ b/api/gmshc.cpp
@@ -45,7 +45,8 @@ void vectorstring2charptrptr(const std::vector<std::string> &v, char ***p, size_
 {
   *p = (char**)gmshMalloc(sizeof(char*) * v.size());
   for(size_t i = 0; i < v.size(); ++i){
-    (*p)[i] = strdup(v[i].c_str());
+    (*p)[i] = (char*)gmshMalloc(sizeof(char) * (v[i].size() + 1));
+    strcpy((*p)[i], v[i].c_str());
   }
   *size = v.size();
 }