diff options
author | Todd C. Miller <millert@cvs.openbsd.org> | 2004-08-23 17:56:21 +0000 |
---|---|---|
committer | Todd C. Miller <millert@cvs.openbsd.org> | 2004-08-23 17:56:21 +0000 |
commit | 9c9d2339d1028d158c66fb7b82749108af808852 (patch) | |
tree | 86e9e702179e384262dfe56afc77d3af1d75d71f | |
parent | 374e45ee0438eee8c62b6409b14da6f9f3d3da46 (diff) |
Do %s replacement for LESSOPEN and LESSCLOSE ourselves instead
of using snprintf(). Based on a patch from Brent Graveland.
Ok tdeval@ and otto@
-rw-r--r-- | usr.bin/less/filename.c | 40 |
1 files changed, 32 insertions, 8 deletions
diff --git a/usr.bin/less/filename.c b/usr.bin/less/filename.c index a46df09e77e..4e76843c95b 100644 --- a/usr.bin/less/filename.c +++ b/usr.bin/less/filename.c @@ -824,9 +824,10 @@ open_altfile(filename, pf, pfd) return (NULL); #else char *lessopen; - char *cmd; + char *cmd, *cp; FILE *fd; - size_t len; + size_t i, len; + int found; #if HAVE_FILENO int returnfd = 0; #endif @@ -853,9 +854,18 @@ open_altfile(filename, pf, pfd) #endif } - len = strlen(lessopen) + strlen(filename) + 2; + /* strlen(filename) is guaranteed to be > 0 */ + len = strlen(lessopen) + strlen(filename); cmd = (char *) ecalloc(len, sizeof(char)); - snprintf(cmd, len, lessopen, filename); + for (cp = cmd, i = 0, found = 0; i < strlen(lessopen); i++) { + if (!found && lessopen[i] == '%' && lessopen[i + 1] == 's') { + found = 1; + strlcat(cmd, filename, len); + cp += strlen(filename); + i++; + } else + *cp++ = lessopen[i]; + } fd = shellcmd(cmd); free(cmd); if (fd == NULL) @@ -914,8 +924,9 @@ close_altfile(altfilename, filename, pipefd) #if HAVE_POPEN char *lessclose; FILE *fd; - char *cmd; - size_t len; + char *cmd, *cp; + size_t i, len; + int found; if (secure) return; @@ -932,9 +943,22 @@ close_altfile(altfilename, filename, pipefd) } if ((lessclose = lgetenv("LESSCLOSE")) == NULL) return; - len = strlen(lessclose) + strlen(filename) + strlen(altfilename) + 2; + /* strlen(filename) is guaranteed to be > 0 */ + len = strlen(lessclose) + strlen(filename) + strlen(altfilename); cmd = (char *) ecalloc(len, sizeof(char)); - snprintf(cmd, len, lessclose, filename, altfilename); + for (cp = cmd, i = 0, found = 0; i < strlen(lessclose); i++) { + if (found < 2 && lessclose[i] == '%' && lessclose[i + 1] == 's') { + if (++found == 1) { + strlcat(cmd, filename, len); + cp += strlen(filename); + } else { + strlcat(cmd, altfilename, len); + cp += strlen(altfilename); + } + i++; + } else + *cp++ = lessclose[i]; + } fd = shellcmd(cmd); free(cmd); if (fd != NULL) |