[tor-commits] [tor/master] Fix backtrace compilation on FreeBSD

nickm at torproject.org nickm at torproject.org
Tue Dec 15 16:55:55 UTC 2015


commit 07cca627eaab800d4874f3d0914d3cf7eaa601a9
Author: cypherpunks <cypherpunks at torproject.org>
Date:   Tue Dec 15 16:30:04 2015 +0100

    Fix backtrace compilation on FreeBSD
    
    On FreeBSD backtrace(3) uses size_t instead of int (as glibc does). This
    causes integer precision loss errors when we used int to store its
    results.
    
    The issue is fixed by using size_t to store the results of backtrace(3).
    
    The manual page of glibc does not mention that backtrace(3) returns
    negative values. Therefore, no unsigned integer wrapping occurs when its
    result is stored in an unsigned data type.
---
 changes/bug17827       |    3 +++
 src/common/backtrace.c |   16 ++++++++--------
 src/common/backtrace.h |    2 +-
 src/common/sandbox.c   |    2 +-
 4 files changed, 13 insertions(+), 10 deletions(-)

diff --git a/changes/bug17827 b/changes/bug17827
new file mode 100644
index 0000000..04cd3b5
--- /dev/null
+++ b/changes/bug17827
@@ -0,0 +1,3 @@
+  o Minor bugfixes (compilation):
+    - Fix backtrace compilation on FreeBSD. Fixes bug 17827; bugfix on
+      tor-0.2.5.2-alpha.
diff --git a/src/common/backtrace.c b/src/common/backtrace.c
index a2d5378..8d544ed 100644
--- a/src/common/backtrace.c
+++ b/src/common/backtrace.c
@@ -62,16 +62,16 @@ static tor_mutex_t cb_buf_mutex;
  * ucontext_t structure.
  */
 void
-clean_backtrace(void **stack, int depth, const ucontext_t *ctx)
+clean_backtrace(void **stack, size_t depth, const ucontext_t *ctx)
 {
 #ifdef PC_FROM_UCONTEXT
 #if defined(__linux__)
-  const int n = 1;
+  const size_t n = 1;
 #elif defined(__darwin__) || defined(__APPLE__) || defined(__OpenBSD__) \
   || defined(__FreeBSD__)
-  const int n = 2;
+  const size_t n = 2;
 #else
-  const int n = 1;
+  const size_t n = 1;
 #endif
   if (depth <= n)
     return;
@@ -89,9 +89,9 @@ clean_backtrace(void **stack, int depth, const ucontext_t *ctx)
 void
 log_backtrace(int severity, int domain, const char *msg)
 {
-  int depth;
+  size_t depth;
   char **symbols;
-  int i;
+  size_t i;
 
   tor_mutex_acquire(&cb_buf_mutex);
 
@@ -120,7 +120,7 @@ static void
 crash_handler(int sig, siginfo_t *si, void *ctx_)
 {
   char buf[40];
-  int depth;
+  size_t depth;
   ucontext_t *ctx = (ucontext_t *) ctx_;
   int n_fds, i;
   const int *fds = NULL;
@@ -174,7 +174,7 @@ install_bt_handler(void)
      * libc has pre-loaded the symbols we need to dump things, so that later
      * reads won't be denied by the sandbox code */
     char **symbols;
-    int depth = backtrace(cb_buf, MAX_DEPTH);
+    size_t depth = backtrace(cb_buf, MAX_DEPTH);
     symbols = backtrace_symbols(cb_buf, depth);
     if (symbols)
       free(symbols);
diff --git a/src/common/backtrace.h b/src/common/backtrace.h
index a9151d7..838e18e 100644
--- a/src/common/backtrace.h
+++ b/src/common/backtrace.h
@@ -13,7 +13,7 @@ void clean_up_backtrace_handler(void);
 #ifdef EXPOSE_CLEAN_BACKTRACE
 #if defined(HAVE_EXECINFO_H) && defined(HAVE_BACKTRACE) && \
   defined(HAVE_BACKTRACE_SYMBOLS_FD) && defined(HAVE_SIGACTION)
-void clean_backtrace(void **stack, int depth, const ucontext_t *ctx);
+void clean_backtrace(void **stack, size_t depth, const ucontext_t *ctx);
 #endif
 #endif
 
diff --git a/src/common/sandbox.c b/src/common/sandbox.c
index b995762..3a9f2a1 100644
--- a/src/common/sandbox.c
+++ b/src/common/sandbox.c
@@ -1598,7 +1598,7 @@ sigsys_debugging(int nr, siginfo_t *info, void *void_context)
   const char *syscall_name;
   int syscall;
 #ifdef USE_BACKTRACE
-  int depth;
+  size_t depth;
   int n_fds, i;
   const int *fds = NULL;
 #endif





More information about the tor-commits mailing list