summaryrefslogtreecommitdiff
path: root/src/or
diff options
context:
space:
mode:
Diffstat (limited to 'src/or')
-rw-r--r--src/or/circuitstats.c11
-rw-r--r--src/or/circuitstats.h3
-rw-r--r--src/or/config.c15
-rw-r--r--src/or/confparse.h1
-rw-r--r--src/or/control.c10
-rw-r--r--src/or/dirserv.c11
-rw-r--r--src/or/entrynodes.c2
-rw-r--r--src/or/include.am3
-rw-r--r--src/or/main.c13
-rw-r--r--src/or/or.h3
10 files changed, 62 insertions, 10 deletions
diff --git a/src/or/circuitstats.c b/src/or/circuitstats.c
index fe6f723bd5..51d580a1a4 100644
--- a/src/or/circuitstats.c
+++ b/src/or/circuitstats.c
@@ -107,10 +107,19 @@ get_circuit_build_timeout_ms(void)
int
circuit_build_times_disabled(const or_options_t *options)
{
+ return circuit_build_times_disabled_(options, 0);
+}
+
+/** As circuit_build_times_disabled, but take options as an argument. */
+int
+circuit_build_times_disabled_(const or_options_t *options,
+ int ignore_consensus)
+{
if (unit_tests) {
return 0;
} else {
- int consensus_disabled = networkstatus_get_param(NULL, "cbtdisabled",
+ int consensus_disabled =
+ ignore_consensus ? 0 : networkstatus_get_param(NULL, "cbtdisabled",
0, 0, 1);
int config_disabled = !options->LearnCircuitBuildTimeout;
int dirauth_disabled = options->AuthoritativeDir;
diff --git a/src/or/circuitstats.h b/src/or/circuitstats.h
index 4977b26c0d..8a1dec4bfd 100644
--- a/src/or/circuitstats.h
+++ b/src/or/circuitstats.h
@@ -18,6 +18,9 @@ double get_circuit_build_close_time_ms(void);
double get_circuit_build_timeout_ms(void);
int circuit_build_times_disabled(const or_options_t *options);
+int circuit_build_times_disabled_(const or_options_t *options,
+ int ignore_consensus);
+
int circuit_build_times_enough_to_compute(const circuit_build_times_t *cbt);
void circuit_build_times_update_state(const circuit_build_times_t *cbt,
or_state_t *state);
diff --git a/src/or/config.c b/src/or/config.c
index 09d558e1b4..c96f42c6e2 100644
--- a/src/or/config.c
+++ b/src/or/config.c
@@ -2775,7 +2775,7 @@ compute_publishserverdescriptor(or_options_t *options)
#define MIN_REND_POST_PERIOD (10*60)
#define MIN_REND_POST_PERIOD_TESTING (5)
-/** Higest allowable value for CircuitsAvailableTimeout.
+/** Highest allowable value for CircuitsAvailableTimeout.
* If this is too large, client connections will stay open for too long,
* incurring extra padding overhead. */
#define MAX_CIRCS_AVAILABLE_TIME (24*60*60)
@@ -3490,7 +3490,7 @@ options_validate(or_options_t *old_options, or_options_t *options,
int severity = LOG_NOTICE;
/* Be a little quieter if we've deliberately disabled
* LearnCircuitBuildTimeout. */
- if (circuit_build_times_disabled(options)) {
+ if (circuit_build_times_disabled_(options, 1)) {
severity = LOG_INFO;
}
log_fn(severity, LD_CONFIG, "You disabled LearnCircuitBuildTimeout, but "
@@ -5056,6 +5056,7 @@ options_init_from_string(const char *cf_defaults, const char *cf,
config_line_t *cl;
int retval;
setopt_err_t err = SETOPT_ERR_MISC;
+ int cf_has_include = 0;
tor_assert(msg);
oldoptions = global_options; /* get_options unfortunately asserts if
@@ -5072,7 +5073,8 @@ options_init_from_string(const char *cf_defaults, const char *cf,
if (!body)
continue;
/* get config lines, assign them */
- retval = config_get_lines(body, &cl, 1);
+ retval = config_get_lines_include(body, &cl, 1,
+ body == cf ? &cf_has_include : NULL);
if (retval < 0) {
err = SETOPT_ERR_PARSE;
goto err;
@@ -5100,6 +5102,8 @@ options_init_from_string(const char *cf_defaults, const char *cf,
goto err;
}
+ newoptions->IncludeUsed = cf_has_include;
+
/* If this is a testing network configuration, change defaults
* for a list of dependent config options, re-initialize newoptions
* with the new defaults, and assign all options to it second time. */
@@ -5143,7 +5147,8 @@ options_init_from_string(const char *cf_defaults, const char *cf,
if (!body)
continue;
/* get config lines, assign them */
- retval = config_get_lines(body, &cl, 1);
+ retval = config_get_lines_include(body, &cl, 1,
+ body == cf ? &cf_has_include : NULL);
if (retval < 0) {
err = SETOPT_ERR_PARSE;
goto err;
@@ -5166,6 +5171,8 @@ options_init_from_string(const char *cf_defaults, const char *cf,
}
}
+ newoptions->IncludeUsed = cf_has_include;
+
/* Validate newoptions */
if (options_validate(oldoptions, newoptions, newdefaultoptions,
0, msg) < 0) {
diff --git a/src/or/confparse.h b/src/or/confparse.h
index 6f5c681ba8..9c4205d07c 100644
--- a/src/or/confparse.h
+++ b/src/or/confparse.h
@@ -124,7 +124,6 @@ const char *config_find_deprecation(const config_format_t *fmt,
const char *key);
const config_var_t *config_find_option(const config_format_t *fmt,
const char *key);
-
const char *config_expand_abbrev(const config_format_t *fmt,
const char *option,
int command_line, int warn_obsolete);
diff --git a/src/or/control.c b/src/or/control.c
index 4e85c38123..083768c3d3 100644
--- a/src/or/control.c
+++ b/src/or/control.c
@@ -1462,8 +1462,10 @@ handle_control_saveconf(control_connection_t *conn, uint32_t len,
const char *body)
{
(void) len;
- (void) body;
- if (options_save_current()<0) {
+
+ int force = !strcmpstart(body, "FORCE");
+ const or_options_t *options = get_options();
+ if ((!force && options->IncludeUsed) || options_save_current() < 0) {
connection_write_str_to_buf(
"551 Unable to write configuration to disk.\r\n", conn);
} else {
@@ -1677,6 +1679,8 @@ getinfo_helper_misc(control_connection_t *conn, const char *question,
*answer = tor_strdup(a);
} else if (!strcmp(question, "config-text")) {
*answer = options_dump(get_options(), OPTIONS_DUMP_MINIMAL);
+ } else if (!strcmp(question, "config-can-saveconf")) {
+ *answer = tor_strdup(get_options()->IncludeUsed ? "0" : "1");
} else if (!strcmp(question, "info/names")) {
*answer = list_getinfo_options();
} else if (!strcmp(question, "dormant")) {
@@ -2931,6 +2935,8 @@ static const getinfo_item_t getinfo_items[] = {
ITEM("config-defaults-file", misc, "Current location of the defaults file."),
ITEM("config-text", misc,
"Return the string that would be written by a saveconf command."),
+ ITEM("config-can-saveconf", misc,
+ "Is it possible to save the configuration to the \"torrc\" file?"),
ITEM("accounting/bytes", accounting,
"Number of bytes read/written so far in the accounting interval."),
ITEM("accounting/bytes-left", accounting,
diff --git a/src/or/dirserv.c b/src/or/dirserv.c
index 2b10a09ead..1441d64506 100644
--- a/src/or/dirserv.c
+++ b/src/or/dirserv.c
@@ -398,6 +398,17 @@ dirserv_get_status_impl(const char *id_digest, const char *nickname,
return FP_REJECT;
}
+ /* Tor 0.2.9.x where x<5 suffers from bug #20499, where relays don't
+ * keep their consensus up to date so they make bad guards.
+ * The simple fix is to just drop them from the network. */
+ if (platform &&
+ tor_version_as_new_as(platform,"0.2.9.0-alpha") &&
+ !tor_version_as_new_as(platform,"0.2.9.5-alpha")) {
+ if (msg)
+ *msg = "Tor version contains bug 20499. Please upgrade!";
+ return FP_REJECT;
+ }
+
status_by_digest = digestmap_get(fingerprint_list->status_by_digest,
id_digest);
if (status_by_digest)
diff --git a/src/or/entrynodes.c b/src/or/entrynodes.c
index a0a595b541..c334a7aba0 100644
--- a/src/or/entrynodes.c
+++ b/src/or/entrynodes.c
@@ -67,7 +67,7 @@
*
* While we're building circuits, we track a little "guard state" for
* each circuit. We use this to keep track of whether the circuit is
- * one that we can use as soon as its done, or whether it's one that
+ * one that we can use as soon as it's done, or whether it's one that
* we should keep around to see if we can do better. In the latter case,
* a periodic call to entry_guards_upgrade_waiting_circuits() will
* eventually upgrade it.
diff --git a/src/or/include.am b/src/or/include.am
index 7b031f737b..1ef5afa013 100644
--- a/src/or/include.am
+++ b/src/or/include.am
@@ -124,7 +124,8 @@ src_or_tor_LDADD = src/or/libtor.a src/common/libor.a src/common/libor-ctime.a \
src/trace/libor-trace.a \
@TOR_ZLIB_LIBS@ @TOR_LIB_MATH@ @TOR_LIBEVENT_LIBS@ @TOR_OPENSSL_LIBS@ \
@TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@ @TOR_SYSTEMD_LIBS@ \
- @TOR_LZMA_LIBS@ @TOR_ZSTD_LIBS@
+ @TOR_LZMA_LIBS@ @TOR_ZSTD_LIBS@ \
+ $(rust_ldadd)
if COVERAGE_ENABLED
src_or_tor_cov_SOURCES = src/or/tor_main.c
diff --git a/src/or/main.c b/src/or/main.c
index 670535b5d5..2520a7e21d 100644
--- a/src/or/main.c
+++ b/src/or/main.c
@@ -59,6 +59,7 @@
#include "circuitlist.h"
#include "circuituse.h"
#include "command.h"
+#include "compat_rust.h"
#include "compress.h"
#include "config.h"
#include "confparse.h"
@@ -3073,6 +3074,15 @@ tor_init(int argc, char *argv[])
"Expect more bugs than usual.");
}
+ {
+ rust_str_t rust_str = rust_welcome_string();
+ const char *s = rust_str_get(rust_str);
+ if (strlen(s) > 0) {
+ log_notice(LD_GENERAL, "%s", s);
+ }
+ rust_str_free(rust_str);
+ }
+
if (network_init()<0) {
log_err(LD_BUG,"Error initializing network; exiting.");
return -1;
@@ -3667,6 +3677,9 @@ tor_main(int argc, char *argv[])
int result = 0;
#ifdef _WIN32
+#ifndef HeapEnableTerminationOnCorruption
+#define HeapEnableTerminationOnCorruption 1
+#endif
/* On heap corruption, just give up; don't try to play along. */
HeapSetInformation(NULL, HeapEnableTerminationOnCorruption, NULL, 0);
/* Call SetProcessDEPPolicy to permanently enable DEP.
diff --git a/src/or/or.h b/src/or/or.h
index acbf8cebbb..0d29e19d75 100644
--- a/src/or/or.h
+++ b/src/or/or.h
@@ -4549,6 +4549,9 @@ typedef struct {
* do we enforce Ed25519 identity match? */
/* NOTE: remove this option someday. */
int AuthDirTestEd25519LinkKeys;
+
+ /** Bool (default: 0): Tells if a %include was used on torrc */
+ int IncludeUsed;
} or_options_t;
/** Persistent state for an onion router, as saved to disk. */