Check if glob() is available at build-time.

This patch disables the glob() support in the path library if glob() is
unavailable at build-time. This currently happens with the Android NDK
used for Tor Browser.

See: https://bugs.torproject.org/tpo/core/tor/40114
This commit is contained in:
Alexander Færøy 2020-09-09 22:08:54 +00:00 committed by David Goulet
parent 12c7583126
commit 1c4b140427
3 changed files with 24 additions and 5 deletions

View File

@ -845,6 +845,8 @@ fi
AM_CONDITIONAL(BUILD_READPASSPHRASE_C, AM_CONDITIONAL(BUILD_READPASSPHRASE_C,
test "x$ac_cv_func_readpassphrase" = "xno" && test "$bwin32" = "false") test "x$ac_cv_func_readpassphrase" = "xno" && test "$bwin32" = "false")
AC_CHECK_FUNCS(glob)
AC_MSG_CHECKING([whether free(NULL) works]) AC_MSG_CHECKING([whether free(NULL) works])
AC_RUN_IFELSE([AC_LANG_PROGRAM([ AC_RUN_IFELSE([AC_LANG_PROGRAM([
#include <stdlib.h> #include <stdlib.h>

View File

@ -532,7 +532,7 @@ unglob_win32(const char *pattern, int prev_sep, int next_sep)
tor_free(path_until_glob); tor_free(path_until_glob);
return result; return result;
} }
#else /* !defined(_WIN32) */ #elif HAVE_GLOB
/** Same as opendir but calls sandbox_intern_string before */ /** Same as opendir but calls sandbox_intern_string before */
static DIR * static DIR *
prot_opendir(const char *name) prot_opendir(const char *name)
@ -559,7 +559,7 @@ wrap_closedir(void *arg)
{ {
closedir(arg); closedir(arg);
} }
#endif /* defined(_WIN32) */ #endif /* defined(HAVE_GLOB) */
/** Return a new list containing the paths that match the pattern /** 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 * <b>pattern</b>. Return NULL on error. On POSIX systems, errno is set by the
@ -568,14 +568,15 @@ wrap_closedir(void *arg)
struct smartlist_t * struct smartlist_t *
tor_glob(const char *pattern) tor_glob(const char *pattern)
{ {
smartlist_t *result; smartlist_t *result = NULL;
#ifdef _WIN32 #ifdef _WIN32
// PathMatchSpec does not support forward slashes, change them to backslashes // PathMatchSpec does not support forward slashes, change them to backslashes
char *pattern_normalized = tor_strdup(pattern); char *pattern_normalized = tor_strdup(pattern);
tor_strreplacechar(pattern_normalized, '/', *PATH_SEPARATOR); tor_strreplacechar(pattern_normalized, '/', *PATH_SEPARATOR);
result = get_glob_paths(pattern_normalized, unglob_win32, true); result = get_glob_paths(pattern_normalized, unglob_win32, true);
tor_free(pattern_normalized); tor_free(pattern_normalized);
#else /* !(defined(_WIN32)) */ #elif HAVE_GLOB /* !(defined(_WIN32)) */
glob_t matches; glob_t matches;
int flags = GLOB_ERR | GLOB_NOSORT; int flags = GLOB_ERR | GLOB_NOSORT;
#ifdef GLOB_ALTDIRFUNC #ifdef GLOB_ALTDIRFUNC
@ -608,7 +609,11 @@ tor_glob(const char *pattern)
smartlist_add(result, match); smartlist_add(result, match);
} }
globfree(&matches); globfree(&matches);
#endif /* defined(_WIN32) */ #else
(void)pattern;
return result;
#endif /* !defined(HAVE_GLOB) */
return result; return result;
} }

View File

@ -4440,6 +4440,7 @@ test_util_glob(void *ptr)
{ {
(void)ptr; (void)ptr;
#ifdef HAVE_GLOB
smartlist_t *results = NULL; smartlist_t *results = NULL;
int r, i; int r, i;
char *dir1 = NULL, *dir2 = NULL, *forbidden = NULL, *dirname = NULL; char *dir1 = NULL, *dir2 = NULL, *forbidden = NULL, *dirname = NULL;
@ -4656,6 +4657,11 @@ test_util_glob(void *ptr)
SMARTLIST_FOREACH(results, char *, f, tor_free(f)); SMARTLIST_FOREACH(results, char *, f, tor_free(f));
smartlist_free(results); smartlist_free(results);
} }
#else
tt_skip();
done:
return;
#endif
} }
static void static void
@ -4663,6 +4669,7 @@ test_util_get_glob_opened_files(void *ptr)
{ {
(void)ptr; (void)ptr;
#ifdef HAVE_GLOB
smartlist_t *results = NULL; smartlist_t *results = NULL;
int r, i; int r, i;
char *dir1 = NULL, *dir2 = NULL, *forbidden = NULL, *dirname = NULL; char *dir1 = NULL, *dir2 = NULL, *forbidden = NULL, *dirname = NULL;
@ -4843,6 +4850,11 @@ test_util_get_glob_opened_files(void *ptr)
SMARTLIST_FOREACH(results, char *, f, tor_free(f)); SMARTLIST_FOREACH(results, char *, f, tor_free(f));
smartlist_free(results); smartlist_free(results);
} }
#else
tt_skip();
done:
return;
#endif
} }
static void static void