Skip to content
Snippets Groups Projects
Commit f5106143 authored by Roger Dingledine's avatar Roger Dingledine
Browse files

when the dns resolve is cancelled, or fails, be sure to remove

conn from circ->resolving_streams

otherwise it gets freed and stays there, causing seg faults.


svn:r1915
parent 3532ba81
No related branches found
No related tags found
No related merge requests found
......@@ -200,7 +200,7 @@ circuit_t *circuit_get_by_circ_id_conn(uint16_t circ_id, connection_t *conn) {
}
/** Return a circ such that circ is attached to <b>conn</b>, either as
* p_conn, n-conn, or in p_streams or n_streams.
* p_conn, n-conn, or in p_streams or n_streams or resolving_streams.
*
* Return NULL if no such circuit exists.
*/
......
......@@ -208,8 +208,10 @@ void connection_about_to_close_connection(connection_t *conn)
}
break;
case CONN_TYPE_EXIT:
if (conn->state == EXIT_CONN_STATE_RESOLVING)
if (conn->state == EXIT_CONN_STATE_RESOLVING) {
circuit_detach_stream(circuit_get_by_conn(conn), conn);
connection_dns_remove(conn);
}
break;
case CONN_TYPE_DNSWORKER:
if (conn->state == DNSWORKER_STATE_BUSY) {
......
......@@ -436,6 +436,7 @@ static void dns_found_answer(char *address, uint32_t addr, char outcome) {
connection_mark_for_close macro */
/* prevent double-remove. */
pendconn->state = EXIT_CONN_STATE_RESOLVEFAILED;
circuit_detach_stream(circuit_get_by_conn(pendconn), pendconn);
connection_edge_end(pendconn, END_STREAM_REASON_MISC, pendconn->cpath_layer);
connection_mark_for_close(pendconn);
connection_free(pendconn);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment