Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
T
Tor
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package Registry
Container Registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Service Desk
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
ZerXes
Tor
Commits
92fb0990
Unverified
Commit
92fb0990
authored
5 years ago
by
teor
Browse files
Options
Downloads
Plain Diff
Merge branch 'maint-0.3.5' into maint-0.4.0
parents
46057ec5
aee966cb
No related branches found
Branches containing commit
No related tags found
Tags containing commit
No related merge requests found
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
changes/bug31571
+7
-0
7 additions, 0 deletions
changes/bug31571
src/lib/err/backtrace.c
+31
-11
31 additions, 11 deletions
src/lib/err/backtrace.c
src/lib/err/backtrace.h
+1
-0
1 addition, 0 deletions
src/lib/err/backtrace.h
src/lib/err/torerr.c
+9
-2
9 additions, 2 deletions
src/lib/err/torerr.c
with
48 additions
and
13 deletions
changes/bug31571
0 → 100644
+
7
−
0
View file @
92fb0990
o Minor bugfixes (error handling):
- Report the tor version whenever an assertion fails. Previously, we only
reported the Tor version on some crashes, and some non-fatal assertions.
Fixes bug 31571; bugfix on 0.3.5.1-alpha.
- On abort, try harder to flush the output buffers of log messages. On
some platforms (macOS), log messages can be discarded when the process
terminates. Fixes bug 31571; bugfix on 0.3.5.1-alpha.
This diff is collapsed.
Click to expand it.
src/lib/err/backtrace.c
+
31
−
11
View file @
92fb0990
...
...
@@ -68,10 +68,10 @@
// Redundant with util.h, but doing it here so we can avoid that dependency.
#define raw_free free
#ifdef USE_BACKTRACE
/** Version of Tor to report in backtrace messages. */
static
char
bt_version
[
128
]
=
""
;
#ifdef USE_BACKTRACE
/** Largest stack depth to try to dump. */
#define MAX_DEPTH 256
/** Static allocation of stack to dump. This is static so we avoid stack
...
...
@@ -127,7 +127,7 @@ log_backtrace_impl(int severity, int domain, const char *msg,
depth
=
backtrace
(
cb_buf
,
MAX_DEPTH
);
symbols
=
backtrace_symbols
(
cb_buf
,
(
int
)
depth
);
logger
(
severity
,
domain
,
"%s. Stack trace:"
,
msg
);
logger
(
severity
,
domain
,
"
%s:
%s. Stack trace:"
,
bt_version
,
msg
);
if
(
!
symbols
)
{
/* LCOV_EXCL_START -- we can't provoke this. */
logger
(
severity
,
domain
,
" Unable to generate backtrace."
);
...
...
@@ -193,15 +193,12 @@ dump_stack_symbols_to_error_fds(void)
/** Install signal handlers as needed so that when we crash, we produce a
* useful stack trace. Return 0 on success, -errno on failure. */
static
int
install_bt_handler
(
const
char
*
software
)
install_bt_handler
(
void
)
{
int
trap_signals
[]
=
{
SIGSEGV
,
SIGILL
,
SIGFPE
,
SIGBUS
,
SIGSYS
,
SIGIO
,
-
1
};
int
i
,
rv
=
0
;
strncpy
(
bt_version
,
software
,
sizeof
(
bt_version
)
-
1
);
bt_version
[
sizeof
(
bt_version
)
-
1
]
=
0
;
struct
sigaction
sa
;
memset
(
&
sa
,
0
,
sizeof
(
sa
));
...
...
@@ -243,13 +240,13 @@ void
log_backtrace_impl
(
int
severity
,
int
domain
,
const
char
*
msg
,
tor_log_fn
logger
)
{
logger
(
severity
,
domain
,
"%s. (Stack trace not available)"
,
msg
);
logger
(
severity
,
domain
,
"%s: %s. (Stack trace not available)"
,
bt_version
,
msg
);
}
static
int
install_bt_handler
(
const
char
*
software
)
install_bt_handler
(
void
)
{
(
void
)
software
;
return
0
;
}
...
...
@@ -264,6 +261,14 @@ dump_stack_symbols_to_error_fds(void)
}
#endif
/* defined(NO_BACKTRACE_IMPL) */
/** Return the tor version used for error messages on crashes.
* Signal-safe: returns a pointer to a static array. */
const
char
*
get_tor_backtrace_version
(
void
)
{
return
bt_version
;
}
/** Set up code to handle generating error messages on crashes. */
int
configure_backtrace_handler
(
const
char
*
tor_version
)
...
...
@@ -271,10 +276,25 @@ configure_backtrace_handler(const char *tor_version)
char
version
[
128
]
=
"Tor
\0
"
;
if
(
tor_version
)
{
snprintf
(
version
,
sizeof
(
version
),
"Tor %s"
,
tor_version
);
int
snp_rv
=
0
;
/* We can't use strlcat() here, because it is defined in
* string/compat_string.h on some platforms, and string uses torerr. */
snp_rv
=
snprintf
(
version
,
sizeof
(
version
),
"Tor %s"
,
tor_version
);
/* It's safe to call raw_assert() here, because raw_assert() does not
* call configure_backtrace_handler(). */
raw_assert
(
snp_rv
<
(
int
)
sizeof
(
version
));
raw_assert
(
snp_rv
>=
0
);
}
return
install_bt_handler
(
version
);
char
*
str_rv
=
NULL
;
/* We can't use strlcpy() here, see the note about strlcat() above. */
str_rv
=
strncpy
(
bt_version
,
version
,
sizeof
(
bt_version
)
-
1
);
/* We must terminate bt_version, then raw_assert(), because raw_assert()
* uses bt_version. */
bt_version
[
sizeof
(
bt_version
)
-
1
]
=
0
;
raw_assert
(
str_rv
==
bt_version
);
return
install_bt_handler
();
}
/** Perform end-of-process cleanup for code that generates error messages on
...
...
This diff is collapsed.
Click to expand it.
src/lib/err/backtrace.h
+
1
−
0
View file @
92fb0990
...
...
@@ -21,6 +21,7 @@ void log_backtrace_impl(int severity, int domain, const char *msg,
int
configure_backtrace_handler
(
const
char
*
tor_version
);
void
clean_up_backtrace_handler
(
void
);
void
dump_stack_symbols_to_error_fds
(
void
);
const
char
*
get_tor_backtrace_version
(
void
);
#define log_backtrace(sev, dom, msg) \
log_backtrace_impl((sev), (dom), (msg), tor_log)
...
...
This diff is collapsed.
Click to expand it.
src/lib/err/torerr.c
+
9
−
2
View file @
92fb0990
...
...
@@ -154,14 +154,21 @@ tor_raw_assertion_failed_msg_(const char *file, int line, const char *expr,
{
char
linebuf
[
16
];
format_dec_number_sigsafe
(
line
,
linebuf
,
sizeof
(
linebuf
));
tor_log_err_sigsafe
(
"INTERNAL ERROR: Raw assertion failed at "
,
file
,
":"
,
linebuf
,
": "
,
expr
,
NULL
);
tor_log_err_sigsafe
(
"INTERNAL ERROR: Raw assertion failed in "
,
get_tor_backtrace_version
(),
" at "
,
file
,
":"
,
linebuf
,
": "
,
expr
,
"
\n
"
,
NULL
);
if
(
msg
)
{
tor_log_err_sigsafe_write
(
msg
);
tor_log_err_sigsafe_write
(
"
\n
"
);
}
dump_stack_symbols_to_error_fds
();
/* Some platforms (macOS, maybe others?) can swallow the last write before an
* abort. This issue is probably caused by a race condition between write
* buffer cache flushing, and process termination. So we write an extra
* newline, to make sure that the message always gets through. */
tor_log_err_sigsafe_write
(
"
\n
"
);
}
/* As format_{hex,dex}_number_sigsafe, but takes a <b>radix</b> argument
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment