Loading changes/bug16248 0 → 100644 +8 −0 Original line number Diff line number Diff line o Major bugfixes (dns proxy mode, crash): - Avoid crashing when running as a DNS proxy. Closes bug 16248; bugfix on 0.2.0.1-alpha. Patch from 'cypherpunks'. o Minor features (bug-resistance): - Make Tor survive errors involving connections without a corresponding event object. Previously we'd fail with an assertion; now we produce a log message. Related to bug 16248. src/or/main.c +51 −4 Original line number Diff line number Diff line Loading @@ -567,6 +567,45 @@ connection_is_reading(connection_t *conn) (conn->read_event && event_pending(conn->read_event, EV_READ, NULL)); } /** Check whether <b>conn</b> is correct in having (or not having) a * read/write event (passed in <b>ev</b). On success, return 0. On failure, * log a warning and return -1. */ static int connection_check_event(connection_t *conn, struct event *ev) { int bad; if (conn->type == CONN_TYPE_AP && TO_EDGE_CONN(conn)->is_dns_request) { /* DNS requests which we launch through the dnsserv.c module do not have * any underlying socket or any underlying linked connection, so they * shouldn't have any attached events either. */ bad = ev != NULL; } else { /* Everytyhing else should have an underlying socket, or a linked * connection (which is also tracked with a read_event/write_event pair). */ bad = ev == NULL; } if (bad) { log_warn(LD_BUG, "Event missing on connection %p [%s;%s]. " "socket=%d. linked=%d. " "is_dns_request=%d. Marked_for_close=%s:%d", conn, conn_type_to_string(conn->type), conn_state_to_string(conn->type, conn->state), (int)conn->s, (int)conn->linked, (conn->type == CONN_TYPE_AP && TO_EDGE_CONN(conn)->is_dns_request), conn->marked_for_close_file ? conn->marked_for_close_file : "-", conn->marked_for_close ); log_backtrace(LOG_WARN, LD_BUG, "Backtrace attached."); return -1; } return 0; } /** Tell the main loop to stop notifying <b>conn</b> of any read events. */ MOCK_IMPL(void, connection_stop_reading,(connection_t *conn)) Loading @@ -578,7 +617,9 @@ connection_stop_reading,(connection_t *conn)) return; }); tor_assert(conn->read_event); if (connection_check_event(conn, conn->read_event) < 0) { return; } if (conn->linked) { conn->reading_from_linked_conn = 0; Loading @@ -603,7 +644,9 @@ connection_start_reading,(connection_t *conn)) return; }); tor_assert(conn->read_event); if (connection_check_event(conn, conn->read_event) < 0) { return; } if (conn->linked) { conn->reading_from_linked_conn = 1; Loading Loading @@ -643,7 +686,9 @@ connection_stop_writing,(connection_t *conn)) return; }); tor_assert(conn->write_event); if (connection_check_event(conn, conn->write_event) < 0) { return; } if (conn->linked) { conn->writing_to_linked_conn = 0; Loading @@ -669,7 +714,9 @@ connection_start_writing,(connection_t *conn)) return; }); tor_assert(conn->write_event); if (connection_check_event(conn, conn->write_event) < 0) { return; } if (conn->linked) { conn->writing_to_linked_conn = 1; Loading Loading
changes/bug16248 0 → 100644 +8 −0 Original line number Diff line number Diff line o Major bugfixes (dns proxy mode, crash): - Avoid crashing when running as a DNS proxy. Closes bug 16248; bugfix on 0.2.0.1-alpha. Patch from 'cypherpunks'. o Minor features (bug-resistance): - Make Tor survive errors involving connections without a corresponding event object. Previously we'd fail with an assertion; now we produce a log message. Related to bug 16248.
src/or/main.c +51 −4 Original line number Diff line number Diff line Loading @@ -567,6 +567,45 @@ connection_is_reading(connection_t *conn) (conn->read_event && event_pending(conn->read_event, EV_READ, NULL)); } /** Check whether <b>conn</b> is correct in having (or not having) a * read/write event (passed in <b>ev</b). On success, return 0. On failure, * log a warning and return -1. */ static int connection_check_event(connection_t *conn, struct event *ev) { int bad; if (conn->type == CONN_TYPE_AP && TO_EDGE_CONN(conn)->is_dns_request) { /* DNS requests which we launch through the dnsserv.c module do not have * any underlying socket or any underlying linked connection, so they * shouldn't have any attached events either. */ bad = ev != NULL; } else { /* Everytyhing else should have an underlying socket, or a linked * connection (which is also tracked with a read_event/write_event pair). */ bad = ev == NULL; } if (bad) { log_warn(LD_BUG, "Event missing on connection %p [%s;%s]. " "socket=%d. linked=%d. " "is_dns_request=%d. Marked_for_close=%s:%d", conn, conn_type_to_string(conn->type), conn_state_to_string(conn->type, conn->state), (int)conn->s, (int)conn->linked, (conn->type == CONN_TYPE_AP && TO_EDGE_CONN(conn)->is_dns_request), conn->marked_for_close_file ? conn->marked_for_close_file : "-", conn->marked_for_close ); log_backtrace(LOG_WARN, LD_BUG, "Backtrace attached."); return -1; } return 0; } /** Tell the main loop to stop notifying <b>conn</b> of any read events. */ MOCK_IMPL(void, connection_stop_reading,(connection_t *conn)) Loading @@ -578,7 +617,9 @@ connection_stop_reading,(connection_t *conn)) return; }); tor_assert(conn->read_event); if (connection_check_event(conn, conn->read_event) < 0) { return; } if (conn->linked) { conn->reading_from_linked_conn = 0; Loading @@ -603,7 +644,9 @@ connection_start_reading,(connection_t *conn)) return; }); tor_assert(conn->read_event); if (connection_check_event(conn, conn->read_event) < 0) { return; } if (conn->linked) { conn->reading_from_linked_conn = 1; Loading Loading @@ -643,7 +686,9 @@ connection_stop_writing,(connection_t *conn)) return; }); tor_assert(conn->write_event); if (connection_check_event(conn, conn->write_event) < 0) { return; } if (conn->linked) { conn->writing_to_linked_conn = 0; Loading @@ -669,7 +714,9 @@ connection_start_writing,(connection_t *conn)) return; }); tor_assert(conn->write_event); if (connection_check_event(conn, conn->write_event) < 0) { return; } if (conn->linked) { conn->writing_to_linked_conn = 1; Loading