Make dir servers include a "Date:" http header more often

Directory servers now include a "Date:" http header for response
codes other than 200. Clients starting with a skewed clock and a
recent consensus were getting "304 Not modified" responses from
directory authorities, so without a Date header the client would
never hear about a wrong clock.

Fixes bug 23499; bugfix on 0.0.8rc1.
This commit is contained in:
Roger Dingledine 2017-09-13 23:19:04 -04:00
parent dcd0aea85e
commit eb429232ef
2 changed files with 24 additions and 4 deletions

6
changes/bug23499 Normal file
View File

@ -0,0 +1,6 @@
o Minor bugfixes:
- Directory servers now include a "Date:" http header for response
codes other than 200. Clients starting with a skewed clock and a
recent consensus were getting "304 Not modified" responses from
directory authorities, so without a Date header the client would
never hear about a wrong clock. Fixes bug 23499; bugfix on 0.0.8rc1.

View File

@ -3479,14 +3479,28 @@ static void
write_http_status_line(dir_connection_t *conn, int status,
const char *reason_phrase)
{
char buf[256];
if (!reason_phrase)
char buf[256+RFC1123_TIME_LEN+1];
char *datestring = NULL;
if (!reason_phrase) { /* bullet-proofing */
reason_phrase = "unspecified";
if (tor_snprintf(buf, sizeof(buf), "HTTP/1.0 %d %s\r\n\r\n",
status, reason_phrase) < 0) {
}
if (server_mode(get_options())) {
/* include the Date: header, but only if we're a relay or bridge */
char datebuf[RFC1123_TIME_LEN+1];
format_rfc1123_time(datebuf, time(NULL));
tor_asprintf(&datestring, "Date: %s\r\n", datebuf);
}
if (tor_snprintf(buf, sizeof(buf), "HTTP/1.0 %d %s\r\n%s\r\n",
status, reason_phrase, datestring?datestring:"") < 0) {
log_warn(LD_BUG,"status line too long.");
tor_free(datestring);
return;
}
tor_free(datestring);
log_debug(LD_DIRSERV,"Wrote status 'HTTP/1.0 %d %s'", status, reason_phrase);
connection_buf_add(buf, strlen(buf), TO_CONN(conn));
}