Loading changes/bug40318 0 → 100644 +4 −0 Original line number Diff line number Diff line o Minor bugfixes (configuration tests bsd): - Fix glob processing errors when globs expand to invalid paths on BSD systems. Fixes bug 40318; bugfix on 0.4.5.1-alpha. Patch by Daniel Pinto. src/lib/fs/path.c +19 −3 Original line number Diff line number Diff line Loading @@ -571,7 +571,20 @@ wrap_closedir(void *arg) { closedir(arg); } #endif /* defined(_WIN32) || ... */ /** Function passed to glob to handle processing errors. <b>epath</b> is the * path that caused the error and <b>eerrno</b> is the errno set by the * function that failed. We want to ignore ENOENT and ENOTDIR because, in BSD * systems, these are not ignored automatically, which makes glob fail when * globs expand to non-existing paths and GLOB_ERR is set. */ static int glob_errfunc(const char *epath, int eerrno) { (void)epath; return eerrno == ENOENT || eerrno == ENOTDIR ? 0 : -1; } #endif /* defined(HAVE_GLOB) */ /** Return a new list containing the paths that match the pattern * <b>pattern</b>. Return NULL on error. On POSIX systems, errno is set by the Loading @@ -591,7 +604,7 @@ tor_glob(const char *pattern) tor_free(pattern_normalized); #elif HAVE_GLOB /* !(defined(_WIN32)) */ glob_t matches; int flags = GLOB_ERR | GLOB_NOSORT; int flags = GLOB_NOSORT; #ifdef GLOB_ALTDIRFUNC /* use functions that call sandbox_intern_string */ flags |= GLOB_ALTDIRFUNC; Loading @@ -604,7 +617,10 @@ tor_glob(const char *pattern) matches.gl_stat = &prot_stat; matches.gl_lstat = &prot_lstat; #endif /* defined(GLOB_ALTDIRFUNC) */ int ret = glob(pattern, flags, NULL, &matches); // use custom error handler to workaround BSD quirks and do not set GLOB_ERR // because it would make glob fail on error even if the error handler ignores // the error int ret = glob(pattern, flags, glob_errfunc, &matches); if (ret == GLOB_NOMATCH) { return smartlist_new(); } else if (ret != 0) { Loading Loading
changes/bug40318 0 → 100644 +4 −0 Original line number Diff line number Diff line o Minor bugfixes (configuration tests bsd): - Fix glob processing errors when globs expand to invalid paths on BSD systems. Fixes bug 40318; bugfix on 0.4.5.1-alpha. Patch by Daniel Pinto.
src/lib/fs/path.c +19 −3 Original line number Diff line number Diff line Loading @@ -571,7 +571,20 @@ wrap_closedir(void *arg) { closedir(arg); } #endif /* defined(_WIN32) || ... */ /** Function passed to glob to handle processing errors. <b>epath</b> is the * path that caused the error and <b>eerrno</b> is the errno set by the * function that failed. We want to ignore ENOENT and ENOTDIR because, in BSD * systems, these are not ignored automatically, which makes glob fail when * globs expand to non-existing paths and GLOB_ERR is set. */ static int glob_errfunc(const char *epath, int eerrno) { (void)epath; return eerrno == ENOENT || eerrno == ENOTDIR ? 0 : -1; } #endif /* defined(HAVE_GLOB) */ /** Return a new list containing the paths that match the pattern * <b>pattern</b>. Return NULL on error. On POSIX systems, errno is set by the Loading @@ -591,7 +604,7 @@ tor_glob(const char *pattern) tor_free(pattern_normalized); #elif HAVE_GLOB /* !(defined(_WIN32)) */ glob_t matches; int flags = GLOB_ERR | GLOB_NOSORT; int flags = GLOB_NOSORT; #ifdef GLOB_ALTDIRFUNC /* use functions that call sandbox_intern_string */ flags |= GLOB_ALTDIRFUNC; Loading @@ -604,7 +617,10 @@ tor_glob(const char *pattern) matches.gl_stat = &prot_stat; matches.gl_lstat = &prot_lstat; #endif /* defined(GLOB_ALTDIRFUNC) */ int ret = glob(pattern, flags, NULL, &matches); // use custom error handler to workaround BSD quirks and do not set GLOB_ERR // because it would make glob fail on error even if the error handler ignores // the error int ret = glob(pattern, flags, glob_errfunc, &matches); if (ret == GLOB_NOMATCH) { return smartlist_new(); } else if (ret != 0) { Loading