[tor-commits] [tor/master] Do not page-align mmap length. #25399

nickm at torproject.org nickm at torproject.org
Thu Mar 22 12:51:41 UTC 2018


commit 946ed24ca5a152acc6c2d71e395eaa65111f2825
Author: Alex Xu (Hello71) <alex_y_xu at yahoo.ca>
Date:   Fri Mar 2 09:50:21 2018 -0500

    Do not page-align mmap length. #25399
---
 changes/bug25399    |  3 +++
 configure.ac        |  9 +--------
 src/common/compat.c | 27 ++++++---------------------
 src/common/compat.h |  4 ++--
 4 files changed, 12 insertions(+), 31 deletions(-)

diff --git a/changes/bug25399 b/changes/bug25399
new file mode 100644
index 000000000..290ebf45a
--- /dev/null
+++ b/changes/bug25399
@@ -0,0 +1,3 @@
+  o Minor bugfixes (portability):
+    - Do not align mmap length, as it is not required by POSIX, and the
+      getpagesize function is deprecated. Fixes bug 25399.
diff --git a/configure.ac b/configure.ac
index 22c8a5613..d05fdcbf3 100644
--- a/configure.ac
+++ b/configure.ac
@@ -553,6 +553,7 @@ AC_CHECK_FUNCS(
 	mach_approximate_time \
         memmem \
         memset_s \
+        mmap \
 	pipe \
 	pipe2 \
         prctl \
@@ -1739,14 +1740,6 @@ AC_CHECK_DECLS([mlockall], , , [
 #include <sys/mman.h>
 #endif])
 
-# Some MinGW environments don't have getpagesize in unistd.h. We don't use
-# AC_CHECK_FUNCS(getpagesize), because other environments rename getpagesize
-# using macros
-AC_CHECK_DECLS([getpagesize], , , [
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif])
-
 # Allow user to specify an alternate syslog facility
 AC_ARG_WITH(syslog-facility,
 AS_HELP_STRING(--with-syslog-facility=LOG, [syslog facility to use (default=LOG_DAEMON)]),
diff --git a/src/common/compat.c b/src/common/compat.c
index e8916c8d1..99a7b8c0c 100644
--- a/src/common/compat.c
+++ b/src/common/compat.c
@@ -115,7 +115,7 @@ SecureZeroMemory(PVOID ptr, SIZE_T cnt)
 #ifdef HAVE_SIGNAL_H
 #include <signal.h>
 #endif
-#ifdef HAVE_SYS_MMAN_H
+#ifdef HAVE_MMAP
 #include <sys/mman.h>
 #endif
 #ifdef HAVE_SYS_SYSLIMITS_H
@@ -203,25 +203,17 @@ tor_rename(const char *path_old, const char *path_new)
                 sandbox_intern_string(path_new));
 }
 
-/* Some MinGW builds have sys/mman.h, but not the corresponding symbols.
- * Other configs rename the symbols using macros (including getpagesize).
- * So check for sys/mman.h and unistd.h, and a getpagesize declaration. */
-#if (defined(HAVE_SYS_MMAN_H) && defined(HAVE_UNISTD_H) && \
-     defined(HAVE_DECL_GETPAGESIZE))
-#define COMPAT_HAS_MMAN_AND_PAGESIZE
-#endif
-
-#if defined(COMPAT_HAS_MMAN_AND_PAGESIZE) || \
-  defined(RUNNING_DOXYGEN)
+#if defined(HAVE_MMAP) || defined(RUNNING_DOXYGEN)
 /** Try to create a memory mapping for <b>filename</b> and return it.  On
- * failure, return NULL.  Sets errno properly, using ERANGE to mean
- * "empty file". */
+ * failure, return NULL. Sets errno properly, using ERANGE to mean
+ * "empty file". Must only be called on trusted Tor-owned files, as changing
+ * the underlying file's size causes unspecified behavior. */
 tor_mmap_t *
 tor_mmap_file(const char *filename)
 {
   int fd; /* router file */
   char *string;
-  int page_size, result;
+  int result;
   tor_mmap_t *res;
   size_t size, filesize;
   struct stat st;
@@ -250,13 +242,6 @@ tor_mmap_file(const char *filename)
     return NULL;
   }
   size = filesize = (size_t)(st.st_size);
-  /*
-   * Should we check for weird crap like mmapping a named pipe here,
-   * or just wait for if (!size) below to fail?
-   */
-  /* ensure page alignment */
-  page_size = getpagesize();
-  size += (size%page_size) ? page_size-(size%page_size) : 0;
 
   if (st.st_size > SSIZE_T_CEILING || (off_t)size < st.st_size) {
     log_warn(LD_FS, "File \"%s\" is too large. Ignoring.",filename);
diff --git a/src/common/compat.h b/src/common/compat.h
index f7932c914..1bdff8db3 100644
--- a/src/common/compat.h
+++ b/src/common/compat.h
@@ -318,12 +318,12 @@ typedef struct tor_mmap_t {
   size_t size; /**< Size of the file. */
 
   /* None of the fields below should be accessed from outside compat.c */
-#ifdef HAVE_SYS_MMAN_H
+#ifdef HAVE_MMAP
   size_t mapping_size; /**< Size of the actual mapping. (This is this file
                         * size, rounded up to the nearest page.) */
 #elif defined _WIN32
   HANDLE mmap_handle;
-#endif /* defined(HAVE_SYS_MMAN_H) || ... */
+#endif /* defined(HAVE_MMAP) || ... */
 
 } tor_mmap_t;
 





More information about the tor-commits mailing list