mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2025-02-25 15:10:48 +01:00
Warn on zstd header/library version mismatch
If we're going to potentially degrade performance in this case, we may as well tell people so.
This commit is contained in:
parent
f98cb5d355
commit
a77a366b87
5 changed files with 52 additions and 8 deletions
|
@ -663,3 +663,13 @@ tor_compress_init(void)
|
|||
tor_zstd_init();
|
||||
}
|
||||
|
||||
/** Warn if we had any problems while setting up our compression libraries.
|
||||
*
|
||||
* (This isn't part of tor_compress_init, since the logs aren't set up yet.)
|
||||
*/
|
||||
void
|
||||
tor_compress_log_init_warnings(void)
|
||||
{
|
||||
tor_zstd_warn_if_version_mismatched();
|
||||
}
|
||||
|
||||
|
|
|
@ -87,6 +87,7 @@ void tor_compress_free_(tor_compress_state_t *state);
|
|||
size_t tor_compress_state_size(const tor_compress_state_t *state);
|
||||
|
||||
void tor_compress_init(void);
|
||||
void tor_compress_log_init_warnings(void);
|
||||
|
||||
#endif /* !defined(TOR_COMPRESS_H) */
|
||||
|
||||
|
|
|
@ -58,21 +58,29 @@ tor_zstd_method_supported(void)
|
|||
#endif
|
||||
}
|
||||
|
||||
/** Format a zstd version number as a string in <b>buf</b>. */
|
||||
static void
|
||||
tor_zstd_format_version(char *buf, size_t buflen, unsigned version_number)
|
||||
{
|
||||
tor_snprintf(buf, buflen,
|
||||
"%u.%u.%u",
|
||||
version_number / 10000 % 100,
|
||||
version_number / 100 % 100,
|
||||
version_number % 100);
|
||||
}
|
||||
|
||||
#define VERSION_STR_MAX_LEN 16 /* more than enough space for 99.99.99 */
|
||||
|
||||
/** Return a string representation of the version of the currently running
|
||||
* version of libzstd. Returns NULL if Zstandard is unsupported. */
|
||||
const char *
|
||||
tor_zstd_get_version_str(void)
|
||||
{
|
||||
#ifdef HAVE_ZSTD
|
||||
static char version_str[16];
|
||||
size_t version_number;
|
||||
static char version_str[VERSION_STR_MAX_LEN];
|
||||
|
||||
version_number = ZSTD_versionNumber();
|
||||
tor_snprintf(version_str, sizeof(version_str),
|
||||
"%d.%d.%d",
|
||||
(int) version_number / 10000 % 100,
|
||||
(int) version_number / 100 % 100,
|
||||
(int) version_number % 100);
|
||||
tor_zstd_format_version(version_str, sizeof(version_str),
|
||||
ZSTD_versionNumber());
|
||||
|
||||
return version_str;
|
||||
#else /* !(defined(HAVE_ZSTD)) */
|
||||
|
@ -487,6 +495,27 @@ tor_zstd_init(void)
|
|||
atomic_counter_init(&total_zstd_allocation);
|
||||
}
|
||||
|
||||
/** Warn if the header and library versions don't match. */
|
||||
void
|
||||
tor_zstd_warn_if_version_mismatched(void)
|
||||
{
|
||||
#ifdef HAVE_ZSTD
|
||||
if (! tor_zstd_can_use_static_apis()) {
|
||||
char header_version[VERSION_STR_MAX_LEN];
|
||||
char runtime_version[VERSION_STR_MAX_LEN];
|
||||
tor_zstd_format_version(header_version, sizeof(header_version),
|
||||
ZSTD_VERSION_NUMBER);
|
||||
tor_zstd_format_version(runtime_version, sizeof(runtime_version),
|
||||
ZSTD_versionNumber());
|
||||
|
||||
log_warn(LD_GENERAL,
|
||||
"Tor was compiled with zstd %s, but is running with zstd %s. "
|
||||
"For safety, we'll avoid using advanced zstd functionality.",
|
||||
header_version, runtime_version);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef TOR_UNIT_TESTS
|
||||
/** Testing only: disable usage of static-only APIs, so we can make sure that
|
||||
* we still work without them. */
|
||||
|
@ -496,3 +525,4 @@ tor_zstd_set_static_apis_disabled_for_testing(int disabled)
|
|||
static_apis_disable_for_testing = disabled;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
|
@ -43,6 +43,7 @@ size_t tor_zstd_compress_state_size(const tor_zstd_compress_state_t *state);
|
|||
size_t tor_zstd_get_total_allocation(void);
|
||||
|
||||
void tor_zstd_init(void);
|
||||
void tor_zstd_warn_if_version_mismatched(void);
|
||||
|
||||
#ifdef TOR_UNIT_TESTS
|
||||
void tor_zstd_set_static_apis_disabled_for_testing(int disabled);
|
||||
|
|
|
@ -3323,6 +3323,8 @@ tor_init(int argc, char *argv[])
|
|||
if (strstr(version, "alpha") || strstr(version, "beta"))
|
||||
log_notice(LD_GENERAL, "This version is not a stable Tor release. "
|
||||
"Expect more bugs than usual.");
|
||||
|
||||
tor_compress_log_init_warnings();
|
||||
}
|
||||
|
||||
#ifdef HAVE_RUST
|
||||
|
|
Loading…
Add table
Reference in a new issue