Tighten router_write_fingerprint impl

This commit is contained in:
Nick Mathewson 2014-02-26 10:52:20 -05:00
parent 3ca5fe81e3
commit 25c0435aa5

View file

@ -691,13 +691,14 @@ router_initialize_tls_context(void)
static int static int
router_write_fingerprint(int hashed) router_write_fingerprint(int hashed)
{ {
char *keydir, *cp; char *keydir = NULL, *cp = NULL;
const char *fname = hashed ? "hashed-fingerprint" : const char *fname = hashed ? "hashed-fingerprint" :
"fingerprint"; "fingerprint";
char fingerprint[FINGERPRINT_LEN+1]; char fingerprint[FINGERPRINT_LEN+1];
const or_options_t *options = get_options(); const or_options_t *options = get_options();
/*nickname<space>fp\n\0 */ char *fingerprint_line = NULL;
char fingerprint_line[MAX_NICKNAME_LEN+FINGERPRINT_LEN+3]; int result = -1;
keydir = get_datadir_fname(fname); keydir = get_datadir_fname(fname);
log_info(LD_GENERAL,"Dumping %sfingerprint to \"%s\"...", log_info(LD_GENERAL,"Dumping %sfingerprint to \"%s\"...",
hashed ? "hashed " : "", keydir); hashed ? "hashed " : "", keydir);
@ -705,45 +706,39 @@ router_write_fingerprint(int hashed)
if (crypto_pk_get_fingerprint(get_server_identity_key(), if (crypto_pk_get_fingerprint(get_server_identity_key(),
fingerprint, 0) < 0) { fingerprint, 0) < 0) {
log_err(LD_GENERAL,"Error computing fingerprint"); log_err(LD_GENERAL,"Error computing fingerprint");
tor_free(keydir); goto done;
return -1;
} }
} else { } else {
if (crypto_pk_get_hashed_fingerprint(get_server_identity_key(), if (crypto_pk_get_hashed_fingerprint(get_server_identity_key(),
fingerprint) < 0) { fingerprint) < 0) {
log_err(LD_GENERAL,"Error computing hashed fingerprint"); log_err(LD_GENERAL,"Error computing hashed fingerprint");
tor_free(keydir); goto done;
return -1;
} }
} }
tor_assert(strlen(options->Nickname) <= MAX_NICKNAME_LEN);
if (tor_snprintf(fingerprint_line, sizeof(fingerprint_line), tor_asprintf(&fingerprint_line, "%s %s\n", options->Nickname, fingerprint);
"%s %s\n",options->Nickname, fingerprint) < 0) {
log_err(LD_GENERAL,"Error writing %sfingerprint line",
hashed ? "hashed " : "");
tor_free(keydir);
return -1;
}
/* Check whether we need to write the (hashed-)fingerprint file. */ /* Check whether we need to write the (hashed-)fingerprint file. */
cp = NULL;
if (file_status(keydir) == FN_FILE) cp = read_file_to_str(keydir, RFTS_IGNORE_MISSING, NULL);
cp = read_file_to_str(keydir, 0, NULL);
if (!cp || strcmp(cp, fingerprint_line)) { if (!cp || strcmp(cp, fingerprint_line)) {
if (write_str_to_file(keydir, fingerprint_line, 0)) { if (write_str_to_file(keydir, fingerprint_line, 0)) {
log_err(LD_FS, "Error writing %sfingerprint line to file", log_err(LD_FS, "Error writing %sfingerprint line to file",
hashed ? "hashed " : ""); hashed ? "hashed " : "");
tor_free(keydir); goto done;
tor_free(cp);
return -1;
} }
} }
tor_free(cp);
tor_free(keydir);
log_notice(LD_GENERAL, "Your Tor %s identity key fingerprint is '%s %s'", log_notice(LD_GENERAL, "Your Tor %s identity key fingerprint is '%s %s'",
hashed ? "bridge's hashed" : "server's", options->Nickname, hashed ? "bridge's hashed" : "server's", options->Nickname,
fingerprint); fingerprint);
return 0;
result = 0;
done:
tor_free(cp);
tor_free(keydir);
tor_free(fingerprint_line);
return result;
} }
/** Initialize all OR private keys, and the TLS context, as necessary. /** Initialize all OR private keys, and the TLS context, as necessary.