The attached patch makes the changes necessary to doio.c to use 
strlcat() and strlcpy() instead of strcat() and strcpy() on environments 
where these functions are available. 

Comments or questions are welcome.

Steve Peters
[EMAIL PROTECTED]


--- perl-current/doio.c Sat Jul 31 11:44:58 2004
+++ strlfunc/doio.c     Wed Dec  1 09:57:02 2004
@@ -53,6 +53,9 @@
 #  define OPEN_EXCL 0
 #endif
                
+#define _MODE_MAX 8
+#define _FLAGS_MAX 10
+
 #include <signal.h>

 bool
@@ -89,7 +92,7 @@
     bool was_fdopen = FALSE;
     bool in_raw = 0, in_crlf = 0, out_raw = 0, out_crlf = 0;
     char *type  = NULL;
-    char mode[8];              /* stdio file mode ("r\0", "rb\0", "r+b\0" 
etc.) */
+    char mode[_MODE_MAX];    /* stdio file mode ("r\0", "rb\0", "r+b\0" etc.) 
*/
     SV *namesv;
            
     Zero(mode,sizeof(mode),char);
@@ -275,10 +278,17 @@
            }
            mode[0] = 'w';
            writing = 1;
+#ifdef HAS_STRLCAT
+            if (out_raw)
+                strlcat(mode, "b", _MODE_MAX);
+            else if (out_crlf)
+                strlcat(mode, "t", _MODE_MAX);
+#else
            if (out_raw)
                strcat(mode, "b");
            else if (out_crlf)
                strcat(mode, "t");
+#endif
            if (num_svs > 1) {
                fp = PerlProc_popen_list(mode, num_svs, svp);
            }
@@ -306,11 +316,17 @@
            }
            writing = 1;

+#ifdef HAS_STRLCAT
+            if (out_raw)
+                strlcat(mode, "b", _MODE_MAX);
+            else if (out_crlf)
+                strlcat(mode, "t", _MODE_MAX);
+#else
            if (out_raw)
                strcat(mode, "b");
            else if (out_crlf)
                strcat(mode, "t");
-
+#endif
            if (*type == '&') {
              duplicity:
                dodup = PERLIO_DUP_FD;
@@ -432,10 +448,17 @@
            /*SUPPRESS 530*/
            for (type++; isSPACE(*type); type++) ;
            mode[0] = 'r';
+#ifdef HAS_STRLCAT
+            if (in_raw)
+                strlcat(mode, "b", _MODE_MAX);
+            else if (in_crlf)
+                strlcat(mode, "t", _MODE_MAX);
+#else
            if (in_raw)
                strcat(mode, "b");
            else if (in_crlf)
                strcat(mode, "t");
+#endif

            if (*type == '&') {
                goto duplicity;
@@ -487,10 +510,17 @@
                TAINT_ENV();
            TAINT_PROPER("piped open");
            mode[0] = 'r';
+#ifdef HAS_STRLCAT
+            if (in_raw)
+                strlcat(mode, "b", _MODE_MAX);
+            else if (in_crlf)
+                strlcat(mode, "t", _MODE_MAX);
+#else
            if (in_raw)
                strcat(mode, "b");
            else if (in_crlf)
                strcat(mode, "t");
+#endif
            if (num_svs > 1) {
                fp = PerlProc_popen_list(mode,num_svs,svp);
            }
@@ -515,10 +545,17 @@
            /*SUPPRESS 530*/
            for (; isSPACE(*name); name++) ;
            mode[0] = 'r';
+#ifdef HAS_STRLCAT
+            if (in_raw)
+                strlcat(mode, "b", _MODE_MAX);
+            else if (in_crlf)
+                strlcat(mode, "t", _MODE_MAX);
+#else
            if (in_raw)
                strcat(mode, "b");
            else if (in_crlf)
                strcat(mode, "t");
+#endif
            if (strEQ(name,"-")) {
                fp = PerlIO_stdin();
                IoTYPE(io) = IoTYPE_STD;
@@ -1503,14 +1540,22 @@

 #ifdef CSH
     {
-        char flags[10];
+        char flags[_FLAGS_MAX];
        if (strnEQ(cmd,PL_cshname,PL_cshlen) &&
            strnEQ(cmd+PL_cshlen," -c",3)) {
+#ifdef HAS_STRLCPY
+          strlcpy(flags, "-c", _FLAGS_MAX);
+#else
          strcpy(flags,"-c");
+#endif
          s = cmd+PL_cshlen+3;
          if (*s == 'f') {
              s++;
+#ifdef HAS_STRLCAT
+              strlcat(flags, "f", _FLAGS_MAX);
+#else
              strcat(flags,"f");
+#endif
          }
          if (*s == ' ')
              s++;

Reply via email to