Loading ChangeLog +5 −0 Original line number Diff line number Diff line Loading @@ -3,6 +3,11 @@ Changes in version 0.1.2.5-xxxx - 200?-??-?? - Fix a bug when a PF socket is first used. (Patch from Fabian Keil) o Controller bugfixes: - Report the circuit number correctly in STREAM CLOSED events. (Bug reported by Mike Perry) Changes in version 0.1.2.4-alpha - 2006-12-03 o Major features: - Add support for using natd; this allows FreeBSDs earlier than Loading src/or/circuituse.c +0 −44 Original line number Diff line number Diff line Loading @@ -518,50 +518,6 @@ circuit_detach_stream(circuit_t *circ, edge_connection_t *conn) tor_assert(0); /* should never get here */ } /** Notify the global circuit list that <b>conn</b> is about to be * removed and then freed. * * If it's an OR conn, then mark-for-close all the circuits that use * that conn. * * If it's an edge conn, then detach it from its circ, so we don't * try to reference it later. */ void circuit_about_to_close_connection(connection_t *conn) { /* currently, we assume it's too late to flush conn's buf here. * down the road, maybe we'll consider that eof doesn't mean can't-write */ switch (conn->type) { case CONN_TYPE_OR: { if (!connection_state_is_open(conn)) { /* Inform any pending (not attached) circs that they should * give up. */ circuit_n_conn_done(TO_OR_CONN(conn), 0); } /* Now close all the attached circuits on it. */ circuit_unlink_all_from_or_conn(TO_OR_CONN(conn), END_CIRC_REASON_OR_CONN_CLOSED); return; } case CONN_TYPE_AP: case CONN_TYPE_EXIT: { circuit_t *circ; /* It's an edge conn. Need to remove it from the linked list of * conn's for this circuit. Confirm that 'end' relay command has * been sent. But don't kill the circuit. */ circ = circuit_get_by_edge_conn(TO_EDGE_CONN(conn)); if (!circ) return; circuit_detach_stream(circ, TO_EDGE_CONN(conn)); } } /* end switch */ } /** Find each circuit that has been unused for too long, or dirty * for too long and has no streax=ms on it: mark it for close. */ Loading src/or/connection.c +14 −4 Original line number Diff line number Diff line Loading @@ -393,6 +393,7 @@ connection_free_all(void) * - Exit conns need to call connection_dns_remove() if necessary. * - AP and Exit conns need to send an end cell if they can. * - DNS conns need to fail any resolves that are pending on them. * - OR and edge connections need to be unlinked from circuits. */ void connection_about_to_close_connection(connection_t *conn) Loading Loading @@ -436,6 +437,9 @@ connection_about_to_close_connection(connection_t *conn) router_set_status(or_conn->identity_digest, 0); control_event_or_conn_status(or_conn, OR_CONN_EVENT_FAILED); } /* Inform any pending (not attached) circs that they should * give up. */ circuit_n_conn_done(TO_OR_CONN(conn), 0); } else if (conn->hold_open_until_flushed) { /* XXXX009 We used to have an arg that told us whether we closed the * connection on purpose or not. Can we use hold_open_until_flushed Loading @@ -452,6 +456,9 @@ connection_about_to_close_connection(connection_t *conn) rep_hist_note_connection_died(or_conn->identity_digest, now); control_event_or_conn_status(or_conn, OR_CONN_EVENT_CLOSED); } /* Now close all the attached circuits on it. */ circuit_unlink_all_from_or_conn(TO_OR_CONN(conn), END_CIRC_REASON_OR_CONN_CLOSED); break; case CONN_TYPE_AP: edge_conn = TO_EDGE_CONN(conn); Loading @@ -463,20 +470,23 @@ connection_about_to_close_connection(connection_t *conn) conn->marked_for_close_file, conn->marked_for_close); } if (!edge_conn->end_reason) { // XXXX Disable this before 0.1.2.x-final ships. // XXXX012 Disable this before 0.1.2.x-final ships. log_warn(LD_BUG,"Bug: Closing stream (marked at %s:%d) without having" " set end_reason. Please tell Nick.", conn->marked_for_close_file, conn->marked_for_close); } control_event_stream_status(edge_conn, STREAM_EVENT_CLOSED, edge_conn->end_reason); circ = circuit_get_by_edge_conn(edge_conn); if (circ) circuit_detach_stream(circ, edge_conn); break; case CONN_TYPE_EXIT: edge_conn = TO_EDGE_CONN(conn); if (conn->state == EXIT_CONN_STATE_RESOLVING) { circ = circuit_get_by_edge_conn(edge_conn); if (circ) circuit_detach_stream(circ, edge_conn); if (conn->state == EXIT_CONN_STATE_RESOLVING) { connection_dns_remove(edge_conn); } break; Loading src/or/main.c +0 −1 Original line number Diff line number Diff line Loading @@ -208,7 +208,6 @@ connection_remove(connection_t *conn) static void connection_unlink(connection_t *conn, int remove) { circuit_about_to_close_connection(conn); connection_about_to_close_connection(conn); if (remove) { connection_remove(conn); Loading src/or/or.h +2 −2 Original line number Diff line number Diff line Loading @@ -673,7 +673,8 @@ typedef struct connection_t { * conn? */ unsigned edge_has_sent_end:1; /**< For debugging; only used on edge * connections. Set once we've set the stream end, * and check in circuit_about_to_close_connection(). */ * and check in connection_about_to_close_connection(). */ /** Used for OR conns that shouldn't get any new circs attached to them. */ unsigned int or_is_obsolete:1; /** For AP connections only. If 1, and we fail to reach the chosen exit, Loading Loading @@ -1835,7 +1836,6 @@ int circuit_stream_is_being_handled(edge_connection_t *conn, uint16_t port, int min); void circuit_build_needed_circs(time_t now); void circuit_detach_stream(circuit_t *circ, edge_connection_t *conn); void circuit_about_to_close_connection(connection_t *conn); void reset_bandwidth_test(void); int circuit_enough_testing_circs(void); Loading Loading
ChangeLog +5 −0 Original line number Diff line number Diff line Loading @@ -3,6 +3,11 @@ Changes in version 0.1.2.5-xxxx - 200?-??-?? - Fix a bug when a PF socket is first used. (Patch from Fabian Keil) o Controller bugfixes: - Report the circuit number correctly in STREAM CLOSED events. (Bug reported by Mike Perry) Changes in version 0.1.2.4-alpha - 2006-12-03 o Major features: - Add support for using natd; this allows FreeBSDs earlier than Loading
src/or/circuituse.c +0 −44 Original line number Diff line number Diff line Loading @@ -518,50 +518,6 @@ circuit_detach_stream(circuit_t *circ, edge_connection_t *conn) tor_assert(0); /* should never get here */ } /** Notify the global circuit list that <b>conn</b> is about to be * removed and then freed. * * If it's an OR conn, then mark-for-close all the circuits that use * that conn. * * If it's an edge conn, then detach it from its circ, so we don't * try to reference it later. */ void circuit_about_to_close_connection(connection_t *conn) { /* currently, we assume it's too late to flush conn's buf here. * down the road, maybe we'll consider that eof doesn't mean can't-write */ switch (conn->type) { case CONN_TYPE_OR: { if (!connection_state_is_open(conn)) { /* Inform any pending (not attached) circs that they should * give up. */ circuit_n_conn_done(TO_OR_CONN(conn), 0); } /* Now close all the attached circuits on it. */ circuit_unlink_all_from_or_conn(TO_OR_CONN(conn), END_CIRC_REASON_OR_CONN_CLOSED); return; } case CONN_TYPE_AP: case CONN_TYPE_EXIT: { circuit_t *circ; /* It's an edge conn. Need to remove it from the linked list of * conn's for this circuit. Confirm that 'end' relay command has * been sent. But don't kill the circuit. */ circ = circuit_get_by_edge_conn(TO_EDGE_CONN(conn)); if (!circ) return; circuit_detach_stream(circ, TO_EDGE_CONN(conn)); } } /* end switch */ } /** Find each circuit that has been unused for too long, or dirty * for too long and has no streax=ms on it: mark it for close. */ Loading
src/or/connection.c +14 −4 Original line number Diff line number Diff line Loading @@ -393,6 +393,7 @@ connection_free_all(void) * - Exit conns need to call connection_dns_remove() if necessary. * - AP and Exit conns need to send an end cell if they can. * - DNS conns need to fail any resolves that are pending on them. * - OR and edge connections need to be unlinked from circuits. */ void connection_about_to_close_connection(connection_t *conn) Loading Loading @@ -436,6 +437,9 @@ connection_about_to_close_connection(connection_t *conn) router_set_status(or_conn->identity_digest, 0); control_event_or_conn_status(or_conn, OR_CONN_EVENT_FAILED); } /* Inform any pending (not attached) circs that they should * give up. */ circuit_n_conn_done(TO_OR_CONN(conn), 0); } else if (conn->hold_open_until_flushed) { /* XXXX009 We used to have an arg that told us whether we closed the * connection on purpose or not. Can we use hold_open_until_flushed Loading @@ -452,6 +456,9 @@ connection_about_to_close_connection(connection_t *conn) rep_hist_note_connection_died(or_conn->identity_digest, now); control_event_or_conn_status(or_conn, OR_CONN_EVENT_CLOSED); } /* Now close all the attached circuits on it. */ circuit_unlink_all_from_or_conn(TO_OR_CONN(conn), END_CIRC_REASON_OR_CONN_CLOSED); break; case CONN_TYPE_AP: edge_conn = TO_EDGE_CONN(conn); Loading @@ -463,20 +470,23 @@ connection_about_to_close_connection(connection_t *conn) conn->marked_for_close_file, conn->marked_for_close); } if (!edge_conn->end_reason) { // XXXX Disable this before 0.1.2.x-final ships. // XXXX012 Disable this before 0.1.2.x-final ships. log_warn(LD_BUG,"Bug: Closing stream (marked at %s:%d) without having" " set end_reason. Please tell Nick.", conn->marked_for_close_file, conn->marked_for_close); } control_event_stream_status(edge_conn, STREAM_EVENT_CLOSED, edge_conn->end_reason); circ = circuit_get_by_edge_conn(edge_conn); if (circ) circuit_detach_stream(circ, edge_conn); break; case CONN_TYPE_EXIT: edge_conn = TO_EDGE_CONN(conn); if (conn->state == EXIT_CONN_STATE_RESOLVING) { circ = circuit_get_by_edge_conn(edge_conn); if (circ) circuit_detach_stream(circ, edge_conn); if (conn->state == EXIT_CONN_STATE_RESOLVING) { connection_dns_remove(edge_conn); } break; Loading
src/or/main.c +0 −1 Original line number Diff line number Diff line Loading @@ -208,7 +208,6 @@ connection_remove(connection_t *conn) static void connection_unlink(connection_t *conn, int remove) { circuit_about_to_close_connection(conn); connection_about_to_close_connection(conn); if (remove) { connection_remove(conn); Loading
src/or/or.h +2 −2 Original line number Diff line number Diff line Loading @@ -673,7 +673,8 @@ typedef struct connection_t { * conn? */ unsigned edge_has_sent_end:1; /**< For debugging; only used on edge * connections. Set once we've set the stream end, * and check in circuit_about_to_close_connection(). */ * and check in connection_about_to_close_connection(). */ /** Used for OR conns that shouldn't get any new circs attached to them. */ unsigned int or_is_obsolete:1; /** For AP connections only. If 1, and we fail to reach the chosen exit, Loading Loading @@ -1835,7 +1836,6 @@ int circuit_stream_is_being_handled(edge_connection_t *conn, uint16_t port, int min); void circuit_build_needed_circs(time_t now); void circuit_detach_stream(circuit_t *circ, edge_connection_t *conn); void circuit_about_to_close_connection(connection_t *conn); void reset_bandwidth_test(void); int circuit_enough_testing_circs(void); Loading