summaryrefslogtreecommitdiff
path: root/src/manp.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/manp.c')
-rw-r--r--src/manp.c21
1 files changed, 17 insertions, 4 deletions
diff --git a/src/manp.c b/src/manp.c
index 015cde89..9fb35cfb 100644
--- a/src/manp.c
+++ b/src/manp.c
@@ -127,7 +127,7 @@ static __inline__ char *has_mandir (const char *p);
static __inline__ char *fsstnd (const char *path);
static char *def_path (int flag);
static void add_dir_to_list (char **lp, const char *dir);
-static char **add_dir_to_path_list (char **mp, const char *p);
+static char **add_dir_to_path_list (char **mphead, char **mp, const char *p);
static void add_to_list (const char *key, const char *cont, int flag)
@@ -347,6 +347,10 @@ static __inline__ void gripe_not_directory (const char *dir)
error (0, 0, _("warning: %s isn't a directory"), dir);
}
+static void gripe_overlong_list (void)
+{
+ error (FAIL, 0, _("manpath list too long"));
+}
/* accept a manpath list, separated with ':', return the associated
catpath list */
@@ -943,8 +947,11 @@ static __inline__ char *get_manpath (char *path)
static void add_dir_to_list (char **lp, const char *dir)
{
int status;
+ int pos = 0;
while (*lp != NULL) {
+ if (pos > MAXDIRS - 1)
+ gripe_overlong_list ();
if (!strcmp (*lp, dir)) {
if (debug)
fprintf (stderr,
@@ -953,6 +960,7 @@ static void add_dir_to_list (char **lp, const char *dir)
return;
}
lp++;
+ pos++;
}
/* Not found -- add it. */
@@ -1002,12 +1010,15 @@ static __inline__ char *has_mandir (const char *path)
return NULL;
}
-static __inline__ char **add_dir_to_path_list (char **mp, const char *p)
+static char **add_dir_to_path_list (char **mphead, char **mp, const char *p)
{
int status;
char wd[PATH_MAX];
char *cwd = wd;
+ if (mp - mphead > MAXDIRS - 1)
+ gripe_overlong_list ();
+
status = is_directory (p);
if (status < 0)
@@ -1037,15 +1048,17 @@ static __inline__ char **add_dir_to_path_list (char **mp, const char *p)
void create_pathlist (const char *manp, char **mp)
{
const char *p, *end;
+ char **mphead = mp;
/* Expand the manpath into a list for easier handling. */
for (p = manp;; p = end + 1) {
end = strchr (p, ':');
if (end)
- mp = add_dir_to_path_list (mp, xstrndup (p, end - p));
+ mp = add_dir_to_path_list (mphead, mp,
+ xstrndup (p, end - p));
else {
- mp = add_dir_to_path_list (mp, p);
+ mp = add_dir_to_path_list (mphead, mp, p);
break;
}
}