]> source.dussan.org Git - rspamd.git/commitdiff
[Fix] Another try to deal with posix idiotizm
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Wed, 19 Oct 2016 13:54:42 +0000 (14:54 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Wed, 19 Oct 2016 13:55:02 +0000 (14:55 +0100)
CMakeLists.txt
config.h.in
src/client/rspamc.c

index 3163e6a941cbdbc23c4fa7791f8ccc345ae374c8..882d46a8bfb60638b0ec88bd724aa94347966a42 100644 (file)
@@ -965,6 +965,8 @@ CHECK_SYMBOL_EXISTS(O_ASYNC "sys/types.h;sys/fcntl.h" HAVE_OASYNC)
 CHECK_SYMBOL_EXISTS(O_NOFOLLOW "sys/types.h;sys/fcntl.h" HAVE_ONOFOLLOW)
 LIST(APPEND CMAKE_REQUIRED_INCLUDES "${LIBSSL_INCLUDE}")
 CHECK_SYMBOL_EXISTS(SSL_set_tlsext_host_name "openssl/ssl.h" HAVE_SSL_TLSEXT_HOSTNAME)
+CHECK_SYMBOL_EXISTS(dirfd "sys/types.h;unistd.h;dirent.h" HAVE_DIRFD)
+CHECK_SYMBOL_EXISTS(fpathconf "sys/types.h;unistd.h" HAVE_FPATHCONF)
 
 IF(ENABLE_PCRE2 MATCHES "ON")
        IF(HAVE_PCRE_JIT)
index 90edc11328e3133a60803fe4dd2f557149a3f4d4..bb063b0f03ca47b966d848ca3f9f4fa18f4f07bb 100644 (file)
@@ -21,6 +21,7 @@
 #cmakedefine HAVE_CPUID_H        1
 #cmakedefine HAVE_CTYPE_H        1
 #cmakedefine HAVE_DIRENT_H       1
+#cmakedefine HAVE_DIRFD          1
 #cmakedefine HAVE_ENDIAN_H       1
 #cmakedefine HAVE_EXP2L          1
 #cmakedefine HAVE_EXPL           1
@@ -31,6 +32,7 @@
 #cmakedefine HAVE_FDATASYNC      1
 #cmakedefine HAVE_FETCH_H        1
 #cmakedefine HAVE_FLOCK          1
+#cmakedefine HAVE_FPATHCONF      1
 #cmakedefine HAVE_GETPAGESIZE    1
 #cmakedefine HAVE_GET_CPUID      1
 #cmakedefine HAVE_GLOB_H         1
index 400c4c59bf872499cf279ece57e17c908af5d0fb..c7068ae8d008be8cd75532ebbdac825c176c3bba 100644 (file)
@@ -1411,6 +1411,39 @@ rspamc_process_input (struct event_base *ev_base, struct rspamc_command *cmd,
        g_free (hostbuf);
 }
 
+static gsize
+rspamd_dirent_size (DIR * dirp)
+{
+       goffset name_max;
+       gsize name_end;
+
+#if defined(HAVE_FPATHCONF) && defined(HAVE_DIRFD) \
+       && defined(_PC_NAME_MAX)
+       name_max = fpathconf (dirfd (dirp), _PC_NAME_MAX);
+
+
+# if defined(NAME_MAX)
+       if (name_max == -1) {
+               name_max = (NAME_MAX > 255) ? NAME_MAX : 255;
+       }
+# else
+       if (name_max == -1) {
+               return (size_t)(-1);
+       }
+# endif
+#else
+# if defined(NAME_MAX)
+       name_max = (NAME_MAX > 255) ? NAME_MAX : 255;
+# else
+#   error "buffer size for readdir_r cannot be determined"
+# endif
+#endif
+
+       name_end = G_STRUCT_OFFSET (struct dirent, d_name) + name_max + 1;
+
+       return (name_end > sizeof (struct dirent) ? name_end : sizeof(struct dirent));
+}
+
 static void
 rspamc_process_dir (struct event_base *ev_base, struct rspamc_command *cmd,
        const gchar *name, GQueue *attrs)
@@ -1422,19 +1455,14 @@ rspamc_process_dir (struct event_base *ev_base, struct rspamc_command *cmd,
        FILE *in;
        struct stat st;
        gboolean is_reg, is_dir;
-       gsize name_max, len;
+       gsize len;
 
        d = opendir (name);
 
        if (d != NULL) {
                /* Portably allocate struct direntry */
-               name_max = pathconf (name, _PC_NAME_MAX);
-
-               if (name_max == -1) {
-                       name_max = PATH_MAX;
-               }
-
-               len = G_STRUCT_OFFSET (struct dirent, d_name) + name_max + 1;
+               len = rspamd_dirent_size (d);
+               g_assert (len != (gsize)-1);
                entry = g_malloc0 (len);
 
                while (readdir_r (d, entry, pentry) == 0) {