︙ | | |
358
359
360
361
362
363
364
365
366
367
368
369
370
371
|
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
|
+
|
*errorCodePtr = EAGAIN;
}
}
#endif
switch (err) {
case SSL_ERROR_NONE:
dprintf("SSL_ERROR_NONE");
dprintBuffer(buf, bytesRead);
break;
case SSL_ERROR_SSL:
/* A non-recoverable, fatal error in the SSL library occurred, usually a protocol error */
dprintf("SSL error, indicating that the connection has been aborted");
if (backingError != 0) {
|
︙ | | |
387
388
389
390
391
392
393
394
395
396
397
398
399
400
|
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
|
+
|
Tls_Error(statePtr, "EOF reached");
}
#endif
break;
case SSL_ERROR_SYSCALL:
/* Some non-recoverable, fatal I/O error occurred */
dprintf("SSL_ERROR_SYSCALL");
if (backingError == 0 && bytesRead == 0) {
/* Unexpected EOF from the peer for OpenSSL 1.1 */
dprintf("(Unexpected) EOF reached")
*errorCodePtr = 0;
bytesRead = 0;
Tls_Error(statePtr, "EOF reached");
|
︙ | | |
524
525
526
527
528
529
530
531
532
533
534
535
536
537
|
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
|
+
|
dprintf("BIO_write(%p, %d) -> [%d]", (void *) statePtr, toWrite, written);
err = SSL_get_error(statePtr->ssl, written);
backingError = ERR_get_error();
switch (err) {
case SSL_ERROR_NONE:
dprintf("SSL_ERROR_NONE");
if (written < 0) {
written = 0;
}
break;
case SSL_ERROR_WANT_WRITE:
dprintf("Got SSL_ERROR_WANT_WRITE, mapping it to EAGAIN");
|
︙ | | |
555
556
557
558
559
560
561
562
563
564
565
566
567
568
|
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
|
+
|
written = 0;
*errorCodePtr = 0;
Tls_Error(statePtr, "Peer has closed the connection for writing by sending the close_notify alert");
break;
case SSL_ERROR_SYSCALL:
/* Some non-recoverable, fatal I/O error occurred */
dprintf("SSL_ERROR_SYSCALL");
if (backingError == 0 && written == 0) {
dprintf("EOF reached")
*errorCodePtr = 0;
written = 0;
Tls_Error(statePtr, "EOF reached");
|
︙ | | |
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
|
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
|
-
+
+
|
TlsSetOptionProc(ClientData instanceData, /* Socket state. */
Tcl_Interp *interp, /* For errors - can be NULL. */
const char *optionName, /* Name of the option to set the value for, or
* NULL to get all options and their values. */
const char *optionValue) /* Value for option. */
{
State *statePtr = (State *) instanceData;
Tcl_Channel downChan = Tls_GetParent(statePtr, TLS_TCL_FASTPATH);
Tcl_DriverSetOptionProc *setOptionProc;
dprintf("Called");
setOptionProc = Tcl_ChannelSetOptionProc(Tcl_GetChannelType(downChan));
if (setOptionProc != NULL) {
return (*setOptionProc)(Tcl_GetChannelInstanceData(downChan), interp, optionName, optionValue);
} else if (optionName == (char*) NULL) {
/*
* Request is query for all options, this is ok.
|
︙ | | |
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
|
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
|
-
+
+
|
TlsGetOptionProc(ClientData instanceData, /* Socket state. */
Tcl_Interp *interp, /* For errors - can be NULL. */
const char *optionName, /* Name of the option to retrieve the value for, or
* NULL to get all options and their values. */
Tcl_DString *optionValue) /* Where to store the computed value initialized by caller. */
{
State *statePtr = (State *) instanceData;
Tcl_Channel downChan = Tls_GetParent(statePtr, TLS_TCL_FASTPATH);
Tcl_DriverGetOptionProc *getOptionProc;
dprintf("Called");
getOptionProc = Tcl_ChannelGetOptionProc(Tcl_GetChannelType(downChan));
if (getOptionProc != NULL) {
return (*getOptionProc)(Tcl_GetChannelInstanceData(downChan), interp, optionName, optionValue);
} else if (optionName == (char*) NULL) {
/*
* Request is query for all options, this is ok.
|
︙ | | |
817
818
819
820
821
822
823
824
825
826
827
828
829
830
|
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
|
+
+
|
*/
static int TlsNotifyProc(ClientData instanceData, /* Socket state. */
int mask) /* type of event that occurred:
* OR-ed combination of TCL_READABLE or TCL_WRITABLE */
{
State *statePtr = (State *) instanceData;
int errorCode;
dprintf("Called");
/*
* An event occurred in the underlying channel. This
* transformation doesn't process such events thus returns the
* incoming mask unchanged.
*/
if (statePtr->timer != (Tcl_TimerToken) NULL) {
|
︙ | | |