Merge remote-tracking branch 'dgoulet/bug23751_032_01' into maint-0.3.2

This commit is contained in:
Nick Mathewson 2017-11-08 10:56:33 -05:00
commit 02f05f2de2
2 changed files with 15 additions and 0 deletions

6
changes/bug23751 Normal file
View File

@ -0,0 +1,6 @@
o Minor bugfixes (scheduler, channel):
- Ignore channels that have been closed while flushing cells. This can
happen if the write on the connection fails leading to the channel being
closed while in the scheduler loop. This is not a complete fix, it is a
bandaid until we are able to refactor those interactions. Fixes bug
23751; bugfix on 0.3.2.1-alpha.

View File

@ -598,6 +598,15 @@ kist_scheduler_run(void)
if (socket_can_write(&socket_table, chan)) {
/* flush to channel queue/outbuf */
flush_result = (int)channel_flush_some_cells(chan, 1); // 1 for num cells
/* XXX: While flushing cells, it is possible that the connection write
* fails leading to the channel to be closed which triggers a release
* and free its entry in the socket table. And because of a engineering
* design issue, the error is not propagated back so we don't get an
* error at this poin. So before we continue, make sure the channel is
* open and if not just ignore it. See #23751. */
if (!CHANNEL_IS_OPEN(chan)) {
continue;
}
/* flush_result has the # cells flushed */
if (flush_result > 0) {
update_socket_written(&socket_table, chan, flush_result *