Merge branch 'bug25399_squashed'

This commit is contained in:
Nick Mathewson 2018-03-22 08:49:43 -04:00
commit 24abcf9771
4 changed files with 14 additions and 31 deletions

5
changes/bug25399 Normal file
View File

@ -0,0 +1,5 @@
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; bugfix on
0.1.1.23.

View File

@ -553,6 +553,7 @@ AC_CHECK_FUNCS(
mach_approximate_time \ mach_approximate_time \
memmem \ memmem \
memset_s \ memset_s \
mmap \
pipe \ pipe \
pipe2 \ pipe2 \
prctl \ prctl \
@ -1740,14 +1741,6 @@ AC_CHECK_DECLS([mlockall], , , [
#include <sys/mman.h> #include <sys/mman.h>
#endif]) #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 # Allow user to specify an alternate syslog facility
AC_ARG_WITH(syslog-facility, AC_ARG_WITH(syslog-facility,
AS_HELP_STRING(--with-syslog-facility=LOG, [syslog facility to use (default=LOG_DAEMON)]), AS_HELP_STRING(--with-syslog-facility=LOG, [syslog facility to use (default=LOG_DAEMON)]),

View File

@ -115,7 +115,7 @@ SecureZeroMemory(PVOID ptr, SIZE_T cnt)
#ifdef HAVE_SIGNAL_H #ifdef HAVE_SIGNAL_H
#include <signal.h> #include <signal.h>
#endif #endif
#ifdef HAVE_SYS_MMAN_H #ifdef HAVE_MMAP
#include <sys/mman.h> #include <sys/mman.h>
#endif #endif
#ifdef HAVE_SYS_SYSLIMITS_H #ifdef HAVE_SYS_SYSLIMITS_H
@ -203,25 +203,17 @@ tor_rename(const char *path_old, const char *path_new)
sandbox_intern_string(path_new)); sandbox_intern_string(path_new));
} }
/* Some MinGW builds have sys/mman.h, but not the corresponding symbols. #if defined(HAVE_MMAP) || defined(RUNNING_DOXYGEN)
* 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)
/** Try to create a memory mapping for <b>filename</b> and return it. On /** Try to create a memory mapping for <b>filename</b> and return it. On
* failure, return NULL. Sets errno properly, using ERANGE to mean * failure, return NULL. Sets errno properly, using ERANGE to mean
* "empty file". */ * "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_t *
tor_mmap_file(const char *filename) tor_mmap_file(const char *filename)
{ {
int fd; /* router file */ int fd; /* router file */
char *string; char *string;
int page_size, result; int result;
tor_mmap_t *res; tor_mmap_t *res;
size_t size, filesize; size_t size, filesize;
struct stat st; struct stat st;
@ -250,13 +242,6 @@ tor_mmap_file(const char *filename)
return NULL; return NULL;
} }
size = filesize = (size_t)(st.st_size); 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) { if (st.st_size > SSIZE_T_CEILING || (off_t)size < st.st_size) {
log_warn(LD_FS, "File \"%s\" is too large. Ignoring.",filename); log_warn(LD_FS, "File \"%s\" is too large. Ignoring.",filename);

View File

@ -318,12 +318,12 @@ typedef struct tor_mmap_t {
size_t size; /**< Size of the file. */ size_t size; /**< Size of the file. */
/* None of the fields below should be accessed from outside compat.c */ /* 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_t mapping_size; /**< Size of the actual mapping. (This is this file
* size, rounded up to the nearest page.) */ * size, rounded up to the nearest page.) */
#elif defined _WIN32 #elif defined _WIN32
HANDLE mmap_handle; HANDLE mmap_handle;
#endif /* defined(HAVE_SYS_MMAN_H) || ... */ #endif /* defined(HAVE_MMAP) || ... */
} tor_mmap_t; } tor_mmap_t;