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.
This commit is contained in:
cypherpunks 2015-12-15 16:30:04 +01:00 committed by Nick Mathewson
parent 254d63dabe
commit 07cca627ea
4 changed files with 13 additions and 10 deletions

3
changes/bug17827 Normal file
View File

@ -0,0 +1,3 @@
o Minor bugfixes (compilation):
- Fix backtrace compilation on FreeBSD. Fixes bug 17827; bugfix on
tor-0.2.5.2-alpha.

View File

@ -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);

View File

@ -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

View File

@ -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