︙ | | | ︙ | |
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
*
*/
/*
tlsBIO.c tlsIO.c
+------+ +-----+ +------+
| |Tcl_WriteRaw <-- BioWrite| SSL |BIO_write <-- TlsOutputProc <-- Write| |
|socket| <encrypted> | BIO | <unencrypted> | App |
| |Tcl_ReadRaw --> BioRead| |BIO_Read --> TlsInputProc --> Read| |
+------+ +-----+ +------+
*/
#include "tlsInt.h"
#include <errno.h>
|
|
|
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
*
*/
/*
tlsBIO.c tlsIO.c
+------+ +-----+ +------+
| |Tcl_WriteRaw <-- BioWrite| SSL |BIO_write <-- TlsOutputProc <-- Write| |
|socket| <encrypted> | BIO | <unencrypted> | App |
| |Tcl_ReadRaw --> BioRead| |BIO_Read --> TlsInputProc --> Read| |
+------+ +-----+ +------+
*/
#include "tlsInt.h"
#include <errno.h>
|
︙ | | | ︙ | |
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
|
* a POSIX error code if an error occurred, or 0 if none.
*
* Side effects:
* Reads input from the input device of the channel.
*
* Data is received in whole blocks known as records from the peer. A whole
* record is processed (e.g. decrypted) in one go and is buffered by OpenSSL
* until it is read by the application via a call to SSL_read.
*
*-----------------------------------------------------------------------------
*/
static int TlsInputProc(ClientData instanceData, char *buf, int bufSize, int *errorCodePtr) {
unsigned long backingError;
State *statePtr = (State *) instanceData;
int bytesRead, err;
|
|
|
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
|
* a POSIX error code if an error occurred, or 0 if none.
*
* Side effects:
* Reads input from the input device of the channel.
*
* Data is received in whole blocks known as records from the peer. A whole
* record is processed (e.g. decrypted) in one go and is buffered by OpenSSL
* until it is read by the application via a call to SSL_read.
*
*-----------------------------------------------------------------------------
*/
static int TlsInputProc(ClientData instanceData, char *buf, int bufSize, int *errorCodePtr) {
unsigned long backingError;
State *statePtr = (State *) instanceData;
int bytesRead, err;
|
︙ | | | ︙ | |
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
|
dprintf("Read failed with code=%d, bytes read=%d: should retry", err, bytesRead);
/* Some docs imply we should redo the BIO_read now */
} else {
dprintf("Read failed with code=%d, bytes read=%d: error condition", err, bytesRead);
}
dprintf("BIO is EOF %d", BIO_eof(statePtr->bio));
/* These are the same as BIO_retry_type */
if (BIO_should_read(statePtr->bio)) {
dprintf("BIO has insufficient data to read and return");
statePtr->want |= TCL_READABLE;
}
if (BIO_should_write(statePtr->bio)) {
dprintf("BIO has pending data to write");
|
|
|
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
|
dprintf("Read failed with code=%d, bytes read=%d: should retry", err, bytesRead);
/* Some docs imply we should redo the BIO_read now */
} else {
dprintf("Read failed with code=%d, bytes read=%d: error condition", err, bytesRead);
}
dprintf("BIO is EOF %d", BIO_eof(statePtr->bio));
/* These are the same as BIO_retry_type */
if (BIO_should_read(statePtr->bio)) {
dprintf("BIO has insufficient data to read and return");
statePtr->want |= TCL_READABLE;
}
if (BIO_should_write(statePtr->bio)) {
dprintf("BIO has pending data to write");
|
︙ | | | ︙ | |
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
|
/*
*-----------------------------------------------------------------------------
*
* TlsOutputProc --
*
* This procedure is invoked by the generic I/O layer to write data to the
* BIO whenever the the Tcl_Write(), Tcl_WriteChars, and Tcl_WriteObj
* functions are used. Equivalent to SSL_write_ex and SSL_write.
*
* Results:
* Returns the number of bytes written or -1 on error. Sets errorCodePtr
* to a POSIX error code if an error occurred, or 0 if none.
*
* Side effects:
|
|
|
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
|
/*
*-----------------------------------------------------------------------------
*
* TlsOutputProc --
*
* This procedure is invoked by the generic I/O layer to write data to the
* BIO whenever the the Tcl_Write(), Tcl_WriteChars, and Tcl_WriteObj
* functions are used. Equivalent to SSL_write_ex and SSL_write.
*
* Results:
* Returns the number of bytes written or -1 on error. Sets errorCodePtr
* to a POSIX error code if an error occurred, or 0 if none.
*
* Side effects:
|
︙ | | | ︙ | |