1 /* Copyright (c) 2001 Matej Pfajfar.
2 * Copyright (c) 2001-2004, Roger Dingledine.
3 * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
4 * Copyright (c) 2007-2017, The Tor Project, Inc. */
5 /* See LICENSE for licensing information */
10 * \brief Handles parsing and encoding the persistent 'state' file that carries
11 * miscellaneous persistent state between Tor invocations.
13 * This 'state' file is a typed key-value store that allows multiple
14 * entries for the same key. It follows the same metaformat as described
15 * in confparse.c, and uses the same code to read and write itself.
17 * The state file is most suitable for small values that don't change too
18 * frequently. For values that become very large, we typically use a separate
19 * file -- for example, see how we handle microdescriptors, by storing them in
20 * a separate file with a journal.
22 * The current state is accessed via get_or_state(), which returns a singleton
23 * or_state_t object. Functions that change it should call
24 * or_state_mark_dirty() to ensure that it will get written to disk.
26 * The or_state_save() function additionally calls various functioens
27 * throughout Tor that might want to flush more state to the the disk,
28 * including some in rephist.c, entrynodes.c, circuitstats.c, hibernate.c.
31 #define STATEFILE_PRIVATE
33 #include "circuitstats.h"
35 #include "confparse.h"
36 #include "connection.h"
38 #include "entrynodes.h"
39 #include "hibernate.h"
43 #include "statefile.h"
45 /** A list of state-file "abbreviations," for compatibility. */
46 static config_abbrev_t state_abbrevs_
[] = {
47 { "AccountingBytesReadInterval", "AccountingBytesReadInInterval", 0, 0 },
48 { "HelperNode", "EntryGuard", 0, 0 },
49 { "HelperNodeDownSince", "EntryGuardDownSince", 0, 0 },
50 { "HelperNodeUnlistedSince", "EntryGuardUnlistedSince", 0, 0 },
51 { "EntryNode", "EntryGuard", 0, 0 },
52 { "EntryNodeDownSince", "EntryGuardDownSince", 0, 0 },
53 { "EntryNodeUnlistedSince", "EntryGuardUnlistedSince", 0, 0 },
57 /** dummy instance of or_state_t, used for type-checking its
58 * members with CONF_CHECK_VAR_TYPE. */
59 DUMMY_TYPECHECK_INSTANCE(or_state_t
);
61 /*XXXX these next two are duplicates or near-duplicates from config.c */
62 #define VAR(name,conftype,member,initvalue) \
63 { name, CONFIG_TYPE_ ## conftype, offsetof(or_state_t, member), \
64 initvalue CONF_TEST_MEMBERS(or_state_t, conftype, member) }
65 /** As VAR, but the option name and member name are the same. */
66 #define V(member,conftype,initvalue) \
67 VAR(#member, conftype, member, initvalue)
69 /** Array of "state" variables saved to the ~/.tor/state file. */
70 static config_var_t state_vars_
[] = {
71 /* Remember to document these in state-contents.txt ! */
73 V(AccountingBytesReadInInterval
, MEMUNIT
, NULL
),
74 V(AccountingBytesWrittenInInterval
, MEMUNIT
, NULL
),
75 V(AccountingExpectedUsage
, MEMUNIT
, NULL
),
76 V(AccountingIntervalStart
, ISOTIME
, NULL
),
77 V(AccountingSecondsActive
, INTERVAL
, NULL
),
78 V(AccountingSecondsToReachSoftLimit
,INTERVAL
, NULL
),
79 V(AccountingSoftLimitHitAt
, ISOTIME
, NULL
),
80 V(AccountingBytesAtSoftLimit
, MEMUNIT
, NULL
),
82 VAR("EntryGuard", LINELIST_S
, EntryGuards
, NULL
),
83 VAR("EntryGuardDownSince", LINELIST_S
, EntryGuards
, NULL
),
84 VAR("EntryGuardUnlistedSince", LINELIST_S
, EntryGuards
, NULL
),
85 VAR("EntryGuardAddedBy", LINELIST_S
, EntryGuards
, NULL
),
86 VAR("EntryGuardPathBias", LINELIST_S
, EntryGuards
, NULL
),
87 VAR("EntryGuardPathUseBias", LINELIST_S
, EntryGuards
, NULL
),
88 V(EntryGuards
, LINELIST_V
, NULL
),
90 VAR("TransportProxy", LINELIST_S
, TransportProxies
, NULL
),
91 V(TransportProxies
, LINELIST_V
, NULL
),
93 V(HidServRevCounter
, LINELIST
, NULL
),
95 V(BWHistoryReadEnds
, ISOTIME
, NULL
),
96 V(BWHistoryReadInterval
, UINT
, "900"),
97 V(BWHistoryReadValues
, CSV
, ""),
98 V(BWHistoryReadMaxima
, CSV
, ""),
99 V(BWHistoryWriteEnds
, ISOTIME
, NULL
),
100 V(BWHistoryWriteInterval
, UINT
, "900"),
101 V(BWHistoryWriteValues
, CSV
, ""),
102 V(BWHistoryWriteMaxima
, CSV
, ""),
103 V(BWHistoryDirReadEnds
, ISOTIME
, NULL
),
104 V(BWHistoryDirReadInterval
, UINT
, "900"),
105 V(BWHistoryDirReadValues
, CSV
, ""),
106 V(BWHistoryDirReadMaxima
, CSV
, ""),
107 V(BWHistoryDirWriteEnds
, ISOTIME
, NULL
),
108 V(BWHistoryDirWriteInterval
, UINT
, "900"),
109 V(BWHistoryDirWriteValues
, CSV
, ""),
110 V(BWHistoryDirWriteMaxima
, CSV
, ""),
112 V(Guard
, LINELIST
, NULL
),
114 V(TorVersion
, STRING
, NULL
),
116 V(LastRotatedOnionKey
, ISOTIME
, NULL
),
117 V(LastWritten
, ISOTIME
, NULL
),
119 V(TotalBuildTimes
, UINT
, NULL
),
120 V(CircuitBuildAbandonedCount
, UINT
, "0"),
121 VAR("CircuitBuildTimeBin", LINELIST_S
, BuildtimeHistogram
, NULL
),
122 VAR("BuildtimeHistogram", LINELIST_V
, BuildtimeHistogram
, NULL
),
130 static int or_state_validate(or_state_t
*state
, char **msg
);
132 static int or_state_validate_cb(void *old_options
, void *options
,
133 void *default_options
,
134 int from_setconf
, char **msg
);
136 /** Magic value for or_state_t. */
137 #define OR_STATE_MAGIC 0x57A73f57
139 /** "Extra" variable in the state that receives lines we can't parse. This
140 * lets us preserve options from versions of Tor newer than us. */
141 static config_var_t state_extra_var
= {
142 "__extra", CONFIG_TYPE_LINELIST
, offsetof(or_state_t
, ExtraLines
), NULL
143 CONF_TEST_MEMBERS(or_state_t
, LINELIST
, ExtraLines
)
146 /** Configuration format for or_state_t. */
147 static const config_format_t state_format
= {
150 offsetof(or_state_t
, magic_
),
154 or_state_validate_cb
,
158 /** Persistent serialized state. */
159 static or_state_t
*global_state
= NULL
;
161 /** Return the persistent state struct for this Tor. */
162 MOCK_IMPL(or_state_t
*,
163 get_or_state
, (void))
165 tor_assert(global_state
);
169 /** Return true iff we have loaded the global state for this Tor */
171 or_state_loaded(void)
173 return global_state
!= NULL
;
176 /** Return true if <b>line</b> is a valid state TransportProxy line.
177 * Return false otherwise. */
179 state_transport_line_is_valid(const char *line
)
181 smartlist_t
*items
= NULL
;
187 items
= smartlist_new();
188 smartlist_split_string(items
, line
, NULL
,
189 SPLIT_SKIP_SPACE
|SPLIT_IGNORE_BLANK
, -1);
191 if (smartlist_len(items
) != 2) {
192 log_warn(LD_CONFIG
, "state: Not enough arguments in TransportProxy line.");
196 addrport
= smartlist_get(items
, 1);
197 if (tor_addr_port_lookup(addrport
, &addr
, &port
) < 0) {
198 log_warn(LD_CONFIG
, "state: Could not parse addrport.");
203 log_warn(LD_CONFIG
, "state: Transport line did not contain port.");
214 SMARTLIST_FOREACH(items
, char*, s
, tor_free(s
));
215 smartlist_free(items
);
219 /** Return 0 if all TransportProxy lines in <b>state</b> are well
220 * formed. Otherwise, return -1. */
222 validate_transports_in_state(or_state_t
*state
)
227 for (line
= state
->TransportProxies
; line
; line
= line
->next
) {
228 tor_assert(!strcmp(line
->key
, "TransportProxy"));
229 if (!state_transport_line_is_valid(line
->value
))
234 log_warn(LD_CONFIG
, "state: State file seems to be broken.");
240 or_state_validate_cb(void *old_state
, void *state
, void *default_state
,
241 int from_setconf
, char **msg
)
243 /* We don't use these; only options do. Still, we need to match that
246 (void) default_state
;
249 return or_state_validate(state
, msg
);
252 /** Return 0 if every setting in <b>state</b> is reasonable, and a
253 * permissible transition from <b>old_state</b>. Else warn and return -1.
254 * Should have no side effects, except for normalizing the contents of
258 or_state_validate(or_state_t
*state
, char **msg
)
260 if (entry_guards_parse_state(state
, 0, msg
)<0)
263 if (validate_transports_in_state(state
)<0)
269 /** Replace the current persistent state with <b>new_state</b> */
271 or_state_set(or_state_t
*new_state
)
275 tor_assert(new_state
);
276 config_free(&state_format
, global_state
);
277 global_state
= new_state
;
278 if (entry_guards_parse_state(global_state
, 1, &err
)<0) {
279 log_warn(LD_GENERAL
,"%s",err
);
283 if (rep_hist_load_state(global_state
, &err
)<0) {
284 log_warn(LD_GENERAL
,"Unparseable bandwidth history state: %s",err
);
288 if (circuit_build_times_parse_state(
289 get_circuit_build_times_mutable(),global_state
) < 0) {
296 * Save a broken state file to a backup location.
299 or_state_save_broken(char *fname
)
302 file_status_t status
;
304 for (i
= 0; i
< 100; ++i
) {
305 tor_asprintf(&fname2
, "%s.%d", fname
, i
);
306 status
= file_status(fname2
);
307 if (status
== FN_NOENT
)
312 log_warn(LD_BUG
, "Unable to parse state in \"%s\"; too many saved bad "
313 "state files to move aside. Discarding the old state file.",
318 "Also couldn't discard old state file \"%s\" because "
319 "unlink() failed: %s",
320 fname
, strerror(errno
));
323 log_warn(LD_BUG
, "Unable to parse state in \"%s\". Moving it aside "
324 "to \"%s\". This could be a bug in Tor; please tell "
325 "the developers.", fname
, fname2
);
326 if (tor_rename(fname
, fname2
) < 0) {//XXXX sandbox prohibits
327 log_warn(LD_BUG
, "Weirdly, I couldn't even move the state aside. The "
328 "OS gave an error of %s", strerror(errno
));
337 or_state_t
*new_state
= tor_malloc_zero(sizeof(or_state_t
));
338 new_state
->magic_
= OR_STATE_MAGIC
;
339 config_init(&state_format
, new_state
);
344 /** Reload the persistent state from disk, generating a new state as needed.
345 * Return 0 on success, less than 0 on failure.
350 or_state_t
*new_state
= NULL
;
351 char *contents
= NULL
, *fname
;
353 int r
= -1, badstate
= 0;
355 fname
= get_datadir_fname("state");
356 switch (file_status(fname
)) {
358 if (!(contents
= read_file_to_str(fname
, 0, NULL
))) {
359 log_warn(LD_FS
, "Unable to read state file \"%s\"", fname
);
363 /* treat empty state files as if the file doesn't exist, and generate
364 * a new state file, overwriting the empty file in or_state_save() */
371 log_warn(LD_GENERAL
,"State file \"%s\" is not a file? Failing.", fname
);
374 new_state
= or_state_new();
376 config_line_t
*lines
=NULL
;
378 if (config_get_lines(contents
, &lines
, 0)<0)
380 assign_retval
= config_assign(&state_format
, new_state
,
382 config_free_lines(lines
);
386 log_warn(LD_GENERAL
, "%s", errmsg
);
391 if (!badstate
&& or_state_validate(new_state
, &errmsg
) < 0)
395 log_warn(LD_GENERAL
, "%s", errmsg
);
399 if (badstate
&& !contents
) {
400 log_warn(LD_BUG
, "Uh oh. We couldn't even validate our own default state."
401 " This is a bug in Tor.");
403 } else if (badstate
&& contents
) {
404 or_state_save_broken(fname
);
407 config_free(&state_format
, new_state
);
409 new_state
= or_state_new();
410 } else if (contents
) {
411 log_info(LD_GENERAL
, "Loaded state from \"%s\"", fname
);
412 /* Warn the user if their clock has been set backwards,
413 * they could be tricked into using old consensuses */
414 time_t apparent_skew
= time(NULL
) - new_state
->LastWritten
;
415 if (apparent_skew
< 0) {
416 /* Initialize bootstrap event reporting because we might call
417 * clock_skew_warning() before the bootstrap state is
418 * initialized, causing an assertion failure. */
419 control_event_bootstrap(BOOTSTRAP_STATUS_STARTING
, 0);
420 clock_skew_warning(NULL
, (long)apparent_skew
, 1, LD_GENERAL
,
421 "local state file", fname
);
424 log_info(LD_GENERAL
, "Initialized state");
426 if (or_state_set(new_state
) == -1) {
427 or_state_save_broken(fname
);
431 global_state
->next_write
= 0;
432 or_state_save(time(NULL
));
440 config_free(&state_format
, new_state
);
445 /** Did the last time we tried to write the state file fail? If so, we
446 * should consider disabling such features as preemptive circuit generation
447 * to compute circuit-build-time. */
448 static int last_state_file_write_failed
= 0;
450 /** Return whether the state file failed to write last time we tried. */
452 did_last_state_file_write_fail(void)
454 return last_state_file_write_failed
;
457 /** If writing the state to disk fails, try again after this many seconds. */
458 #define STATE_WRITE_RETRY_INTERVAL 3600
460 /** If we're a relay, how often should we checkpoint our state file even
461 * if nothing else dirties it? This will checkpoint ongoing stats like
462 * bandwidth used, per-country user stats, etc. */
463 #define STATE_RELAY_CHECKPOINT_INTERVAL (12*60*60)
465 /** Write the persistent state to disk. Return 0 for success, <0 on failure. */
467 or_state_save(time_t now
)
469 char *state
, *contents
;
470 char tbuf
[ISO_TIME_LEN
+1];
473 tor_assert(global_state
);
475 if (global_state
->next_write
> now
)
478 /* Call everything else that might dirty the state even more, in order
479 * to avoid redundant writes. */
480 entry_guards_update_state(global_state
);
481 rep_hist_update_state(global_state
);
482 circuit_build_times_update_state(get_circuit_build_times(), global_state
);
483 if (accounting_is_enabled(get_options()))
484 accounting_run_housekeeping(now
);
486 global_state
->LastWritten
= now
;
488 tor_free(global_state
->TorVersion
);
489 tor_asprintf(&global_state
->TorVersion
, "Tor %s", get_version());
491 state
= config_dump(&state_format
, NULL
, global_state
, 1, 0);
492 format_local_iso_time(tbuf
, now
);
493 tor_asprintf(&contents
,
494 "# Tor state file last generated on %s local time\n"
495 "# Other times below are in UTC\n"
496 "# You *do not* need to edit this file.\n\n%s",
499 fname
= get_datadir_fname("state");
500 if (write_str_to_file(fname
, contents
, 0)<0) {
501 log_warn(LD_FS
, "Unable to write state to file \"%s\"; "
502 "will try again later", fname
);
503 last_state_file_write_failed
= 1;
506 /* Try again after STATE_WRITE_RETRY_INTERVAL (or sooner, if the state
507 * changes sooner). */
508 global_state
->next_write
= now
+ STATE_WRITE_RETRY_INTERVAL
;
512 last_state_file_write_failed
= 0;
513 log_info(LD_GENERAL
, "Saved state to \"%s\"", fname
);
517 if (server_mode(get_options()))
518 global_state
->next_write
= now
+ STATE_RELAY_CHECKPOINT_INTERVAL
;
520 global_state
->next_write
= TIME_MAX
;
525 /** Return the config line for transport <b>transport</b> in the current state.
526 * Return NULL if there is no config line for <b>transport</b>. */
527 STATIC config_line_t
*
528 get_transport_in_state_by_name(const char *transport
)
530 or_state_t
*or_state
= get_or_state();
532 config_line_t
*ret
= NULL
;
533 smartlist_t
*items
= NULL
;
535 for (line
= or_state
->TransportProxies
; line
; line
= line
->next
) {
536 tor_assert(!strcmp(line
->key
, "TransportProxy"));
538 items
= smartlist_new();
539 smartlist_split_string(items
, line
->value
, NULL
,
540 SPLIT_SKIP_SPACE
|SPLIT_IGNORE_BLANK
, -1);
541 if (smartlist_len(items
) != 2) /* broken state */
544 if (!strcmp(smartlist_get(items
, 0), transport
)) {
549 SMARTLIST_FOREACH(items
, char*, s
, tor_free(s
));
550 smartlist_free(items
);
556 SMARTLIST_FOREACH(items
, char*, s
, tor_free(s
));
557 smartlist_free(items
);
562 /** Return string containing the address:port part of the
563 * TransportProxy <b>line</b> for transport <b>transport</b>.
564 * If the line is corrupted, return NULL. */
566 get_transport_bindaddr(const char *line
, const char *transport
)
568 char *line_tmp
= NULL
;
570 if (strlen(line
) < strlen(transport
) + 2) {
573 /* line should start with the name of the transport and a space.
574 (for example, "obfs2 127.0.0.1:47245") */
575 tor_asprintf(&line_tmp
, "%s ", transport
);
576 if (strcmpstart(line
, line_tmp
))
580 return (line
+strlen(transport
)+1);
588 /** Return a string containing the address:port that a proxy transport
589 * should bind on. The string is stored on the heap and must be freed
590 * by the caller of this function. */
592 get_stored_bindaddr_for_server_transport(const char *transport
)
594 char *default_addrport
= NULL
;
595 const char *stored_bindaddr
= NULL
;
596 config_line_t
*line
= NULL
;
599 /* See if the user explicitly asked for a specific listening
600 address for this transport. */
601 char *conf_bindaddr
= get_transport_bindaddr_from_config(transport
);
603 return conf_bindaddr
;
606 line
= get_transport_in_state_by_name(transport
);
607 if (!line
) /* Found no references in state for this transport. */
608 goto no_bindaddr_found
;
610 stored_bindaddr
= get_transport_bindaddr(line
->value
, transport
);
611 if (stored_bindaddr
) /* found stored bindaddr in state file. */
612 return tor_strdup(stored_bindaddr
);
615 /** If we didn't find references for this pluggable transport in the
616 state file, we should instruct the pluggable transport proxy to
617 listen on INADDR_ANY on a random ephemeral port. */
618 tor_asprintf(&default_addrport
, "%s:%s", fmt_addr32(INADDR_ANY
), "0");
619 return default_addrport
;
622 /** Save <b>transport</b> listening on <b>addr</b>:<b>port</b> to
625 save_transport_to_state(const char *transport
,
626 const tor_addr_t
*addr
, uint16_t port
)
628 or_state_t
*state
= get_or_state();
630 char *transport_addrport
=NULL
;
632 /** find where to write on the state */
633 config_line_t
**next
, *line
;
635 /* see if this transport is already stored in state */
636 config_line_t
*transport_line
=
637 get_transport_in_state_by_name(transport
);
639 if (transport_line
) { /* if transport already exists in state... */
640 const char *prev_bindaddr
= /* get its addrport... */
641 get_transport_bindaddr(transport_line
->value
, transport
);
642 transport_addrport
= tor_strdup(fmt_addrport(addr
, port
));
644 /* if transport in state has the same address as this one, life is good */
645 if (!strcmp(prev_bindaddr
, transport_addrport
)) {
646 log_info(LD_CONFIG
, "Transport seems to have spawned on its usual "
649 } else { /* if addrport in state is different than the one we got */
650 log_info(LD_CONFIG
, "Transport seems to have spawned on different "
651 "address:port. Let's update the state file with the new "
653 tor_free(transport_line
->value
); /* free the old line */
654 /* replace old addrport line with new line */
655 tor_asprintf(&transport_line
->value
, "%s %s", transport
,
656 fmt_addrport(addr
, port
));
658 } else { /* never seen this one before; save it in state for next time */
659 log_info(LD_CONFIG
, "It's the first time we see this transport. "
660 "Let's save its address:port");
661 next
= &state
->TransportProxies
;
662 /* find the last TransportProxy line in the state and point 'next'
664 line
= state
->TransportProxies
;
666 next
= &(line
->next
);
670 /* allocate space for the new line and fill it in */
671 *next
= line
= tor_malloc_zero(sizeof(config_line_t
));
672 line
->key
= tor_strdup("TransportProxy");
673 tor_asprintf(&line
->value
, "%s %s", transport
, fmt_addrport(addr
, port
));
676 if (!get_options()->AvoidDiskWrites
)
677 or_state_mark_dirty(state
, 0);
680 tor_free(transport_addrport
);
684 or_state_free(or_state_t
*state
)
689 config_free(&state_format
, state
);
693 or_state_free_all(void)
695 or_state_free(global_state
);