Commit 026c11c4 authored by Nick Mathewson's avatar Nick Mathewson 🤹
Browse files

r11672@catbus: nickm | 2007-02-06 14:16:56 -0500

 Fix third case of bug 367: make circuit get sent along with END_STREAM_REASON_DESTROY stream CLOSED events.


svn:r9510
parent e7f558bd
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
Changes in version 0.1.2.8-alpha - 2007-??-??
  o Minor bugfixes (controller):
    - Give the controller END_STREAM_REASON_DESTROY events _before_ we
      clear the corresponding on_circuit variable, and remember later that
      we don't need to send a redundant CLOSED event.  (Resolves part 3 of
      bug 367.)


Changes in version 0.1.2.7-alpha - 2007-02-06
  o Major bugfixes (rate limiting):
    - Servers decline directory requests much more aggressively when
+3 −0
Original line number Diff line number Diff line
@@ -953,6 +953,9 @@ _circuit_mark_for_close(circuit_t *circ, int reason, int line,
         * to send an end cell. */
        conn->_base.edge_has_sent_end = 1;
        conn->end_reason = END_STREAM_REASON_DESTROY;
        conn->end_reason |= END_STREAM_REASON_FLAG_ALREADY_SENT_CLOSED;
        control_event_stream_status(conn, STREAM_EVENT_CLOSED,
                                    END_STREAM_REASON_DESTROY);
        connection_mark_for_close(TO_CONN(conn));
      }
      conn->on_circuit = NULL;
+3 −0
Original line number Diff line number Diff line
@@ -158,6 +158,9 @@ connection_edge_destroy(uint16_t circ_id, edge_connection_t *conn)
      /* closing the circuit, nothing to send an END to */
      conn->_base.edge_has_sent_end = 1;
      conn->end_reason = END_STREAM_REASON_DESTROY;
      conn->end_reason |= END_STREAM_REASON_FLAG_ALREADY_SENT_CLOSED;
      control_event_stream_status(conn, STREAM_EVENT_CLOSED,
                                  END_STREAM_REASON_DESTROY);
      connection_mark_for_close(TO_CONN(conn));
      conn->_base.hold_open_until_flushed = 1;
    }
+5 −1
Original line number Diff line number Diff line
@@ -3140,7 +3140,7 @@ write_stream_target_to_buf(edge_connection_t *conn, char *buf, size_t len)
static const char *
stream_end_reason_to_string(int reason)
{
  reason &= ~END_CIRC_REASON_FLAG_REMOTE;
  reason &= END_STREAM_REASON_MASK;
  switch (reason) {
    case END_STREAM_REASON_MISC: return "MISC";
    case END_STREAM_REASON_RESOLVEFAILED: return "RESOLVEFAILED";
@@ -3179,6 +3179,10 @@ control_event_stream_status(edge_connection_t *conn, stream_status_event_t tp,
  if (!EVENT_IS_INTERESTING(EVENT_STREAM_STATUS))
    return 0;

  if (tp == STREAM_EVENT_CLOSED &&
      (reason_code & END_STREAM_REASON_FLAG_ALREADY_SENT_CLOSED))
    return 0;

  write_stream_target_to_buf(conn, buf, sizeof(buf));
  if (EVENT_IS_INTERESTING0(EVENT_STREAM_STATUS)) {
    len = strlen(buf);
+7 −1
Original line number Diff line number Diff line
@@ -531,9 +531,15 @@ typedef enum {
/** DOCDOC */
#define END_STREAM_REASON_INVALID_NATD_DEST 261

/** Bitwise-and this value with endreason to mask out all flags. */
#define END_STREAM_REASON_MASK 511

/** Bitwise-or this with the argument to control_event_stream_status
 * to indicate that the reason came from an END cell. */
#define END_STREAM_REASON_FLAG_REMOTE 512
/** Bitwise-or this with the argument to control_event_stream_status
 * to indicate that we already sent a CLOSED stream event. */
#define END_STREAM_REASON_FLAG_ALREADY_SENT_CLOSED 1024

/* DOCDOC */
#define RESOLVED_TYPE_HOSTNAME 0