diff options
Diffstat (limited to 'testing/apparmor/0005-libapparmor-fix-scandirat-with-musl-libc.patch')
-rw-r--r-- | testing/apparmor/0005-libapparmor-fix-scandirat-with-musl-libc.patch | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/testing/apparmor/0005-libapparmor-fix-scandirat-with-musl-libc.patch b/testing/apparmor/0005-libapparmor-fix-scandirat-with-musl-libc.patch new file mode 100644 index 0000000000..895cd98d71 --- /dev/null +++ b/testing/apparmor/0005-libapparmor-fix-scandirat-with-musl-libc.patch @@ -0,0 +1,96 @@ +From 1b918a4af49ae4a2644b089ff3263018157365ab Mon Sep 17 00:00:00 2001 +From: allgdante <allan.garret@gmail.com> +Date: Wed, 4 Jul 2018 16:50:24 +0200 +Subject: [PATCH 05/11] libapparmor: fix scandirat with musl libc + +This commits adds a configure check for scandirat() and if it's +not available, provides it an implementation based on scandir() +from musl libc +--- + libraries/libapparmor/configure.ac | 2 +- + libraries/libapparmor/src/private.c | 56 +++++++++++++++++++++++++++++ + 2 files changed, 57 insertions(+), 1 deletion(-) + +diff --git a/libraries/libapparmor/configure.ac b/libraries/libapparmor/configure.ac +index 73d99398..699f7477 100644 +--- a/libraries/libapparmor/configure.ac ++++ b/libraries/libapparmor/configure.ac +@@ -81,7 +81,7 @@ AM_CONDITIONAL(HAVE_RUBY, test x$with_ruby = xyes) + AC_HEADER_STDC + AC_CHECK_HEADERS(unistd.h stdint.h syslog.h) + +-AC_CHECK_FUNCS([asprintf __secure_getenv secure_getenv reallocarray]) ++AC_CHECK_FUNCS([asprintf __secure_getenv secure_getenv reallocarray scandirat]) + + AM_PROG_CC_C_O + AC_C_CONST +diff --git a/libraries/libapparmor/src/private.c b/libraries/libapparmor/src/private.c +index f5cc2a4c..5c023d32 100644 +--- a/libraries/libapparmor/src/private.c ++++ b/libraries/libapparmor/src/private.c +@@ -45,6 +45,62 @@ + #endif + #endif + ++/** ++ * Allow libapparmor to build on other libcs that do not support scandirat ++ */ ++#ifndef HAVE_SCANDIRAT ++#include <inttypes.h> ++ ++int scandirat(int dir_fd, const char *dirp, struct dirent ***namelist, ++ int (*filter)(const struct dirent *), ++ int (*compar)(const struct dirent **, const struct dirent **)) ++{ ++ int fd; ++ DIR *d; ++ struct dirent *de, **names=0, **tmp; ++ size_t cnt=0, len=0; ++ int old_errno = errno; ++ ++ ++ fd = openat(dir_fd, dirp, O_RDONLY|O_CLOEXEC); ++ if (fd == -1) return -1; ++ ++ d = fdopendir(fd); ++ ++ if (!d) { ++ close(fd); ++ return -1; ++ } ++ ++ while ((errno=0), (de = readdir(d))) { ++ if (filter && !filter(de)) continue; ++ if (cnt >= len) { ++ len = 2*len+1; ++ if (len > SIZE_MAX/sizeof *names) break; ++ tmp = realloc(names, len * sizeof *names); ++ if (!tmp) break; ++ names = tmp; ++ } ++ names[cnt] = malloc(de->d_reclen); ++ if (!names[cnt]) break; ++ memcpy(names[cnt++], de, de->d_reclen); ++ } ++ ++ closedir(d); ++ ++ if (errno) { ++ if (names) while (cnt-->0) free(names[cnt]); ++ free(names); ++ return -1; ++ } ++ errno = old_errno; ++ ++ if (compar) qsort(names, cnt, sizeof *names, (int (*)(const void *, const void *))compar); ++ *namelist = names; ++ return cnt; ++} ++#endif ++ + /** + * Allow libapparmor to build on older glibcs and other libcs that do + * not support reallocarray. +-- +2.17.1 + |