From 0b11aa4347670330fbd6998c269ac89aaf1116e4 Mon Sep 17 00:00:00 2001
From: Dirk Zimoch <dirk.zimoch@psi.ch>
Date: Tue, 13 Mar 2018 15:35:00 +0100
Subject: [PATCH] fix too small path buffer in vxworks

---
 require.c | 53 ++++++++++++++++++++++++++++++++++++++++++++---------
 1 file changed, 44 insertions(+), 9 deletions(-)

diff --git a/require.c b/require.c
index cc67230a..43edffe4 100644
--- a/require.c
+++ b/require.c
@@ -68,6 +68,7 @@ int requireDebug;
     #include <loadLib.h>
     #include <shellLib.h>
     #include <ioLib.h>
+    #include <fioLib.h>
     #include <envLib.h>
     #include <epicsAssert.h>
     #include "strdup.h"
@@ -81,19 +82,54 @@ int requireDebug;
     #define getAddress(module, name) __extension__ \
         ({SYM_TYPE t; char* a = NULL; symFindByName(sysSymTbl, (name), &a, &t); a;})
 
-    /* vxWorks has no snprintf() */
-    #define snprintf(s, maxchars, f, args...) __extension__ \
-        ({int printed=sprintf(s, f, ## args); assert(printed < maxchars); printed;})
+#ifndef _WRS_VXWORKS_MAJOR
+    /* vxWorks 5 has no snprintf() */
+    struct outStr_s {
+        char *str;
+        int free;
+    };
+
+    static STATUS outRoutine(char *buffer, int nchars, int outarg) {
+        struct outStr_s *poutStr = (struct outStr_s *) outarg;
+        int free = poutStr->free;
+
+        if (free < 1) { /*let fioFormatV continue to count length*/
+            return OK;
+        } else if (free > 1) {
+            if (nchars >= free) nchars = free-1;
+            strncpy(poutStr->str, buffer, nchars);
+            poutStr->str += nchars;
+            poutStr->free -= nchars;
+        }
+        /*make sure final string is null terminated*/
+        *poutStr->str = 0;
+        return OK;
+    }
+
+    static int snprintf(char *str, size_t size, const char *format, ...)
+    {
+        struct outStr_s outStr;
+        int nchars;
+        va_list ap;
+
+        outStr.str = str;
+        outStr.free = size;
+        va_start(ap, format);
+        nchars = fioFormatV(format, ap, outRoutine, (int)&outStr);
+        va_end(ap);
+        return nchars;
+    }
+#endif
 
     /* vxWorks has no realpath() -- at least make directory absolute */
     static char* realpath(const char* path, char* buf)
     {
         size_t len = 0;
-        if (!buf) buf = malloc(MAX_FILENAME_LENGTH);
+        if (!buf) buf = malloc(PATH_MAX+1);
         if (!buf) return NULL;
         if (path[0] != OSI_PATH_SEPARATOR[0])
         {
-            getcwd(buf, MAX_FILENAME_LENGTH);
+            getcwd(buf, PATH_MAX);
             len = strlen(buf);
             if (len && buf[len-1] != OSI_PATH_SEPARATOR[0])
                 buf[len++] = OSI_PATH_SEPARATOR[0];
@@ -162,7 +198,7 @@ int requireDebug;
     #include "asprintf.h"
     #define snprintf _snprintf
     #define setenv(name,value,overwrite) _putenv_s(name,value)
-    #define NAME_MAX MAX_PATH
+    #define PATH_MAX MAX_PATH
 
     #define PREFIX
     #define INFIX
@@ -667,7 +703,7 @@ static int findLibRelease (
     char* p;
     char* version;
     char* symname;
-    char name[NAME_MAX + 11];                               /* get space for library path + "LibRelease" */
+    char name[PATH_MAX + 11];                               /* get space for library path + "LibRelease" */
     
     (void)data;                                             /* unused */
     if (size < sizeof(struct dl_phdr_info)) return 0;       /* wrong version of struct dl_phdr_info */
@@ -742,7 +778,6 @@ static void registerExternalModules()
     }
 }
 
-
 #else
 static void registerExternalModules()
 {
@@ -1209,7 +1244,7 @@ static int require_priv(const char* module, const char* version, const char* arg
     int extoffs;
     char* founddir = NULL;
     char* symbolname;
-    char filename[NAME_MAX];
+    char filename[PATH_MAX];
     
     int someVersionFound = 0;
     int someArchFound = 0;
-- 
GitLab