diff options
author | Nick Mathewson <nickm@torproject.org> | 2007-05-31 18:48:28 +0000 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2007-05-31 18:48:28 +0000 |
commit | 77502ac82dd4a2e6adfd954db5ee00042ea7dc0c (patch) | |
tree | 416e475fe1623d55ffa94c2b60726f6feee07259 /src | |
parent | 4061b2cbd1ef476ed0bbf2193a6bb69581a83b4d (diff) | |
download | tor-77502ac82dd4a2e6adfd954db5ee00042ea7dc0c.tar tor-77502ac82dd4a2e6adfd954db5ee00042ea7dc0c.tar.gz |
r13102@catbus: nickm | 2007-05-31 13:56:25 -0400
Make "authdir_newdesc rejected" work again.
svn:r10421
Diffstat (limited to 'src')
-rw-r--r-- | src/or/control.c | 17 | ||||
-rw-r--r-- | src/or/dirserv.c | 28 | ||||
-rw-r--r-- | src/or/or.h | 6 |
3 files changed, 35 insertions, 16 deletions
diff --git a/src/or/control.c b/src/or/control.c index fe1710b44..2683be198 100644 --- a/src/or/control.c +++ b/src/or/control.c @@ -35,7 +35,7 @@ const char control_c_id[] = #define EVENT_WARN_MSG 0x000A #define EVENT_ERR_MSG 0x000B #define EVENT_ADDRMAP 0x000C -#define EVENT_AUTHDIR_NEWDESCS 0x000D +// #define EVENT_AUTHDIR_NEWDESCS 0x000D #define EVENT_DESCCHANGED 0x000E #define EVENT_NS 0x000F #define EVENT_STATUS_CLIENT 0x0010 @@ -248,6 +248,16 @@ control_adjust_event_log_severity(void) control_event_logmsg); } +/** Return true iff the event with code <b>c</b> is being sent to any current + * control connection. This is useful if the amount of work needed to prepare + * to call the appropriate control_event_...() function is high. + */ +int +control_event_is_interesting(int event) +{ + return EVENT_IS_INTERESTING(event); +} + /** Append a NUL-terminated string <b>s</b> to the end of * <b>conn</b>-\>outbuf */ @@ -3032,7 +3042,7 @@ control_event_address_mapped(const char *from, const char *to, time_t expires) * been done with it, and also optionally give an explanation/reason. */ int control_event_or_authdir_new_descriptor(const char *action, - signed_descriptor_t *desc, + const char *desc, size_t desclen, const char *msg) { char firstline[1024]; @@ -3050,8 +3060,7 @@ control_event_or_authdir_new_descriptor(const char *action, msg ? msg : ""); /* Escape the server descriptor properly */ - esclen = write_escaped_data(desc->signed_descriptor_body, - desc->signed_descriptor_len, 1, &esc); + esclen = write_escaped_data(desc, desclen, 1, &esc); totallen = strlen(firstline) + esclen + 1; buf = tor_malloc(totallen); diff --git a/src/or/dirserv.c b/src/or/dirserv.c index 30847eabe..57799487b 100644 --- a/src/or/dirserv.c +++ b/src/or/dirserv.c @@ -581,7 +581,8 @@ dirserv_add_descriptor(routerinfo_t *ri, const char **msg) { int r; routerinfo_t *ri_old; - signed_descriptor_t *desc = &ri->cache_info; + char *desc = NULL; + size_t desclen = 0; /* Check whether this descriptor is semantically identical to the last one * from this server. (We do this here and not in router_add_to_routerlist @@ -596,23 +597,27 @@ dirserv_add_descriptor(routerinfo_t *ri, const char **msg) ri->nickname); *msg = "Not replacing router descriptor; no information has changed since " "the last one with this identity."; - control_event_or_authdir_new_descriptor("DROPPED", desc, *msg); + control_event_or_authdir_new_descriptor("DROPPED", + ri->cache_info.signed_descriptor_body, + ri->cache_info.signed_descriptor_len, *msg); routerinfo_free(ri); return 0; } + if (control_event_is_interesting(EVENT_AUTHDIR_NEWDESCS)) { + /* Make a copy of desc, since router_add_to_routerlist might free + * ri and its associated signed_descriptor_t. */ + desclen = ri->cache_info.signed_descriptor_len; + desc = tor_strndup(ri->cache_info.signed_descriptor_body, desclen); + } + if ((r = router_add_to_routerlist(ri, msg, 0, 0))<0) { -#if 0 - /* XXXX020 reinstate this code, but remember that it can't actually - work, since it is NOT kosher to look at ri or desc after - add_to_routerlist, _unless_ the descriptor is accepted. - */ - if (r < -1) /* unless the routerinfo was fine, just out-of-date */ - control_event_or_authdir_new_descriptor("REJECTED", desc, *msg); -#endif + if (r < -1 && desc) /* unless the routerinfo was fine, just out-of-date */ + control_event_or_authdir_new_descriptor("REJECTED", desc, desclen, *msg); + tor_free(desc); return r == -1 ? 0 : -1; } else { smartlist_t *changed; - control_event_or_authdir_new_descriptor("ACCEPTED", desc, *msg); + control_event_or_authdir_new_descriptor("ACCEPTED", desc, desclen, *msg); changed = smartlist_create(); smartlist_add(changed, ri); @@ -622,6 +627,7 @@ dirserv_add_descriptor(routerinfo_t *ri, const char **msg) *msg = ri->is_valid ? "Descriptor for valid server accepted" : "Descriptor for invalid server accepted"; } + tor_free(desc); return r == 0 ? 2 : 1; } } diff --git a/src/or/or.h b/src/or/or.h index 8d9d52ee7..1000297bc 100644 --- a/src/or/or.h +++ b/src/or/or.h @@ -2525,6 +2525,9 @@ int connection_control_finished_flushing(control_connection_t *conn); int connection_control_reached_eof(control_connection_t *conn); int connection_control_process_inbuf(control_connection_t *conn); +#define EVENT_AUTHDIR_NEWDESCS 0x000D +int control_event_is_interesting(int event); + int control_event_circuit_status(origin_circuit_t *circ, circuit_status_event_t e, int reason); int control_event_stream_status(edge_connection_t *conn, @@ -2540,7 +2543,8 @@ int control_event_descriptors_changed(smartlist_t *routers); int control_event_address_mapped(const char *from, const char *to, time_t expires); int control_event_or_authdir_new_descriptor(const char *action, - signed_descriptor_t *desc, + const char *desc, + size_t desclen, const char *msg); int control_event_my_descriptor_changed(void); int control_event_networkstatus_changed(smartlist_t *statuses); |