summaryrefslogtreecommitdiff
path: root/usr/src/cmd/man
diff options
context:
space:
mode:
authorRich Burridge <rich.burridge@oracle.com>2010-08-13 14:49:55 -0700
committerRich Burridge <rich.burridge@oracle.com>2010-08-13 14:49:55 -0700
commitc262c0de9d93d606bd10da46d23fa7a19ce3c2f6 (patch)
tree90616065b38e797cc7e5280ea3c8dd292a07c6ef /usr/src/cmd/man
parent72a173ca530b433c67cdcd3c151e736e410c7bb5 (diff)
downloadillumos-joyent-c262c0de9d93d606bd10da46d23fa7a19ce3c2f6.tar.gz
6224042 man command dumps core if there is a long filename starting with man or cat in a man directory.
Diffstat (limited to 'usr/src/cmd/man')
-rw-r--r--usr/src/cmd/man/src/man.c27
1 files changed, 18 insertions, 9 deletions
diff --git a/usr/src/cmd/man/src/man.c b/usr/src/cmd/man/src/man.c
index ea12798150..bf8fc24284 100644
--- a/usr/src/cmd/man/src/man.c
+++ b/usr/src/cmd/man/src/man.c
@@ -95,7 +95,6 @@
#define PLEN 3 /* prefix length {man, cat, fmt} */
#define TMPLEN 7 /* length of tmpfile prefix */
#define MAXTOKENS 64
-#define MAXSUFFIX 20 /* length of section suffix */
#define DOT_SO ".so "
#define PREPROC_SPEC "'\\\" "
@@ -814,8 +813,8 @@ get_all_sect(struct man_node *manp)
char **dirv;
char **dv;
char **p;
- char prev[MAXSUFFIX];
- char tmp[MAXSUFFIX];
+ char *prev = NULL;
+ char *tmp = NULL;
int plen;
int maxentries = MAXTOKENS;
int entries = 0;
@@ -839,8 +838,6 @@ get_all_sect(struct man_node *manp)
malloc_error();
}
- (void) memset(tmp, 0, MAXSUFFIX);
- (void) memset(prev, 0, MAXSUFFIX);
for (dv = dirv, p = manp->secv; *dv; dv++) {
plen = PLEN;
if (match(*dv, SGMLDIR, PLEN+1))
@@ -852,14 +849,26 @@ get_all_sect(struct man_node *manp)
continue;
}
+ if (tmp != NULL)
+ free(tmp);
+ tmp = strdup(*dv + plen);
+ if (tmp == NULL)
+ malloc_error();
(void) sprintf(tmp, "%s", *dv + plen);
- if (strcmp(prev, tmp) == 0) {
- /* release memory allocated by sortdir */
- free(*dv);
- continue;
+ if (prev != NULL) {
+ if (strcmp(prev, tmp) == 0) {
+ /* release memory allocated by sortdir */
+ free(*dv);
+ continue;
+ }
}
+ if (prev != NULL)
+ free(prev);
+ prev = strdup(*dv + plen);
+ if (prev == NULL)
+ malloc_error();
(void) sprintf(prev, "%s", *dv + plen);
/*
* copy the string in (*dv + plen) to *p