version 1.148, 2014/05/07 16:19:03 |
version 1.150, 2014/06/19 00:45:37 |
Line 433 main(int argc, char *argv[]) |
|
Line 433 main(int argc, char *argv[]) |
|
if (OP_UPDATE == op || OP_DELETE == op || OP_TEST == op) { |
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. |
* Jump into that directory first. |
*/ |
*/ |
if (0 == set_basedir(path_arg)) |
if (OP_TEST != op && 0 == set_basedir(path_arg)) |
goto out; |
goto out; |
|
|
if (dbopen(1)) { |
if (dbopen(1)) { |
Line 525 main(int argc, char *argv[]) |
|
Line 525 main(int argc, char *argv[]) |
|
} |
} |
} |
} |
out: |
out: |
set_basedir(NULL); |
|
manpath_free(&dirs); |
manpath_free(&dirs); |
mchars_free(mc); |
mchars_free(mc); |
mparse_free(mp); |
mparse_free(mp); |
Line 800 filescan(const char *file) |
|
Line 799 filescan(const char *file) |
|
return; |
return; |
} |
} |
|
|
if (strstr(buf, basedir) == buf) |
if (OP_TEST == op) |
start = buf + strlen(basedir) + 1; |
|
else if (OP_TEST == op) |
|
start = buf; |
start = buf; |
|
else if (strstr(buf, basedir) == buf) |
|
start = buf + strlen(basedir); |
else { |
else { |
exitcode = (int)MANDOCLEVEL_BADARG; |
exitcode = (int)MANDOCLEVEL_BADARG; |
say("", "%s: outside base directory", buf); |
say("", "%s: outside base directory", buf); |
Line 829 filescan(const char *file) |
|
Line 828 filescan(const char *file) |
|
say(file, "Filename too long"); |
say(file, "Filename too long"); |
return; |
return; |
} |
} |
start = strstr(buf, basedir) == buf ? |
start = buf; |
buf + strlen(basedir) + 1 : buf; |
if (OP_TEST != op && strstr(buf, basedir) == buf) |
|
start += strlen(basedir); |
} |
} |
|
|
mlink = mandoc_calloc(1, sizeof(struct mlink)); |
mlink = mandoc_calloc(1, sizeof(struct mlink)); |
Line 2230 dbopen(int real) |
|
Line 2230 dbopen(int real) |
|
rc = sqlite3_open_v2(MANDOC_DB, &db, ofl, NULL); |
rc = sqlite3_open_v2(MANDOC_DB, &db, ofl, NULL); |
if (SQLITE_OK != rc) { |
if (SQLITE_OK != rc) { |
exitcode = (int)MANDOCLEVEL_SYSERR; |
exitcode = (int)MANDOCLEVEL_SYSERR; |
say(MANDOC_DB, "%s", sqlite3_errstr(rc)); |
if (SQLITE_CANTOPEN != rc) |
|
say(MANDOC_DB, "%s", sqlite3_errstr(rc)); |
return(0); |
return(0); |
} |
} |
goto prepare_statements; |
goto prepare_statements; |
Line 2374 set_basedir(const char *targetdir) |
|
Line 2375 set_basedir(const char *targetdir) |
|
{ |
{ |
static char startdir[PATH_MAX]; |
static char startdir[PATH_MAX]; |
static int fd; |
static int fd; |
|
char *cp; |
|
|
/* |
/* |
* Remember where we started by keeping a fd open to the origin |
* Remember where we started by keeping a fd open to the origin |
Line 2384 set_basedir(const char *targetdir) |
|
Line 2386 set_basedir(const char *targetdir) |
|
if ('\0' == *startdir) { |
if ('\0' == *startdir) { |
if (NULL == getcwd(startdir, PATH_MAX)) { |
if (NULL == getcwd(startdir, PATH_MAX)) { |
exitcode = (int)MANDOCLEVEL_SYSERR; |
exitcode = (int)MANDOCLEVEL_SYSERR; |
if (NULL != targetdir) |
say("", "&getcwd"); |
say("", "&getcwd"); |
|
return(0); |
return(0); |
} |
} |
if (-1 == (fd = open(startdir, O_RDONLY, 0))) { |
if (-1 == (fd = open(startdir, O_RDONLY, 0))) { |
Line 2393 set_basedir(const char *targetdir) |
|
Line 2394 set_basedir(const char *targetdir) |
|
say("", "&open %s", startdir); |
say("", "&open %s", startdir); |
return(0); |
return(0); |
} |
} |
if (NULL == targetdir) |
|
targetdir = startdir; |
|
} else { |
} else { |
if (-1 == fd) |
if (-1 == fd) |
return(0); |
return(0); |
Line 2405 set_basedir(const char *targetdir) |
|
Line 2404 set_basedir(const char *targetdir) |
|
say("", "&chdir %s", startdir); |
say("", "&chdir %s", startdir); |
return(0); |
return(0); |
} |
} |
if (NULL == targetdir) { |
|
close(fd); |
|
return(1); |
|
} |
|
} |
} |
if (NULL == realpath(targetdir, basedir)) { |
if (NULL == realpath(targetdir, basedir)) { |
basedir[0] = '\0'; |
basedir[0] = '\0'; |
Line 2419 set_basedir(const char *targetdir) |
|
Line 2414 set_basedir(const char *targetdir) |
|
exitcode = (int)MANDOCLEVEL_BADARG; |
exitcode = (int)MANDOCLEVEL_BADARG; |
say("", "&chdir"); |
say("", "&chdir"); |
return(0); |
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); |
return(1); |
} |
} |