Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
| Comment: | More soft-EOF mappings |
|---|---|
| Downloads: | Tarball | ZIP archive | SQL archive |
| Timelines: | family | ancestors | bug-eof-loop-6dd5588df6 |
| Files: | files | file ages | folders |
| SHA1: |
d63ee30cb2a3c25240dc98a847f71cf7 |
| User & Date: | rkeene 2017-09-21 16:07:41 |
Context
|
2017-09-21
| ||
| 16:07 | More soft-EOF mappings Leaf check-in: d63ee30cb2 user: rkeene tags: bug-eof-loop-6dd5588df6 | |
| 14:15 | Added support for detecting writes after we have told the channel that we are in EOF and start returning errors in that case check-in: 7e5e4e2114 user: rkeene tags: bug-eof-loop-6dd5588df6 | |
Changes
Changes to tlsBIO.c.
| ︙ | ︙ | |||
125 126 127 128 129 130 131 |
tclErrno = Tcl_GetErrno();
dprintf("[chan=%p] BioWrite(%d) -> %d [tclEof=%d; tclErrno=%d]", (void *) chan, bufLen, ret, tclEofChan, Tcl_GetErrno());
BIO_clear_flags(bio, BIO_FLAGS_WRITE | BIO_FLAGS_SHOULD_RETRY);
if (tclEofChan && ret <= 0) {
| | | 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 |
tclErrno = Tcl_GetErrno();
dprintf("[chan=%p] BioWrite(%d) -> %d [tclEof=%d; tclErrno=%d]", (void *) chan, bufLen, ret, tclEofChan, Tcl_GetErrno());
BIO_clear_flags(bio, BIO_FLAGS_WRITE | BIO_FLAGS_SHOULD_RETRY);
if (tclEofChan && ret <= 0) {
dprintf("Got EOF while writing, returning a Connection Reset error which maps to Soft EOF");
Tcl_SetErrno(ECONNRESET);
ret = 0;
} else if (ret == 0) {
dprintf("Got 0 from Tcl_WriteRaw, and EOF is not set; ret = 0");
dprintf("Setting retry read flag");
BIO_set_retry_read(bio);
} else if (ret < 0) {
|
| ︙ | ︙ |
Changes to tlsIO.c.
| ︙ | ︙ | |||
385 386 387 388 389 390 391 392 393 394 395 396 397 398 |
dprintf("BIO_read(%d)", bufSize);
if (statePtr->flags & TLS_TCL_CALLBACK) {
/* don't process any bytes while verify callback is running */
dprintf("Callback is running, reading 0 bytes");
return(0);
}
dprintf("Calling Tls_WaitForConnect");
tlsConnect = Tls_WaitForConnect(statePtr, errorCodePtr, 0);
if (tlsConnect < 0) {
dprintf("Got an error waiting to connect (tlsConnect = %i, *errorCodePtr = %i)", tlsConnect, *errorCodePtr);
bytesRead = -1;
| > > > > > > > | 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 |
dprintf("BIO_read(%d)", bufSize);
if (statePtr->flags & TLS_TCL_CALLBACK) {
/* don't process any bytes while verify callback is running */
dprintf("Callback is running, reading 0 bytes");
return(0);
}
if (statePtr->flags & TLS_TCL_EOF) {
dprintf("Asked to read after reaching EOF, we are treating this as fatal.");
bytesRead = 0;
*errorCodePtr = ECONNRESET;
return(bytesRead);
}
dprintf("Calling Tls_WaitForConnect");
tlsConnect = Tls_WaitForConnect(statePtr, errorCodePtr, 0);
if (tlsConnect < 0) {
dprintf("Got an error waiting to connect (tlsConnect = %i, *errorCodePtr = %i)", tlsConnect, *errorCodePtr);
bytesRead = -1;
|
| ︙ | ︙ | |||
474 475 476 477 478 479 480 481 482 483 484 485 486 487 |
break;
default:
dprintf("Unknown error (err = %i), mapping to EOF", err);
*errorCodePtr = 0;
bytesRead = 0;
break;
}
dprintf("Input(%d) -> %d [%d]", bufSize, bytesRead, *errorCodePtr);
return(bytesRead);
}
/*
*-------------------------------------------------------------------
| > > > > > > | 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 |
break;
default:
dprintf("Unknown error (err = %i), mapping to EOF", err);
*errorCodePtr = 0;
bytesRead = 0;
break;
}
if (bufSize != 0 && bytesRead == 0 && *errorCodePtr == 0) {
dprintf("Detected EOF, setting the EOF flag");
statePtr->flags |= TLS_TCL_EOF;
*errorCodePtr = ECONNRESET;
}
dprintf("Input(%d) -> %d [%d]", bufSize, bytesRead, *errorCodePtr);
return(bytesRead);
}
/*
*-------------------------------------------------------------------
|
| ︙ | ︙ | |||
517 518 519 520 521 522 523 |
written = -1;
*errorCodePtr = EAGAIN;
return(-1);
}
if (statePtr->flags & TLS_TCL_EOF) {
dprintf("Asked to write after reaching EOF, we are treating this as fatal.");
| | | | 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 |
written = -1;
*errorCodePtr = EAGAIN;
return(-1);
}
if (statePtr->flags & TLS_TCL_EOF) {
dprintf("Asked to write after reaching EOF, we are treating this as fatal.");
written = 0;
*errorCodePtr = ECONNRESET;
return(written);
}
dprintf("Calling Tls_WaitForConnect");
tlsConnect = Tls_WaitForConnect(statePtr, errorCodePtr, 1);
if (tlsConnect < 0) {
dprintf("Got an error waiting to connect (tlsConnect = %i, *errorCodePtr = %i)", tlsConnect, *errorCodePtr);
written = -1;
if (*errorCodePtr == ECONNRESET) {
dprintf("Got connection reset (setting EOF flag)");
/* Soft EOF */
*errorCodePtr = ECONNRESET;
written = 0;
statePtr->flags |= TLS_TCL_EOF;
}
return(written);
}
|
| ︙ | ︙ | |||
625 626 627 628 629 630 631 632 633 634 635 636 637 638 |
dprintf(" unknown err: %d", err);
break;
}
if (toWrite != 0 && written == 0 && *errorCodePtr == 0) {
dprintf("Detected EOF, setting the EOF flag");
statePtr->flags |= TLS_TCL_EOF;
}
dprintf("Output(%d) -> %d", toWrite, written);
return(written);
}
/*
| > | 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 |
dprintf(" unknown err: %d", err);
break;
}
if (toWrite != 0 && written == 0 && *errorCodePtr == 0) {
dprintf("Detected EOF, setting the EOF flag");
statePtr->flags |= TLS_TCL_EOF;
*errorCodePtr = ECONNRESET;
}
dprintf("Output(%d) -> %d", toWrite, written);
return(written);
}
/*
|
| ︙ | ︙ |