avoid racing the mark-for-close when the client hangs up on us

at the same time we get an end relay cell.
(thanks to wmf for reminding me)


svn:r2181
This commit is contained in:
Roger Dingledine 2004-08-07 02:19:49 +00:00
parent 658e02a621
commit f47fe829dd
2 changed files with 10 additions and 2 deletions

View file

@ -54,7 +54,11 @@ int connection_edge_process_inbuf(connection_t *conn) {
/* eof reached, kill it. */
log_fn(LOG_INFO,"conn (fd %d) reached eof. Closing.", conn->s);
connection_edge_end(conn, END_STREAM_REASON_DONE, conn->cpath_layer);
connection_mark_for_close(conn);
if(!conn->marked_for_close) {
/* only mark it if not already marked. it's possible to
* get the 'end' right around when the client hangs up on us. */
connection_mark_for_close(conn);
}
conn->hold_open_until_flushed = 1; /* just because we shouldn't read
doesn't mean we shouldn't write */
return 0;

View file

@ -694,7 +694,11 @@ connection_edge_process_relay_cell(cell_t *cell, circuit_t *circ,
#else
/* We just *got* an end; no reason to send one. */
conn->has_sent_end = 1;
connection_mark_for_close(conn);
if(!conn->marked_for_close) {
/* only mark it if not already marked. it's possible to
* get the 'end' right around when the client hangs up on us. */
connection_mark_for_close(conn);
}
conn->hold_open_until_flushed = 1;
#endif
return 0;