mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-23 20:03:31 +01:00
Do not page-align mmap length. #25399
This commit is contained in:
parent
54e25ab124
commit
946ed24ca5
3
changes/bug25399
Normal file
3
changes/bug25399
Normal file
@ -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.
|
@ -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 \
|
||||||
@ -1739,14 +1740,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)]),
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user