=================================================================== RCS file: /cvs/mandoc/mandocdb.c,v retrieving revision 1.149 retrieving revision 1.150 diff -u -p -r1.149 -r1.150 --- mandoc/mandocdb.c 2014/06/18 19:34:04 1.149 +++ mandoc/mandocdb.c 2014/06/19 00:45:37 1.150 @@ -1,4 +1,4 @@ -/* $Id: mandocdb.c,v 1.149 2014/06/18 19:34:04 schwarze Exp $ */ +/* $Id: mandocdb.c,v 1.150 2014/06/19 00:45:37 schwarze Exp $ */ /* * Copyright (c) 2011, 2012 Kristaps Dzonsons * Copyright (c) 2011, 2012, 2013, 2014 Ingo Schwarze @@ -433,10 +433,10 @@ main(int argc, char *argv[]) if (OP_UPDATE == op || OP_DELETE == op || OP_TEST == op) { /* - * All of these deal with a specific directory. + * Most of these deal with a specific directory. * Jump into that directory first. */ - if (0 == set_basedir(path_arg)) + if (OP_TEST != op && 0 == set_basedir(path_arg)) goto out; if (dbopen(1)) { @@ -525,7 +525,6 @@ main(int argc, char *argv[]) } } out: - set_basedir(NULL); manpath_free(&dirs); mchars_free(mc); mparse_free(mp); @@ -800,10 +799,10 @@ filescan(const char *file) return; } - if (strstr(buf, basedir) == buf) - start = buf + strlen(basedir) + 1; - else if (OP_TEST == op) + if (OP_TEST == op) start = buf; + else if (strstr(buf, basedir) == buf) + start = buf + strlen(basedir); else { exitcode = (int)MANDOCLEVEL_BADARG; say("", "%s: outside base directory", buf); @@ -829,8 +828,9 @@ filescan(const char *file) say(file, "Filename too long"); return; } - start = strstr(buf, basedir) == buf ? - buf + strlen(basedir) + 1 : buf; + start = buf; + if (OP_TEST != op && strstr(buf, basedir) == buf) + start += strlen(basedir); } mlink = mandoc_calloc(1, sizeof(struct mlink)); @@ -2375,6 +2375,7 @@ set_basedir(const char *targetdir) { static char startdir[PATH_MAX]; static int fd; + char *cp; /* * Remember where we started by keeping a fd open to the origin @@ -2385,8 +2386,7 @@ set_basedir(const char *targetdir) if ('\0' == *startdir) { if (NULL == getcwd(startdir, PATH_MAX)) { exitcode = (int)MANDOCLEVEL_SYSERR; - if (NULL != targetdir) - say("", "&getcwd"); + say("", "&getcwd"); return(0); } if (-1 == (fd = open(startdir, O_RDONLY, 0))) { @@ -2394,8 +2394,6 @@ set_basedir(const char *targetdir) say("", "&open %s", startdir); return(0); } - if (NULL == targetdir) - targetdir = startdir; } else { if (-1 == fd) return(0); @@ -2406,10 +2404,6 @@ set_basedir(const char *targetdir) say("", "&chdir %s", startdir); return(0); } - if (NULL == targetdir) { - close(fd); - return(1); - } } if (NULL == realpath(targetdir, basedir)) { basedir[0] = '\0'; @@ -2420,6 +2414,16 @@ set_basedir(const char *targetdir) exitcode = (int)MANDOCLEVEL_BADARG; say("", "&chdir"); return(0); + } + cp = strchr(basedir, '\0'); + if ('/' != cp[-1]) { + if (cp - basedir >= PATH_MAX - 1) { + exitcode = (int)MANDOCLEVEL_SYSERR; + say("", "Filename too long"); + return(0); + } + *cp++ = '/'; + *cp = '\0'; } return(1); }