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++;