diff --git a/require.c b/require.c
index e9ab353d3e8af24fe5cf625ac7313f06050e30d6..612b1562d731268b86155b11cb9954cd4f0f1730 100644
--- a/require.c
+++ b/require.c
@@ -159,6 +159,7 @@ int requireDebug=0;
     #include <windows.h>
     #include "asprintf.h"
     #define snprintf _snprintf
+    #define setenv(name,value,overwrite) _putenv_s(name,value)
     #define NAME_MAX MAX_PATH
 
     #define PREFIX
@@ -313,11 +314,14 @@ static int putenvprintf(const char* format, ...)
 {
     va_list ap;
     char *var;
+#ifndef vxWorks
+    char *val;
+#endif
 
     va_start(ap, format);
     if (vasprintf(&var, format, ap) < 0)
     {
-        perror("require putenv");
+        perror("require putenvprintf");
         return errno;
     }
     va_end(ap);
@@ -325,16 +329,23 @@ static int putenvprintf(const char* format, ...)
     if (requireDebug)
         printf("require: putenv(\"%s\")\n", var);
 
-    putenv(var);
-    /* Why putenv()?
-       vxWorks has no setenv()
-       Epics 3.13 has no epicsEnvSet()
-       Do not free the memory given to putenv (except for vxWorks)!
-    */
-
 #ifdef vxWorks
-    free(var);
+    putenv(var); /* vxWorks putenv() makes a copy */
+#else
+    val = strchr(var, '=');
+    if (!val) 
+    {
+        fprintf(stderr, "putenvprintf: string contains no =: %s\n", var);
+        return -1;
+    }
+    *val++ = 0;
+    if (setenv(var, val, 1) == -1)
+    {
+        perror("require putenvprintf: setenv failed");
+        return errno;
+    }
 #endif
+    free(var);
     return 0;
 }