0000: 2f 2a 0a 20 2a 20 50 72 6f 76 69 64 65 73 20 49 /*. * Provides I
0010: 4f 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 69 O functions to i
0020: 6e 74 65 72 66 61 63 65 20 62 65 74 77 65 65 6e nterface between
0030: 20 74 68 65 20 42 49 4f 20 62 75 66 66 65 72 73 the BIO buffers
0040: 20 61 6e 64 20 54 43 4c 0a 20 2a 20 61 70 70 6c and TCL. * appl
0050: 69 63 61 74 69 6f 6e 73 20 77 68 65 6e 20 75 73 ications when us
0060: 69 6e 67 20 73 74 61 63 6b 65 64 20 63 68 61 6e ing stacked chan
0070: 6e 65 6c 73 2e 0a 20 2a 0a 20 2a 20 43 6f 70 79 nels.. *. * Copy
0080: 72 69 67 68 74 20 28 43 29 20 31 39 39 37 2d 32 right (C) 1997-2
0090: 30 30 30 20 4d 61 74 74 20 4e 65 77 6d 61 6e 20 000 Matt Newman
00a0: 3c 6d 61 74 74 40 6e 6f 76 61 64 69 67 6d 2e 63 <matt@novadigm.c
00b0: 6f 6d 3e 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 om>. * Copyright
00c0: 20 28 43 29 20 32 30 30 30 20 41 6a 75 62 61 20 (C) 2000 Ajuba
00d0: 53 6f 6c 75 74 69 6f 6e 73 0a 20 2a 20 43 6f 70 Solutions. * Cop
00e0: 79 72 69 67 68 74 20 28 43 29 20 32 30 32 34 20 yright (C) 2024
00f0: 42 72 69 61 6e 20 4f 27 48 61 67 61 6e 0a 20 2a Brian O'Hagan. *
0100: 0a 20 2a 20 41 64 64 69 74 69 6f 6e 61 6c 20 63 . * Additional c
0110: 72 65 64 69 74 20 69 73 20 64 75 65 20 66 6f 72 redit is due for
0120: 20 41 6e 64 72 65 61 73 20 4b 75 70 72 69 65 73 Andreas Kupries
0130: 20 28 61 2e 6b 75 70 72 69 65 73 40 77 65 73 74 (a.kupries@west
0140: 65 6e 64 2e 63 6f 6d 29 2c 20 66 6f 72 0a 20 2a end.com), for. *
0150: 20 70 72 6f 76 69 64 69 6e 67 20 74 68 65 20 54 providing the T
0160: 63 6c 5f 52 65 70 6c 61 63 65 43 68 61 6e 6e 65 cl_ReplaceChanne
0170: 6c 20 6d 65 63 68 61 6e 69 73 6d 20 61 6e 64 20 l mechanism and
0180: 77 6f 72 6b 69 6e 67 20 63 6c 6f 73 65 6c 79 20 working closely
0190: 77 69 74 68 20 6d 65 0a 20 2a 20 74 6f 20 65 6e with me. * to en
01a0: 68 61 6e 63 65 20 69 74 20 74 6f 20 73 75 70 70 hance it to supp
01b0: 6f 72 74 20 66 75 6c 6c 20 66 69 6c 65 65 76 65 ort full fileeve
01c0: 6e 74 20 73 65 6d 61 6e 74 69 63 73 2e 0a 20 2a nt semantics.. *
01d0: 0a 20 2a 20 41 6c 73 6f 20 77 6f 72 6b 20 64 6f . * Also work do
01e0: 6e 65 20 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77 ne by the follow
01f0: 20 70 65 6f 70 6c 65 20 70 72 6f 76 69 64 65 64 people provided
0200: 20 74 68 65 20 69 6d 70 65 74 75 73 20 74 6f 20 the impetus to
0210: 64 6f 20 74 68 69 73 20 22 72 69 67 68 74 22 3a do this "right":
0220: 0a 20 2a 09 74 63 6c 53 53 4c 20 28 43 6f 6c 69 . *.tclSSL (Coli
0230: 6e 20 4d 63 43 6f 72 6d 61 63 6b 2c 20 53 68 61 n McCormack, Sha
0240: 72 65 64 20 54 65 63 68 6e 6f 6c 6f 67 79 29 0a red Technology).
0250: 20 2a 09 53 53 4c 74 63 6c 20 28 50 65 74 65 72 *.SSLtcl (Peter
0260: 20 41 6e 74 6d 61 6e 29 0a 20 2a 0a 20 2a 2f 0a Antman). *. */.
0270: 0a 2f 2a 0a 4e 6f 72 6d 61 6c 0a 09 09 74 6c 73 ./*.Normal...tls
0280: 42 49 4f 2e 63 09 09 09 09 74 6c 73 49 4f 2e 63 BIO.c....tlsIO.c
0290: 0a 20 2b 2d 2d 2d 2d 2d 2d 2b 20 20 20 20 20 20 . +------+
02a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
02b0: 20 20 2b 2d 2d 2d 2d 2d 2b 20 20 20 20 20 20 20 +-----+
02c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
02d0: 20 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d 2b 0a +---+.
02e0: 20 7c 20 20 20 20 20 20 7c 54 63 6c 5f 57 72 69 | |Tcl_Wri
02f0: 74 65 52 61 77 3c 2d 2d 42 69 6f 4f 75 74 70 75 teRaw<--BioOutpu
0300: 74 7c 20 53 53 4c 20 7c 42 49 4f 5f 77 72 69 74 t| SSL |BIO_writ
0310: 65 3c 2d 2d 54 6c 73 4f 75 74 70 75 74 50 72 6f e<--TlsOutputPro
0320: 63 3c 2d 2d 57 72 69 74 65 7c 20 20 20 7c 0a 20 c<--Write| |.
0330: 7c 73 6f 63 6b 65 74 7c 20 20 20 20 20 20 3c 65 |socket| <e
0340: 6e 63 72 79 70 74 65 64 3e 20 20 20 20 20 20 20 ncrypted>
0350: 7c 20 42 49 4f 20 7c 20 20 20 20 20 20 20 20 20 | BIO |
0360: 20 20 20 3c 75 6e 65 6e 63 72 79 70 74 65 64 3e <unencrypted>
0370: 20 20 20 20 20 20 20 20 7c 41 70 70 7c 0a 20 7c |App|. |
0380: 20 20 20 20 20 20 7c 54 63 6c 5f 52 65 61 64 52 |Tcl_ReadR
0390: 61 77 20 2d 2d 3e 20 42 69 6f 49 6e 70 75 74 7c aw --> BioInput|
03a0: 20 20 20 20 20 7c 42 49 4f 5f 52 65 61 64 20 2d |BIO_Read -
03b0: 2d 3e 54 6c 73 49 6e 70 75 74 50 72 6f 63 20 2d ->TlsInputProc -
03c0: 2d 3e 20 52 65 61 64 7c 20 20 20 7c 0a 20 2b 2d -> Read| |. +-
03d0: 2d 2d 2d 2d 2d 2b 20 20 20 20 20 20 20 20 20 20 -----+
03e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 2d +-
03f0: 2d 2d 2d 2d 2b 20 20 20 20 20 20 20 20 20 20 20 ----+
0400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0410: 20 20 20 20 20 20 2b 2d 2d 2d 2b 0a 0a 0a 46 61 +---+...Fa
0420: 73 74 20 50 61 74 68 0a 09 09 09 09 09 74 6c 73 st Path......tls
0430: 49 4f 2e 63 0a 20 20 2b 2d 2d 2d 2d 2d 2d 2b 20 IO.c. +------+
0440: 20 20 20 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d +---
0450: 2d 2d 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 --+
0460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0470: 20 20 20 20 20 20 20 20 2b 2d 2d 2d 2d 2d 2b 0a +-----+.
0480: 20 20 7c 20 20 20 20 20 20 7c 3c 2d 2d 20 77 72 | |<-- wr
0490: 69 74 65 20 3c 2d 2d 7c 20 53 53 4c 20 7c 42 49 ite <--| SSL |BI
04a0: 4f 5f 77 72 69 74 65 20 3c 2d 2d 20 54 6c 73 4f O_write <-- TlsO
04b0: 75 74 70 75 74 50 72 6f 63 20 3c 2d 2d 20 57 72 utputProc <-- Wr
04c0: 69 74 65 7c 20 20 20 20 20 7c 0a 20 20 7c 73 6f ite| |. |so
04d0: 63 6b 65 74 7c 20 3c 65 6e 63 72 79 70 74 65 64 cket| <encrypted
04e0: 3e 20 7c 20 42 49 4f 20 7c 20 20 20 20 20 20 20 > | BIO |
04f0: 20 20 20 20 20 3c 75 6e 65 6e 63 72 79 70 74 65 <unencrypte
0500: 64 3e 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 d> |
0510: 41 70 70 20 7c 0a 20 20 7c 20 20 20 20 20 20 7c App |. | |
0520: 3c 2d 2d 20 20 72 65 61 64 20 3c 2d 2d 7c 20 20 <-- read <--|
0530: 20 20 20 7c 42 49 4f 5f 52 65 61 64 20 20 2d 2d |BIO_Read --
0540: 3e 20 54 6c 73 49 6e 70 75 74 50 72 6f 63 20 20 > TlsInputProc
0550: 2d 2d 3e 20 20 52 65 61 64 7c 20 20 20 20 20 7c --> Read| |
0560: 0a 20 20 2b 2d 2d 2d 2d 2d 2d 2b 20 20 20 20 20 . +------+
0570: 20 20 20 20 20 20 20 20 2b 2d 2d 2d 2d 2d 2b 20 +-----+
0580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
05a0: 20 20 20 20 2b 2d 2d 2d 2d 2d 2b 0a 2a 2f 0a 0a +-----+.*/..
05b0: 23 69 6e 63 6c 75 64 65 20 22 74 6c 73 49 6e 74 #include "tlsInt
05c0: 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 65 72 .h".#include <er
05d0: 72 6e 6f 2e 68 3e 0a 0a 2f 2a 0a 20 2a 2d 2d 2d rno.h>../*. *---
05e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
05f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
0630: 20 54 6c 73 42 6c 6f 63 6b 4d 6f 64 65 50 72 6f TlsBlockModePro
0640: 63 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 c --. *. *.This
0650: 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 procedure is inv
0660: 6f 6b 65 64 20 62 79 20 74 68 65 20 67 65 6e 65 oked by the gene
0670: 72 69 63 20 49 4f 20 6c 65 76 65 6c 20 74 6f 20 ric IO level to
0680: 73 65 74 20 63 68 61 6e 6e 65 6c 20 74 6f 0a 20 set channel to.
0690: 2a 09 62 6c 6f 63 6b 69 6e 67 20 6f 72 20 6e 6f *.blocking or no
06a0: 6e 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e 20 nblocking mode.
06b0: 43 61 6c 6c 65 64 20 62 79 20 74 68 65 20 67 65 Called by the ge
06c0: 6e 65 72 69 63 20 49 2f 4f 20 6c 61 79 65 72 20 neric I/O layer
06d0: 77 68 65 6e 65 76 65 72 0a 20 2a 09 74 68 65 20 whenever. *.the
06e0: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 Tcl_SetChannelOp
06f0: 74 69 6f 6e 28 29 20 66 75 6e 63 74 69 6f 6e 20 tion() function
0700: 69 73 20 75 73 65 64 20 77 69 74 68 20 6f 70 74 is used with opt
0710: 69 6f 6e 20 2d 62 6c 6f 63 6b 69 6e 67 2e 0a 20 ion -blocking..
0720: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
0730: 09 30 20 69 66 20 73 75 63 63 65 73 73 66 75 6c .0 if successful
0740: 20 6f 72 20 50 4f 53 49 58 20 65 72 72 6f 72 20 or POSIX error
0750: 63 6f 64 65 20 69 66 20 66 61 69 6c 65 64 2e 0a code if failed..
0760: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
0770: 74 73 3a 0a 20 2a 09 53 65 74 73 20 74 68 65 20 ts:. *.Sets the
0780: 64 65 76 69 63 65 20 69 6e 74 6f 20 62 6c 6f 63 device into bloc
0790: 6b 69 6e 67 20 6f 72 20 6e 6f 6e 62 6c 6f 63 6b king or nonblock
07a0: 69 6e 67 20 6d 6f 64 65 2e 0a 20 2a 0a 20 2a 2d ing mode.. *. *-
07b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
07c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
07d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
07e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
07f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
0800: 0a 73 74 61 74 69 63 20 69 6e 74 20 54 6c 73 42 .static int TlsB
0810: 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 28 0a 20 20 lockModeProc(.
0820: 20 20 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 ClientData ins
0830: 74 61 6e 63 65 44 61 74 61 2c 09 2f 2a 20 43 6f tanceData,./* Co
0840: 6e 6e 65 63 74 69 6f 6e 20 73 74 61 74 65 20 69 nnection state i
0850: 6e 66 6f 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d nfo */. int m
0860: 6f 64 65 29 09 09 09 2f 2a 20 42 6c 6f 63 6b 69 ode).../* Blocki
0870: 6e 67 20 6f 72 20 6e 6f 6e 2d 62 6c 6f 63 6b 69 ng or non-blocki
0880: 6e 67 20 6d 6f 64 65 20 2a 2f 0a 7b 0a 20 20 20 ng mode */.{.
0890: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 State *statePtr
08a0: 20 3d 20 28 53 74 61 74 65 20 2a 29 20 69 6e 73 = (State *) ins
08b0: 74 61 6e 63 65 44 61 74 61 3b 0a 0a 20 20 20 20 tanceData;..
08c0: 69 66 20 28 6d 6f 64 65 20 3d 3d 20 54 43 4c 5f if (mode == TCL_
08d0: 4d 4f 44 45 5f 4e 4f 4e 42 4c 4f 43 4b 49 4e 47 MODE_NONBLOCKING
08e0: 29 20 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 ) {..statePtr->f
08f0: 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f lags |= TLS_TCL_
0900: 41 53 59 4e 43 3b 0a 20 20 20 20 7d 20 65 6c 73 ASYNC;. } els
0910: 65 20 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 e {..statePtr->f
0920: 6c 61 67 73 20 26 3d 20 7e 28 54 4c 53 5f 54 43 lags &= ~(TLS_TC
0930: 4c 5f 41 53 59 4e 43 29 3b 0a 20 20 20 20 7d 0a L_ASYNC);. }.
0940: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a return 0;.}.
0950: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
0960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
09a0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 43 6c 6f ---. *. * TlsClo
09b0: 73 65 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 seProc --. *. *.
09c0: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 This procedure i
09d0: 73 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 s invoked by the
09e0: 20 67 65 6e 65 72 69 63 20 49 4f 20 6c 65 76 65 generic IO leve
09f0: 6c 20 74 6f 20 70 65 72 66 6f 72 6d 20 63 68 61 l to perform cha
0a00: 6e 6e 65 6c 0a 20 2a 09 74 79 70 65 20 73 70 65 nnel. *.type spe
0a10: 63 69 66 69 63 20 63 6c 65 61 6e 75 70 20 77 68 cific cleanup wh
0a20: 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 en a SSL socket
0a30: 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 20 69 73 based channel is
0a40: 20 63 6c 6f 73 65 64 2e 20 43 61 6c 6c 65 64 0a closed. Called.
0a50: 20 2a 09 62 79 20 74 68 65 20 67 65 6e 65 72 69 *.by the generi
0a60: 63 20 49 2f 4f 20 6c 61 79 65 72 20 77 68 65 6e c I/O layer when
0a70: 65 76 65 72 20 74 68 65 20 54 63 6c 5f 43 6c 6f ever the Tcl_Clo
0a80: 73 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 se() function is
0a90: 20 75 73 65 64 2e 0a 20 2a 0a 20 2a 20 52 65 73 used.. *. * Res
0aa0: 75 6c 74 73 3a 0a 20 2a 09 30 20 69 66 20 73 75 ults:. *.0 if su
0ab0: 63 63 65 73 73 66 75 6c 20 6f 72 20 50 4f 53 49 ccessful or POSI
0ac0: 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 X error code if
0ad0: 66 61 69 6c 65 64 2e 0a 20 2a 0a 20 2a 20 53 69 failed.. *. * Si
0ae0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 de effects:. *.C
0af0: 6c 6f 73 65 73 20 74 68 65 20 73 6f 63 6b 65 74 loses the socket
0b00: 20 6f 66 20 74 68 65 20 63 68 61 6e 6e 65 6c 2e of the channel.
0b10: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
0b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0b60: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 ---. */.static i
0b70: 6e 74 20 54 6c 73 43 6c 6f 73 65 50 72 6f 63 28 nt TlsCloseProc(
0b80: 0a 20 20 20 20 43 6c 69 65 6e 74 44 61 74 61 20 . ClientData
0b90: 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 09 2f 2a instanceData,./*
0ba0: 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 61 74 Connection stat
0bb0: 65 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 54 63 e info */. Tc
0bc0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
0bd0: 29 09 09 2f 2a 20 54 63 6c 20 69 6e 74 65 72 70 )../* Tcl interp
0be0: 72 65 74 65 72 20 74 6f 20 72 65 70 6f 72 74 20 reter to report
0bf0: 65 72 72 6f 72 73 20 74 6f 20 2a 2f 0a 7b 0a 20 errors to */.{.
0c00: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 State *stateP
0c10: 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 20 69 tr = (State *) i
0c20: 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 0a 20 20 nstanceData;..
0c30: 20 20 64 70 72 69 6e 74 66 28 22 54 6c 73 43 6c dprintf("TlsCl
0c40: 6f 73 65 50 72 6f 63 28 25 70 29 22 2c 20 28 76 oseProc(%p)", (v
0c50: 6f 69 64 20 2a 29 20 73 74 61 74 65 50 74 72 29 oid *) statePtr)
0c60: 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 6e 64 20 73 ;.. /* Send s
0c70: 68 75 74 64 6f 77 6e 20 6e 6f 74 69 66 69 63 61 hutdown notifica
0c80: 74 69 6f 6e 2e 20 57 69 6c 6c 20 72 65 74 75 72 tion. Will retur
0c90: 6e 20 30 20 77 68 69 6c 65 20 69 6e 20 70 72 6f n 0 while in pro
0ca0: 63 65 73 73 2c 20 74 68 65 6e 20 31 20 77 68 65 cess, then 1 whe
0cb0: 6e 0a 20 20 20 20 20 20 20 63 6f 6d 70 6c 65 74 n. complet
0cc0: 65 2e 20 4f 6e 6c 79 20 63 6c 6f 73 65 73 20 74 e. Only closes t
0cd0: 68 65 20 77 72 69 74 65 20 64 69 72 65 63 74 69 he write directi
0ce0: 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 on of the connec
0cf0: 74 69 6f 6e 3b 20 74 68 65 20 72 65 61 64 0a 20 tion; the read.
0d00: 20 20 20 20 20 20 64 69 72 65 63 74 69 6f 6e 20 direction
0d10: 69 73 20 63 6c 6f 73 65 64 20 62 79 20 74 68 65 is closed by the
0d20: 20 70 65 65 72 2e 20 44 6f 65 73 20 6e 6f 74 20 peer. Does not
0d30: 61 66 66 65 63 74 20 73 6f 63 6b 65 74 20 73 74 affect socket st
0d40: 61 74 65 2e 20 44 6f 6e 27 74 0a 20 20 20 20 20 ate. Don't.
0d50: 20 20 63 61 6c 6c 20 61 66 74 65 72 20 66 61 74 call after fat
0d60: 61 6c 20 65 72 72 6f 72 2e 20 2a 2f 0a 20 20 20 al error. */.
0d70: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73 if (statePtr->s
0d80: 73 6c 20 21 3d 20 4e 55 4c 4c 20 26 26 20 21 28 sl != NULL && !(
0d90: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 statePtr->flags
0da0: 26 20 54 4c 53 5f 54 43 4c 5f 48 41 4e 44 53 48 & TLS_TCL_HANDSH
0db0: 41 4b 45 5f 46 41 49 4c 45 44 29 29 20 7b 0a 09 AKE_FAILED)) {..
0dc0: 42 49 4f 5f 66 6c 75 73 68 28 73 74 61 74 65 50 BIO_flush(stateP
0dd0: 74 72 2d 3e 62 69 6f 29 3b 0a 09 53 53 4c 5f 73 tr->bio);..SSL_s
0de0: 68 75 74 64 6f 77 6e 28 73 74 61 74 65 50 74 72 hutdown(statePtr
0df0: 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 ->ssl);. }..
0e00: 20 20 20 2f 2a 20 54 6c 73 5f 46 72 65 65 20 63 /* Tls_Free c
0e10: 61 6c 6c 73 20 54 6c 73 5f 43 6c 65 61 6e 20 2a alls Tls_Clean *
0e20: 2f 0a 20 20 20 20 54 63 6c 5f 45 76 65 6e 74 75 /. Tcl_Eventu
0e30: 61 6c 6c 79 46 72 65 65 28 28 43 6c 69 65 6e 74 allyFree((Client
0e40: 44 61 74 61 29 73 74 61 74 65 50 74 72 2c 20 54 Data)statePtr, T
0e50: 6c 73 5f 46 72 65 65 29 3b 0a 20 20 20 20 72 65 ls_Free);. re
0e60: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 20 2a turn 0;.}../*. *
0e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
0ec0: 0a 20 2a 20 54 6c 73 43 6c 6f 73 65 32 50 72 6f . * TlsClose2Pro
0ed0: 63 20 2d 2d 0a 20 2a 0a 20 2a 09 53 69 6d 69 6c c --. *. *.Simil
0ee0: 61 72 20 74 6f 20 54 6c 73 43 6c 6f 73 65 50 72 ar to TlsClosePr
0ef0: 6f 63 2c 20 62 75 74 20 61 6c 6c 6f 77 73 20 66 oc, but allows f
0f00: 6f 72 20 73 65 70 61 72 61 74 65 20 63 6c 6f 73 or separate clos
0f10: 65 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 65 e read and write
0f20: 0a 20 2a 09 73 69 64 65 20 6f 66 20 63 68 61 6e . *.side of chan
0f30: 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d nel.. *. *------
0f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0f80: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
0f90: 69 63 20 69 6e 74 20 54 6c 73 43 6c 6f 73 65 32 ic int TlsClose2
0fa0: 50 72 6f 63 28 0a 20 20 20 20 43 6c 69 65 6e 74 Proc(. Client
0fb0: 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 Data instanceDat
0fc0: 61 2c 09 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e a,./* Connection
0fd0: 20 73 74 61 74 65 20 69 6e 66 6f 20 2a 2f 0a 20 state info */.
0fe0: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 Tcl_Interp *i
0ff0: 6e 74 65 72 70 2c 09 09 2f 2a 20 54 63 6c 20 69 nterp,../* Tcl i
1000: 6e 74 65 72 70 72 65 74 65 72 20 74 6f 20 72 65 nterpreter to re
1010: 70 6f 72 74 20 65 72 72 6f 72 73 20 74 6f 20 2a port errors to *
1020: 2f 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 29 /. int flags)
1030: 09 09 09 2f 2a 20 46 6c 61 67 73 20 74 6f 20 63 .../* Flags to c
1040: 6c 6f 73 65 20 72 65 61 64 2f 77 72 69 74 65 20 lose read/write
1050: 73 69 64 65 20 6f 66 20 63 68 61 6e 6e 65 6c 20 side of channel
1060: 2a 2f 0a 7b 0a 20 20 20 20 53 74 61 74 65 20 2a */.{. State *
1070: 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 statePtr = (Stat
1080: 65 20 2a 29 20 69 6e 73 74 61 6e 63 65 44 61 74 e *) instanceDat
1090: 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 a;.. dprintf(
10a0: 22 54 6c 73 43 6c 6f 73 65 32 50 72 6f 63 28 25 "TlsClose2Proc(%
10b0: 70 29 22 2c 20 28 76 6f 69 64 20 2a 29 20 73 74 p)", (void *) st
10c0: 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 69 66 atePtr);.. if
10d0: 20 28 28 66 6c 61 67 73 20 26 20 28 54 43 4c 5f ((flags & (TCL_
10e0: 43 4c 4f 53 45 5f 52 45 41 44 7c 54 43 4c 5f 43 CLOSE_READ|TCL_C
10f0: 4c 4f 53 45 5f 57 52 49 54 45 29 29 20 3d 3d 20 LOSE_WRITE)) ==
1100: 30 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 6c 73 0) {..return Tls
1110: 43 6c 6f 73 65 50 72 6f 63 28 69 6e 73 74 61 6e CloseProc(instan
1120: 63 65 44 61 74 61 2c 20 69 6e 74 65 72 70 29 3b ceData, interp);
1130: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 . }. retur
1140: 6e 20 45 49 4e 56 41 4c 3b 0a 7d 0a 0a 2f 2a 0a n EINVAL;.}../*.
1150: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
1160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
11a0: 20 2a 0a 20 2a 20 54 6c 73 5f 57 61 69 74 46 6f *. * Tls_WaitFo
11b0: 72 43 6f 6e 6e 65 63 74 20 2d 2d 0a 20 2a 0a 20 rConnect --. *.
11c0: 2a 09 50 65 72 66 6f 72 6d 20 63 6f 6e 6e 65 63 *.Perform connec
11d0: 74 20 28 63 6c 69 65 6e 74 29 20 6f 72 20 61 63 t (client) or ac
11e0: 63 65 70 74 20 28 73 65 72 76 65 72 29 20 66 75 cept (server) fu
11f0: 6e 63 74 69 6f 6e 2e 20 41 6c 73 6f 20 70 65 72 nction. Also per
1200: 66 6f 72 6d 73 0a 20 2a 09 65 71 75 69 76 61 6c forms. *.equival
1210: 65 6e 74 20 6f 66 20 68 61 6e 64 73 68 61 6b 65 ent of handshake
1220: 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 2a 0a 20 2a function.. *. *
1230: 20 52 65 73 75 6c 74 3a 0a 20 2a 20 20 20 20 31 Result:. * 1
1240: 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 if successful,
1250: 30 20 69 66 20 77 61 69 74 20 66 6f 72 20 63 6f 0 if wait for co
1260: 6e 6e 65 63 74 2c 20 61 6e 64 20 2d 31 20 69 66 nnect, and -1 if
1270: 20 66 61 69 6c 65 64 2e 0a 20 2a 0a 20 2a 20 53 failed.. *. * S
1280: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
1290: 49 73 73 75 65 73 20 53 53 4c 5f 61 63 63 65 70 Issues SSL_accep
12a0: 74 20 6f 72 20 53 53 4c 5f 63 6f 6e 6e 65 63 74 t or SSL_connect
12b0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
12c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1300: 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 54 6c 73 5f ---. */.int Tls_
1310: 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 28 0a WaitForConnect(.
1320: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 State *state
1330: 50 74 72 2c 09 09 09 2f 2a 20 43 6f 6e 6e 65 63 Ptr,.../* Connec
1340: 74 69 6f 6e 20 73 74 61 74 65 20 69 6e 66 6f 20 tion state info
1350: 2a 2f 0a 20 20 20 20 69 6e 74 20 2a 65 72 72 6f */. int *erro
1360: 72 43 6f 64 65 50 74 72 2c 09 09 09 2f 2a 20 53 rCodePtr,.../* S
1370: 74 6f 72 61 67 65 20 66 6f 72 20 65 72 72 6f 72 torage for error
1380: 20 63 6f 64 65 20 74 6f 20 72 65 74 75 72 6e 20 code to return
1390: 2a 2f 0a 20 20 20 20 69 6e 74 20 68 61 6e 64 73 */. int hands
13a0: 68 61 6b 65 46 61 69 6c 75 72 65 49 73 50 65 72 hakeFailureIsPer
13b0: 6d 61 6e 65 6e 74 29 09 2f 2a 20 49 73 20 74 68 manent)./* Is th
13c0: 65 20 63 6f 6e 6e 65 63 74 20 66 61 69 6c 75 72 e connect failur
13d0: 65 20 70 65 72 6d 61 6e 65 6e 74 20 2a 2f 0a 7b e permanent */.{
13e0: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f . unsigned lo
13f0: 6e 67 20 62 61 63 6b 69 6e 67 45 72 72 6f 72 3b ng backingError;
1400: 0a 20 20 20 20 69 6e 74 20 65 72 72 2c 20 72 63 . int err, rc
1410: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 62 69 = 0;. int bi
1420: 6f 53 68 6f 75 6c 64 52 65 74 72 79 3b 0a 20 20 oShouldRetry;.
1430: 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 *errorCodePtr
1440: 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 = 0;.. dprint
1450: 66 28 22 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 f("WaitForConnec
1460: 74 28 25 70 29 22 2c 20 28 76 6f 69 64 20 2a 29 t(%p)", (void *)
1470: 20 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 statePtr);.
1480: 64 70 72 69 6e 74 46 6c 61 67 73 28 73 74 61 74 dprintFlags(stat
1490: 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 ePtr);.. /* C
14a0: 61 6e 20 61 6c 73 6f 20 63 68 65 63 6b 20 53 53 an also check SS
14b0: 4c 5f 69 73 5f 69 6e 69 74 5f 66 69 6e 69 73 68 L_is_init_finish
14c0: 65 64 28 73 73 6c 29 20 2a 2f 0a 20 20 20 20 69 ed(ssl) */. i
14d0: 66 20 28 21 28 73 74 61 74 65 50 74 72 2d 3e 66 f (!(statePtr->f
14e0: 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f 49 lags & TLS_TCL_I
14f0: 4e 49 54 29 29 20 7b 0a 09 64 70 72 69 6e 74 66 NIT)) {..dprintf
1500: 28 22 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e ("Tls_WaitForCon
1510: 6e 65 63 74 20 63 61 6c 6c 65 64 20 6f 6e 20 61 nect called on a
1520: 6c 72 65 61 64 79 20 69 6e 69 74 69 61 6c 69 7a lready initializ
1530: 65 64 20 63 68 61 6e 6e 65 6c 20 2d 2d 20 72 65 ed channel -- re
1540: 74 75 72 6e 69 6e 67 20 77 69 74 68 20 69 6d 6d turning with imm
1550: 65 64 69 61 74 65 20 73 75 63 63 65 73 73 22 29 ediate success")
1560: 3b 0a 09 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 ;..return 1;.
1570: 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 }.. if (stat
1580: 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c ePtr->flags & TL
1590: 53 5f 54 43 4c 5f 48 41 4e 44 53 48 41 4b 45 5f S_TCL_HANDSHAKE_
15a0: 46 41 49 4c 45 44 29 20 7b 0a 09 2f 2a 0a 09 20 FAILED) {../*..
15b0: 2a 20 44 69 66 66 65 72 65 6e 74 20 74 79 70 65 * Different type
15c0: 73 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 73 20 s of operations
15d0: 68 61 76 65 20 64 69 66 66 65 72 65 6e 74 20 72 have different r
15e0: 65 71 75 69 72 65 6d 65 6e 74 73 0a 09 20 2a 20 equirements.. *
15f0: 53 53 4c 20 62 65 69 6e 67 20 65 73 74 61 62 6c SSL being establ
1600: 69 73 68 65 64 0a 09 20 2a 2f 0a 09 69 66 20 28 ished.. */..if (
1610: 68 61 6e 64 73 68 61 6b 65 46 61 69 6c 75 72 65 handshakeFailure
1620: 49 73 50 65 72 6d 61 6e 65 6e 74 29 20 7b 0a 09 IsPermanent) {..
1630: 20 20 20 20 64 70 72 69 6e 74 66 28 22 41 73 6b dprintf("Ask
1640: 65 64 20 74 6f 20 77 61 69 74 20 66 6f 72 20 61 ed to wait for a
1650: 20 54 4c 53 20 68 61 6e 64 73 68 61 6b 65 20 74 TLS handshake t
1660: 68 61 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 hat has already
1670: 66 61 69 6c 65 64 2e 20 20 52 65 74 75 72 6e 69 failed. Returni
1680: 6e 67 20 66 61 74 61 6c 20 65 72 72 6f 72 22 29 ng fatal error")
1690: 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 ;.. *errorCod
16a0: 65 50 74 72 20 3d 20 45 43 4f 4e 4e 41 42 4f 52 ePtr = ECONNABOR
16b0: 54 45 44 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 TED;..} else {..
16c0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 41 73 6b dprintf("Ask
16d0: 65 64 20 74 6f 20 77 61 69 74 20 66 6f 72 20 61 ed to wait for a
16e0: 20 54 4c 53 20 68 61 6e 64 73 68 61 6b 65 20 74 TLS handshake t
16f0: 68 61 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 hat has already
1700: 66 61 69 6c 65 64 2e 20 20 52 65 74 75 72 6e 69 failed. Returni
1710: 6e 67 20 73 6f 66 74 20 65 72 72 6f 72 22 29 3b ng soft error");
1720: 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 .. *errorCode
1730: 50 74 72 20 3d 20 45 43 4f 4e 4e 52 45 53 45 54 Ptr = ECONNRESET
1740: 3b 0a 09 7d 0a 09 72 65 74 75 72 6e 20 2d 31 3b ;..}..return -1;
1750: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 20 . }.. for
1760: 28 3b 3b 29 20 7b 0a 09 45 52 52 5f 63 6c 65 61 (;;) {..ERR_clea
1770: 72 5f 65 72 72 6f 72 28 29 3b 0a 09 42 49 4f 5f r_error();..BIO_
1780: 63 6c 65 61 72 5f 72 65 74 72 79 5f 66 6c 61 67 clear_retry_flag
1790: 73 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 s(statePtr->bio)
17a0: 3b 0a 0a 09 2f 2a 20 4e 6f 74 20 69 6e 69 74 69 ;.../* Not initi
17b0: 61 6c 69 7a 65 64 20 79 65 74 21 20 41 6c 73 6f alized yet! Also
17c0: 20 63 61 6c 6c 73 20 53 53 4c 5f 64 6f 5f 68 61 calls SSL_do_ha
17d0: 6e 64 73 68 61 6b 65 28 29 2e 20 2a 2f 0a 09 69 ndshake(). */..i
17e0: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 f (statePtr->fla
17f0: 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f 53 45 52 gs & TLS_TCL_SER
1800: 56 45 52 29 20 7b 0a 09 20 20 20 20 64 70 72 69 VER) {.. dpri
1810: 6e 74 66 28 22 43 61 6c 6c 69 6e 67 20 53 53 4c ntf("Calling SSL
1820: 5f 61 63 63 65 70 74 28 29 22 29 3b 0a 09 20 20 _accept()");..
1830: 20 20 65 72 72 20 3d 20 53 53 4c 5f 61 63 63 65 err = SSL_acce
1840: 70 74 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c pt(statePtr->ssl
1850: 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 );...} else {..
1860: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
1870: 69 6e 67 20 53 53 4c 5f 63 6f 6e 6e 65 63 74 28 ing SSL_connect(
1880: 29 22 29 3b 0a 09 20 20 20 20 65 72 72 20 3d 20 )");.. err =
1890: 53 53 4c 5f 63 6f 6e 6e 65 63 74 28 73 74 61 74 SSL_connect(stat
18a0: 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 7d 0a 0a ePtr->ssl);..}..
18b0: 09 2f 2a 20 31 3d 73 75 63 63 65 73 73 66 75 6c ./* 1=successful
18c0: 2c 20 30 3d 6e 6f 74 20 73 75 63 63 65 73 73 66 , 0=not successf
18d0: 75 6c 20 61 6e 64 20 73 68 75 74 20 64 6f 77 6e ul and shut down
18e0: 2c 20 3c 30 3d 66 61 74 61 6c 20 65 72 72 6f 72 , <0=fatal error
18f0: 20 2a 2f 0a 09 69 66 20 28 65 72 72 20 3e 20 30 */..if (err > 0
1900: 29 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 ) {.. dprintf
1910: 28 22 41 63 63 65 70 74 20 6f 72 20 63 6f 6e 6e ("Accept or conn
1920: 65 63 74 20 77 61 73 20 73 75 63 63 65 73 73 66 ect was successf
1930: 75 6c 22 29 3b 0a 0a 09 20 20 20 20 65 72 72 20 ul");... err
1940: 3d 20 42 49 4f 5f 66 6c 75 73 68 28 73 74 61 74 = BIO_flush(stat
1950: 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 20 20 20 ePtr->bio);..
1960: 20 69 66 20 28 65 72 72 20 3c 3d 20 30 29 20 7b if (err <= 0) {
1970: 0a 09 09 64 70 72 69 6e 74 66 28 22 46 6c 75 73 ...dprintf("Flus
1980: 68 69 6e 67 20 74 68 65 20 6c 6f 77 65 72 20 6c hing the lower l
1990: 61 79 65 72 73 20 66 61 69 6c 65 64 2c 20 74 68 ayers failed, th
19a0: 69 73 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79 is will probably
19b0: 20 74 65 72 6d 69 6e 61 74 65 20 74 68 69 73 20 terminate this
19c0: 73 65 73 73 69 6f 6e 22 29 3b 0a 09 20 20 20 20 session");..
19d0: 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 }..} else {..
19e0: 20 64 70 72 69 6e 74 66 28 22 41 63 63 65 70 74 dprintf("Accept
19f0: 20 6f 72 20 63 6f 6e 6e 65 63 74 20 66 61 69 6c or connect fail
1a00: 65 64 22 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 61 ed");..}.../* Sa
1a10: 6d 65 20 61 73 20 53 53 4c 5f 77 61 6e 74 2c 20 me as SSL_want,
1a20: 62 75 74 20 61 6c 73 6f 20 63 68 65 63 6b 73 20 but also checks
1a30: 74 68 65 20 65 72 72 6f 72 20 71 75 65 75 65 20 the error queue
1a40: 2a 2f 0a 09 72 63 20 3d 20 53 53 4c 5f 67 65 74 */..rc = SSL_get
1a50: 5f 65 72 72 6f 72 28 73 74 61 74 65 50 74 72 2d _error(statePtr-
1a60: 3e 73 73 6c 2c 20 65 72 72 29 3b 0a 09 62 61 63 >ssl, err);..bac
1a70: 6b 69 6e 67 45 72 72 6f 72 20 3d 20 45 52 52 5f kingError = ERR_
1a80: 67 65 74 5f 65 72 72 6f 72 28 29 3b 0a 09 69 66 get_error();..if
1a90: 20 28 72 63 20 21 3d 20 53 53 4c 5f 45 52 52 4f (rc != SSL_ERRO
1aa0: 52 5f 4e 4f 4e 45 29 20 7b 0a 09 20 20 20 20 64 R_NONE) {.. d
1ab0: 70 72 69 6e 74 66 28 22 47 6f 74 20 65 72 72 6f printf("Got erro
1ac0: 72 3a 20 25 69 20 28 72 63 20 3d 20 25 69 29 22 r: %i (rc = %i)"
1ad0: 2c 20 65 72 72 2c 20 72 63 29 3b 0a 09 20 20 20 , err, rc);..
1ae0: 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20 65 72 dprintf("Got er
1af0: 72 6f 72 3a 20 25 73 22 2c 20 45 52 52 5f 72 65 ror: %s", ERR_re
1b00: 61 73 6f 6e 5f 65 72 72 6f 72 5f 73 74 72 69 6e ason_error_strin
1b10: 67 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 29 29 g(backingError))
1b20: 3b 0a 09 7d 0a 0a 09 2f 2a 20 54 68 65 20 72 65 ;..}.../* The re
1b30: 74 72 79 20 66 6c 61 67 20 69 73 20 73 65 74 20 try flag is set
1b40: 62 79 20 74 68 65 20 42 49 4f 5f 73 65 74 5f 72 by the BIO_set_r
1b50: 65 74 72 79 5f 2a 20 66 75 6e 63 74 69 6f 6e 73 etry_* functions
1b60: 20 2a 2f 0a 09 62 69 6f 53 68 6f 75 6c 64 52 65 */..bioShouldRe
1b70: 74 72 79 20 3d 20 42 49 4f 5f 73 68 6f 75 6c 64 try = BIO_should
1b80: 5f 72 65 74 72 79 28 73 74 61 74 65 50 74 72 2d _retry(statePtr-
1b90: 3e 62 69 6f 29 3b 0a 09 64 70 72 69 6e 74 66 28 >bio);..dprintf(
1ba0: 22 62 69 6f 53 68 6f 75 6c 64 52 65 74 72 79 20 "bioShouldRetry
1bb0: 3d 20 25 64 22 2c 20 62 69 6f 53 68 6f 75 6c 64 = %d", bioShould
1bc0: 52 65 74 72 79 29 3b 0a 0a 09 69 66 20 28 62 69 Retry);...if (bi
1bd0: 6f 53 68 6f 75 6c 64 52 65 74 72 79 29 20 7b 0a oShouldRetry) {.
1be0: 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 54 68 . dprintf("Th
1bf0: 65 20 49 2f 4f 20 64 69 64 20 6e 6f 74 20 63 6f e I/O did not co
1c00: 6d 70 6c 65 74 65 20 2d 2d 20 62 75 74 20 77 65 mplete -- but we
1c10: 20 73 68 6f 75 6c 64 20 74 72 79 20 69 74 20 61 should try it a
1c20: 67 61 69 6e 22 29 3b 0a 0a 09 20 20 20 20 69 66 gain");... if
1c30: 20 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 (statePtr->flag
1c40: 73 20 26 20 54 4c 53 5f 54 43 4c 5f 41 53 59 4e s & TLS_TCL_ASYN
1c50: 43 29 20 7b 0a 09 09 64 70 72 69 6e 74 66 28 22 C) {...dprintf("
1c60: 52 65 74 75 72 6e 69 6e 67 20 45 41 47 41 49 4e Returning EAGAIN
1c70: 20 73 6f 20 74 68 61 74 20 69 74 20 63 61 6e 20 so that it can
1c80: 62 65 20 72 65 74 72 69 65 64 20 6c 61 74 65 72 be retried later
1c90: 22 29 3b 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65 ");...*errorCode
1ca0: 50 74 72 20 3d 20 45 41 47 41 49 4e 3b 0a 09 09 Ptr = EAGAIN;...
1cb0: 72 65 74 75 72 6e 20 30 3b 0a 09 20 20 20 20 7d return 0;.. }
1cc0: 20 65 6c 73 65 20 7b 0a 09 09 64 70 72 69 6e 74 else {...dprint
1cd0: 66 28 22 44 6f 69 6e 67 20 73 6f 20 6e 6f 77 22 f("Doing so now"
1ce0: 29 3b 0a 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 );...continue;..
1cf0: 20 20 20 20 7d 0a 09 7d 0a 0a 09 64 70 72 69 6e }..}...dprin
1d00: 74 66 28 22 57 65 20 68 61 76 65 20 65 69 74 68 tf("We have eith
1d10: 65 72 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 73 er completely es
1d20: 74 61 62 6c 69 73 68 65 64 20 74 68 65 20 73 65 tablished the se
1d30: 73 73 69 6f 6e 20 6f 72 20 63 6f 6d 70 6c 65 74 ssion or complet
1d40: 65 6c 79 20 66 61 69 6c 65 64 20 69 74 20 2d 2d ely failed it --
1d50: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 6f 72 there is no mor
1d60: 65 20 6e 65 65 64 20 74 6f 20 65 76 65 72 20 72 e need to ever r
1d70: 65 74 72 79 20 69 74 20 74 68 6f 75 67 68 22 29 etry it though")
1d80: 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a ;..break;. }.
1d90: 0a 20 20 20 20 73 77 69 74 63 68 20 28 72 63 29 . switch (rc)
1da0: 20 7b 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52 {..case SSL_ERR
1db0: 4f 52 5f 4e 4f 4e 45 3a 0a 09 20 20 20 20 2f 2a OR_NONE:.. /*
1dc0: 20 54 68 65 20 54 4c 53 2f 53 53 4c 20 49 2f 4f The TLS/SSL I/O
1dd0: 20 6f 70 65 72 61 74 69 6f 6e 20 63 6f 6d 70 6c operation compl
1de0: 65 74 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c eted successfull
1df0: 79 20 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e 74 y */.. dprint
1e00: 66 28 22 53 53 4c 5f 45 52 52 4f 52 5f 4e 4f 4e f("SSL_ERROR_NON
1e10: 45 22 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 E");.. *error
1e20: 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a 09 20 20 CodePtr = 0;..
1e30: 20 20 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20 break;...case
1e40: 53 53 4c 5f 45 52 52 4f 52 5f 53 53 4c 3a 0a 09 SSL_ERROR_SSL:..
1e50: 20 20 20 20 2f 2a 20 41 20 6e 6f 6e 2d 72 65 63 /* A non-rec
1e60: 6f 76 65 72 61 62 6c 65 2c 20 66 61 74 61 6c 20 overable, fatal
1e70: 65 72 72 6f 72 20 69 6e 20 74 68 65 20 53 53 4c error in the SSL
1e80: 20 6c 69 62 72 61 72 79 20 6f 63 63 75 72 72 65 library occurre
1e90: 64 2c 0a 09 20 20 20 20 20 20 20 75 73 75 61 6c d,.. usual
1ea0: 6c 79 20 61 20 70 72 6f 74 6f 63 6f 6c 20 65 72 ly a protocol er
1eb0: 72 6f 72 2e 20 54 68 69 73 20 69 6e 63 6c 75 64 ror. This includ
1ec0: 65 73 20 63 65 72 74 69 66 69 63 61 74 65 20 76 es certificate v
1ed0: 61 6c 69 64 61 74 69 6f 6e 0a 09 20 20 20 20 20 alidation..
1ee0: 20 20 65 72 72 6f 72 73 2e 20 2a 2f 0a 09 20 20 errors. */..
1ef0: 20 20 64 70 72 69 6e 74 66 28 22 53 53 4c 5f 45 dprintf("SSL_E
1f00: 52 52 4f 52 5f 53 53 4c 3a 20 46 61 74 61 6c 20 RROR_SSL: Fatal
1f10: 53 53 4c 20 70 72 6f 74 6f 63 6f 6c 20 65 72 72 SSL protocol err
1f20: 6f 72 20 6f 63 63 75 72 72 65 64 22 29 3b 0a 09 or occurred");..
1f30: 20 20 20 20 69 66 20 28 53 53 4c 5f 67 65 74 5f if (SSL_get_
1f40: 76 65 72 69 66 79 5f 72 65 73 75 6c 74 28 73 74 verify_result(st
1f50: 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 21 3d 20 atePtr->ssl) !=
1f60: 58 35 30 39 5f 56 5f 4f 4b 29 20 7b 0a 09 09 54 X509_V_OK) {...T
1f70: 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 ls_Error(statePt
1f80: 72 2c 0a 09 09 20 20 20 20 58 35 30 39 5f 76 65 r,... X509_ve
1f90: 72 69 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f rify_cert_error_
1fa0: 73 74 72 69 6e 67 28 53 53 4c 5f 67 65 74 5f 76 string(SSL_get_v
1fb0: 65 72 69 66 79 5f 72 65 73 75 6c 74 28 73 74 61 erify_result(sta
1fc0: 74 65 50 74 72 2d 3e 73 73 6c 29 29 29 3b 0a 09 tePtr->ssl)));..
1fd0: 20 20 20 20 7d 0a 09 20 20 20 20 69 66 20 28 62 }.. if (b
1fe0: 61 63 6b 69 6e 67 45 72 72 6f 72 20 21 3d 20 30 ackingError != 0
1ff0: 29 20 7b 0a 09 09 54 6c 73 5f 45 72 72 6f 72 28 ) {...Tls_Error(
2000: 73 74 61 74 65 50 74 72 2c 20 45 52 52 5f 72 65 statePtr, ERR_re
2010: 61 73 6f 6e 5f 65 72 72 6f 72 5f 73 74 72 69 6e ason_error_strin
2020: 67 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 29 29 g(backingError))
2030: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 73 74 ;.. }.. st
2040: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d atePtr->flags |=
2050: 20 54 4c 53 5f 54 43 4c 5f 48 41 4e 44 53 48 41 TLS_TCL_HANDSHA
2060: 4b 45 5f 46 41 49 4c 45 44 3b 0a 09 20 20 20 20 KE_FAILED;..
2070: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 *errorCodePtr =
2080: 45 43 4f 4e 4e 41 42 4f 52 54 45 44 3b 0a 09 20 ECONNABORTED;..
2090: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 0a 09 return -1;...
20a0: 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 57 case SSL_ERROR_W
20b0: 41 4e 54 5f 52 45 41 44 3a 0a 09 20 20 20 20 2f ANT_READ:.. /
20c0: 2a 20 4d 6f 72 65 20 64 61 74 61 20 6d 75 73 74 * More data must
20d0: 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 be read from th
20e0: 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 42 49 4f e underlying BIO
20f0: 20 6c 61 79 65 72 20 69 6e 20 6f 72 64 65 72 20 layer in order
2100: 74 6f 0a 09 20 20 20 20 20 20 20 63 6f 6d 70 6c to.. compl
2110: 65 74 65 20 74 68 65 20 61 63 74 75 61 6c 20 53 ete the actual S
2120: 53 4c 5f 2a 28 29 20 6f 70 65 72 61 74 69 6f 6e SL_*() operation
2130: 2e 20 20 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e . */.. dprin
2140: 74 66 28 22 53 53 4c 5f 45 52 52 4f 52 5f 57 41 tf("SSL_ERROR_WA
2150: 4e 54 5f 52 45 41 44 22 29 3b 0a 09 20 20 20 20 NT_READ");..
2160: 42 49 4f 5f 73 65 74 5f 72 65 74 72 79 5f 72 65 BIO_set_retry_re
2170: 61 64 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f ad(statePtr->bio
2180: 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f );.. *errorCo
2190: 64 65 50 74 72 20 3d 20 45 41 47 41 49 4e 3b 0a dePtr = EAGAIN;.
21a0: 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 45 52 . dprintf("ER
21b0: 52 28 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 R(SSL_ERROR_WANT
21c0: 5f 52 45 41 44 2c 20 45 41 47 41 49 4e 29 22 29 _READ, EAGAIN)")
21d0: 3b 0a 09 20 20 20 20 73 74 61 74 65 50 74 72 2d ;.. statePtr-
21e0: 3e 77 61 6e 74 20 7c 3d 20 54 43 4c 5f 52 45 41 >want |= TCL_REA
21f0: 44 41 42 4c 45 3b 0a 09 20 20 20 20 72 65 74 75 DABLE;.. retu
2200: 72 6e 20 30 3b 0a 0a 09 63 61 73 65 20 53 53 4c rn 0;...case SSL
2210: 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 57 52 49 54 _ERROR_WANT_WRIT
2220: 45 3a 0a 09 20 20 20 20 2f 2a 20 54 68 65 72 65 E:.. /* There
2230: 20 69 73 20 64 61 74 61 20 69 6e 20 74 68 65 20 is data in the
2240: 53 53 4c 20 62 75 66 66 65 72 20 74 68 61 74 20 SSL buffer that
2250: 6d 75 73 74 20 62 65 20 77 72 69 74 74 65 6e 20 must be written
2260: 74 6f 20 74 68 65 0a 09 20 20 20 20 20 20 20 75 to the.. u
2270: 6e 64 65 72 6c 79 69 6e 67 20 42 49 4f 20 69 6e nderlying BIO in
2280: 20 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65 order to comple
2290: 74 65 20 74 68 65 20 53 53 4c 5f 2a 28 29 20 6f te the SSL_*() o
22a0: 70 65 72 61 74 69 6f 6e 2e 20 2a 2f 0a 09 20 20 peration. */..
22b0: 20 20 64 70 72 69 6e 74 66 28 22 53 53 4c 5f 45 dprintf("SSL_E
22c0: 52 52 4f 52 5f 57 41 4e 54 5f 57 52 49 54 45 22 RROR_WANT_WRITE"
22d0: 29 3b 0a 09 20 20 20 20 42 49 4f 5f 73 65 74 5f );.. BIO_set_
22e0: 72 65 74 72 79 5f 77 72 69 74 65 28 73 74 61 74 retry_write(stat
22f0: 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 20 20 20 ePtr->bio);..
2300: 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d *errorCodePtr =
2310: 20 45 41 47 41 49 4e 3b 0a 09 20 20 20 20 64 70 EAGAIN;.. dp
2320: 72 69 6e 74 66 28 22 45 52 52 28 53 53 4c 5f 45 rintf("ERR(SSL_E
2330: 52 52 4f 52 5f 57 41 4e 54 5f 57 52 49 54 45 2c RROR_WANT_WRITE,
2340: 20 45 41 47 41 49 4e 29 22 29 3b 0a 09 20 20 20 EAGAIN)");..
2350: 20 73 74 61 74 65 50 74 72 2d 3e 77 61 6e 74 20 statePtr->want
2360: 7c 3d 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 3b |= TCL_WRITABLE;
2370: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a .. return 0;.
2380: 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 ..case SSL_ERROR
2390: 5f 57 41 4e 54 5f 58 35 30 39 5f 4c 4f 4f 4b 55 _WANT_X509_LOOKU
23a0: 50 3a 0a 09 20 20 20 20 2f 2a 20 54 68 65 20 6f P:.. /* The o
23b0: 70 65 72 61 74 69 6f 6e 20 64 69 64 20 6e 6f 74 peration did not
23c0: 20 63 6f 6d 70 6c 65 74 65 20 62 65 63 61 75 73 complete becaus
23d0: 65 20 61 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e e an application
23e0: 20 63 61 6c 6c 62 61 63 6b 0a 09 20 20 20 20 20 callback..
23f0: 20 20 73 65 74 20 62 79 20 53 53 4c 5f 43 54 58 set by SSL_CTX
2400: 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 63 65 72 74 _set_client_cert
2410: 5f 63 62 28 29 20 68 61 73 20 61 73 6b 65 64 20 _cb() has asked
2420: 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 61 67 61 to be called aga
2430: 69 6e 2e 20 2a 2f 0a 09 20 20 20 20 64 70 72 69 in. */.. dpri
2440: 6e 74 66 28 22 53 53 4c 5f 45 52 52 4f 52 5f 57 ntf("SSL_ERROR_W
2450: 41 4e 54 5f 58 35 30 39 5f 4c 4f 4f 4b 55 50 22 ANT_X509_LOOKUP"
2460: 29 3b 0a 09 20 20 20 20 42 49 4f 5f 73 65 74 5f );.. BIO_set_
2470: 72 65 74 72 79 5f 73 70 65 63 69 61 6c 28 73 74 retry_special(st
2480: 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 20 atePtr->bio);..
2490: 20 20 20 42 49 4f 5f 73 65 74 5f 72 65 74 72 79 BIO_set_retry
24a0: 5f 72 65 61 73 6f 6e 28 73 74 61 74 65 50 74 72 _reason(statePtr
24b0: 2d 3e 62 69 6f 2c 20 42 49 4f 5f 52 52 5f 53 53 ->bio, BIO_RR_SS
24c0: 4c 5f 58 35 30 39 5f 4c 4f 4f 4b 55 50 29 3b 0a L_X509_LOOKUP);.
24d0: 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 . *errorCodeP
24e0: 74 72 20 3d 20 45 41 47 41 49 4e 3b 0a 09 20 20 tr = EAGAIN;..
24f0: 20 20 64 70 72 69 6e 74 66 28 22 45 52 52 28 53 dprintf("ERR(S
2500: 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 58 35 SL_ERROR_WANT_X5
2510: 30 39 5f 4c 4f 4f 4b 55 50 2c 20 45 41 47 41 49 09_LOOKUP, EAGAI
2520: 4e 29 22 29 3b 0a 09 20 20 20 20 72 65 74 75 72 N)");.. retur
2530: 6e 20 30 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f n 0;...case SSL_
2540: 45 52 52 4f 52 5f 53 59 53 43 41 4c 4c 3a 0a 09 ERROR_SYSCALL:..
2550: 20 20 20 20 2f 2a 20 53 6f 6d 65 20 6e 6f 6e 2d /* Some non-
2560: 72 65 63 6f 76 65 72 61 62 6c 65 2c 20 66 61 74 recoverable, fat
2570: 61 6c 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 al I/O error occ
2580: 75 72 72 65 64 20 2a 2f 0a 09 20 20 20 20 64 70 urred */.. dp
2590: 72 69 6e 74 66 28 22 53 53 4c 5f 45 52 52 4f 52 rintf("SSL_ERROR
25a0: 5f 53 59 53 43 41 4c 4c 3a 20 46 61 74 61 6c 20 _SYSCALL: Fatal
25b0: 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 72 I/O error occurr
25c0: 65 64 22 29 3b 0a 0a 09 20 20 20 20 69 66 20 28 ed");... if (
25d0: 62 61 63 6b 69 6e 67 45 72 72 6f 72 20 3d 3d 20 backingError ==
25e0: 30 20 26 26 20 65 72 72 20 3d 3d 20 30 29 20 7b 0 && err == 0) {
25f0: 0a 09 09 64 70 72 69 6e 74 66 28 22 45 4f 46 20 ...dprintf("EOF
2600: 72 65 61 63 68 65 64 22 29 0a 09 09 2a 65 72 72 reached")...*err
2610: 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 43 4f 4e orCodePtr = ECON
2620: 4e 52 45 53 45 54 3b 0a 09 09 54 6c 73 5f 45 72 NRESET;...Tls_Er
2630: 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20 22 28 ror(statePtr, "(
2640: 75 6e 65 78 70 65 63 74 65 64 29 20 45 4f 46 20 unexpected) EOF
2650: 72 65 61 63 68 65 64 22 29 3b 0a 0a 09 20 20 20 reached");...
2660: 20 7d 20 65 6c 73 65 20 69 66 20 28 62 61 63 6b } else if (back
2670: 69 6e 67 45 72 72 6f 72 20 3d 3d 20 30 20 26 26 ingError == 0 &&
2680: 20 65 72 72 20 3d 3d 20 2d 31 29 20 7b 0a 09 09 err == -1) {...
2690: 64 70 72 69 6e 74 66 28 22 49 2f 4f 20 65 72 72 dprintf("I/O err
26a0: 6f 72 20 6f 63 63 75 72 72 65 64 20 28 65 72 72 or occurred (err
26b0: 6e 6f 20 3d 20 25 6c 75 29 22 2c 20 28 75 6e 73 no = %lu)", (uns
26c0: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 54 63 6c 5f igned long) Tcl_
26d0: 47 65 74 45 72 72 6e 6f 28 29 29 3b 0a 09 09 2a GetErrno());...*
26e0: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 54 errorCodePtr = T
26f0: 63 6c 5f 47 65 74 45 72 72 6e 6f 28 29 3b 0a 09 cl_GetErrno();..
2700: 09 69 66 20 28 2a 65 72 72 6f 72 43 6f 64 65 50 .if (*errorCodeP
2710: 74 72 20 3d 3d 20 45 43 4f 4e 4e 52 45 53 45 54 tr == ECONNRESET
2720: 29 20 7b 0a 09 09 20 20 20 20 2a 65 72 72 6f 72 ) {... *error
2730: 43 6f 64 65 50 74 72 20 3d 20 45 43 4f 4e 4e 41 CodePtr = ECONNA
2740: 42 4f 52 54 45 44 3b 0a 09 09 7d 0a 09 09 54 6c BORTED;...}...Tl
2750: 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 s_Error(statePtr
2760: 2c 20 54 63 6c 5f 45 72 72 6e 6f 4d 73 67 28 2a , Tcl_ErrnoMsg(*
2770: 65 72 72 6f 72 43 6f 64 65 50 74 72 29 29 3b 0a errorCodePtr));.
2780: 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 .. } else {..
2790: 09 64 70 72 69 6e 74 66 28 22 49 2f 4f 20 65 72 .dprintf("I/O er
27a0: 72 6f 72 20 6f 63 63 75 72 72 65 64 20 28 62 61 ror occurred (ba
27b0: 63 6b 69 6e 67 45 72 72 6f 72 20 3d 20 25 6c 75 ckingError = %lu
27c0: 29 22 2c 20 62 61 63 6b 69 6e 67 45 72 72 6f 72 )", backingError
27d0: 29 3b 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 );...*errorCodeP
27e0: 74 72 20 3d 20 54 63 6c 5f 47 65 74 45 72 72 6e tr = Tcl_GetErrn
27f0: 6f 28 29 3b 0a 09 09 69 66 20 28 2a 65 72 72 6f o();...if (*erro
2800: 72 43 6f 64 65 50 74 72 20 3d 3d 20 45 43 4f 4e rCodePtr == ECON
2810: 4e 52 45 53 45 54 29 20 7b 0a 09 09 20 20 20 20 NRESET) {...
2820: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 *errorCodePtr =
2830: 45 43 4f 4e 4e 41 42 4f 52 54 45 44 3b 0a 09 09 ECONNABORTED;...
2840: 7d 0a 09 09 54 6c 73 5f 45 72 72 6f 72 28 73 74 }...Tls_Error(st
2850: 61 74 65 50 74 72 2c 20 45 52 52 5f 72 65 61 73 atePtr, ERR_reas
2860: 6f 6e 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 on_error_string(
2870: 62 61 63 6b 69 6e 67 45 72 72 6f 72 29 29 3b 0a backingError));.
2880: 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 73 74 61 . }... sta
2890: 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 tePtr->flags |=
28a0: 54 4c 53 5f 54 43 4c 5f 48 41 4e 44 53 48 41 4b TLS_TCL_HANDSHAK
28b0: 45 5f 46 41 49 4c 45 44 3b 0a 09 20 20 20 20 72 E_FAILED;.. r
28c0: 65 74 75 72 6e 20 2d 31 3b 0a 0a 09 63 61 73 65 eturn -1;...case
28d0: 20 53 53 4c 5f 45 52 52 4f 52 5f 5a 45 52 4f 5f SSL_ERROR_ZERO_
28e0: 52 45 54 55 52 4e 3a 0a 09 20 20 20 20 2f 2a 20 RETURN:.. /*
28f0: 50 65 65 72 20 68 61 73 20 63 6c 65 61 6e 6c 79 Peer has cleanly
2900: 20 63 6c 6f 73 65 64 20 74 68 65 20 63 6f 6e 6e closed the conn
2910: 65 63 74 69 6f 6e 20 62 79 20 73 65 6e 64 69 6e ection by sendin
2920: 67 20 74 68 65 20 63 6c 6f 73 65 5f 6e 6f 74 69 g the close_noti
2930: 66 79 0a 09 20 20 20 20 20 20 20 61 6c 65 72 74 fy.. alert
2940: 2e 20 43 61 6e 27 74 20 72 65 61 64 2c 20 62 75 . Can't read, bu
2950: 74 20 63 61 6e 20 77 72 69 74 65 2e 20 4e 65 65 t can write. Nee
2960: 64 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 45 d to return an E
2970: 4f 46 2c 20 73 6f 20 74 68 65 0a 09 20 20 20 20 OF, so the..
2980: 20 20 20 63 68 61 6e 6e 65 6c 20 69 73 20 63 6c channel is cl
2990: 6f 73 65 64 20 77 68 69 63 68 20 77 69 6c 6c 20 osed which will
29a0: 73 65 6e 64 20 61 6e 20 53 53 4c 5f 73 68 75 74 send an SSL_shut
29b0: 64 6f 77 6e 28 29 2e 20 2a 2f 0a 09 20 20 20 20 down(). */..
29c0: 64 70 72 69 6e 74 66 28 22 53 53 4c 5f 45 52 52 dprintf("SSL_ERR
29d0: 4f 52 5f 5a 45 52 4f 5f 52 45 54 55 52 4e 3a 20 OR_ZERO_RETURN:
29e0: 50 65 65 72 20 68 61 73 20 63 6c 6f 73 65 64 20 Peer has closed
29f0: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 22 29 the connection")
2a00: 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 ;.. *errorCod
2a10: 65 50 74 72 20 3d 20 45 43 4f 4e 4e 52 45 53 45 ePtr = ECONNRESE
2a20: 54 3b 0a 09 20 20 20 20 54 6c 73 5f 45 72 72 6f T;.. Tls_Erro
2a30: 72 28 73 74 61 74 65 50 74 72 2c 20 22 50 65 65 r(statePtr, "Pee
2a40: 72 20 68 61 73 20 63 6c 6f 73 65 64 20 74 68 65 r has closed the
2a50: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6f 72 20 connection for
2a60: 77 72 69 74 69 6e 67 20 62 79 20 73 65 6e 64 69 writing by sendi
2a70: 6e 67 20 74 68 65 20 63 6c 6f 73 65 5f 6e 6f 74 ng the close_not
2a80: 69 66 79 20 61 6c 65 72 74 22 29 3b 0a 09 20 20 ify alert");..
2a90: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 0a 09 63 return -1;...c
2aa0: 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 ase SSL_ERROR_WA
2ab0: 4e 54 5f 43 4f 4e 4e 45 43 54 3a 0a 09 20 20 20 NT_CONNECT:..
2ac0: 20 2f 2a 20 54 68 65 20 6f 70 65 72 61 74 69 6f /* The operatio
2ad0: 6e 20 64 69 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 n did not comple
2ae0: 74 65 20 61 6e 64 20 63 6f 6e 6e 65 63 74 20 77 te and connect w
2af0: 6f 75 6c 64 20 68 61 76 65 20 62 6c 6f 63 6b 65 ould have blocke
2b00: 64 2e 0a 09 20 20 20 20 20 20 20 52 65 74 72 79 d... Retry
2b10: 20 61 67 61 69 6e 20 61 66 74 65 72 20 63 6f 6e again after con
2b20: 6e 65 63 74 69 6f 6e 20 69 73 20 65 73 74 61 62 nection is estab
2b30: 6c 69 73 68 65 64 2e 20 2a 2f 0a 09 20 20 20 20 lished. */..
2b40: 64 70 72 69 6e 74 66 28 22 53 53 4c 5f 45 52 52 dprintf("SSL_ERR
2b50: 4f 52 5f 57 41 4e 54 5f 43 4f 4e 4e 45 43 54 22 OR_WANT_CONNECT"
2b60: 29 3b 0a 09 20 20 20 20 42 49 4f 5f 73 65 74 5f );.. BIO_set_
2b70: 72 65 74 72 79 5f 73 70 65 63 69 61 6c 28 73 74 retry_special(st
2b80: 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 20 atePtr->bio);..
2b90: 20 20 20 42 49 4f 5f 73 65 74 5f 72 65 74 72 79 BIO_set_retry
2ba0: 5f 72 65 61 73 6f 6e 28 73 74 61 74 65 50 74 72 _reason(statePtr
2bb0: 2d 3e 62 69 6f 2c 20 42 49 4f 5f 52 52 5f 43 4f ->bio, BIO_RR_CO
2bc0: 4e 4e 45 43 54 29 3b 0a 09 20 20 20 20 2a 65 72 NNECT);.. *er
2bd0: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 41 47 rorCodePtr = EAG
2be0: 41 49 4e 3b 0a 09 20 20 20 20 64 70 72 69 6e 74 AIN;.. dprint
2bf0: 66 28 22 45 52 52 28 53 53 4c 5f 45 52 52 4f 52 f("ERR(SSL_ERROR
2c00: 5f 57 41 4e 54 5f 43 4f 4e 4e 45 43 54 2c 20 45 _WANT_CONNECT, E
2c10: 41 47 41 49 4e 29 22 29 3b 0a 09 20 20 20 20 72 AGAIN)");.. r
2c20: 65 74 75 72 6e 20 30 3b 0a 0a 09 63 61 73 65 20 eturn 0;...case
2c30: 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 41 SSL_ERROR_WANT_A
2c40: 43 43 45 50 54 3a 0a 09 20 20 20 20 2f 2a 20 54 CCEPT:.. /* T
2c50: 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 64 69 64 he operation did
2c60: 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 61 6e not complete an
2c70: 64 20 61 63 63 65 70 74 20 77 6f 75 6c 64 20 68 d accept would h
2c80: 61 76 65 20 62 6c 6f 63 6b 65 64 2e 0a 09 20 20 ave blocked...
2c90: 20 20 20 20 20 52 65 74 72 79 20 61 67 61 69 6e Retry again
2ca0: 20 61 66 74 65 72 20 63 6f 6e 6e 65 63 74 69 6f after connectio
2cb0: 6e 20 69 73 20 65 73 74 61 62 6c 69 73 68 65 64 n is established
2cc0: 2e 20 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e 74 . */.. dprint
2cd0: 66 28 22 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e f("SSL_ERROR_WAN
2ce0: 54 5f 41 43 43 45 50 54 22 29 3b 0a 09 20 20 20 T_ACCEPT");..
2cf0: 20 42 49 4f 5f 73 65 74 5f 72 65 74 72 79 5f 73 BIO_set_retry_s
2d00: 70 65 63 69 61 6c 28 73 74 61 74 65 50 74 72 2d pecial(statePtr-
2d10: 3e 62 69 6f 29 3b 0a 09 20 20 20 20 42 49 4f 5f >bio);.. BIO_
2d20: 73 65 74 5f 72 65 74 72 79 5f 72 65 61 73 6f 6e set_retry_reason
2d30: 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 2c 20 (statePtr->bio,
2d40: 42 49 4f 5f 52 52 5f 41 43 43 45 50 54 29 3b 0a BIO_RR_ACCEPT);.
2d50: 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 . *errorCodeP
2d60: 74 72 20 3d 20 45 41 47 41 49 4e 3b 0a 09 20 20 tr = EAGAIN;..
2d70: 20 20 64 70 72 69 6e 74 66 28 22 45 52 52 28 53 dprintf("ERR(S
2d80: 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 41 43 SL_ERROR_WANT_AC
2d90: 43 45 50 54 2c 20 45 41 47 41 49 4e 29 22 29 3b CEPT, EAGAIN)");
2da0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a .. return 0;.
2db0: 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 ..case SSL_ERROR
2dc0: 5f 57 41 4e 54 5f 41 53 59 4e 43 3a 0a 09 20 20 _WANT_ASYNC:..
2dd0: 20 20 2f 2a 20 55 73 65 64 20 77 69 74 68 20 66 /* Used with f
2de0: 6c 61 67 20 53 53 4c 5f 4d 4f 44 45 5f 41 53 59 lag SSL_MODE_ASY
2df0: 4e 43 2c 20 6f 70 20 64 69 64 6e 27 74 20 63 6f NC, op didn't co
2e00: 6d 70 6c 65 74 65 20 62 65 63 61 75 73 65 20 61 mplete because a
2e10: 6e 0a 09 20 20 20 20 20 20 20 61 73 79 6e 63 20 n.. async
2e20: 65 6e 67 69 6e 65 20 69 73 20 73 74 69 6c 6c 20 engine is still
2e30: 70 72 6f 63 65 73 73 69 6e 67 20 64 61 74 61 20 processing data
2e40: 2a 2f 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52 */..case SSL_ERR
2e50: 4f 52 5f 57 41 4e 54 5f 41 53 59 4e 43 5f 4a 4f OR_WANT_ASYNC_JO
2e60: 42 3a 0a 09 20 20 20 20 2f 2a 20 54 68 65 20 61 B:.. /* The a
2e70: 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6a 6f 62 20 synchronous job
2e80: 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 73 74 61 could not be sta
2e90: 72 74 65 64 20 62 65 63 61 75 73 65 20 74 68 65 rted because the
2ea0: 72 65 20 77 65 72 65 20 6e 6f 0a 09 20 20 20 20 re were no..
2eb0: 20 20 20 61 73 79 6e 63 20 6a 6f 62 73 20 61 76 async jobs av
2ec0: 61 69 6c 61 62 6c 65 20 69 6e 20 74 68 65 20 70 ailable in the p
2ed0: 6f 6f 6c 2e 20 2a 2f 0a 09 63 61 73 65 20 53 53 ool. */..case SS
2ee0: 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 43 4c 49 L_ERROR_WANT_CLI
2ef0: 45 4e 54 5f 48 45 4c 4c 4f 5f 43 42 3a 0a 09 20 ENT_HELLO_CB:..
2f00: 20 20 20 2f 2a 20 54 68 65 20 6f 70 65 72 61 74 /* The operat
2f10: 69 6f 6e 20 64 69 64 20 6e 6f 74 20 63 6f 6d 70 ion did not comp
2f20: 6c 65 74 65 20 62 65 63 61 75 73 65 20 61 6e 20 lete because an
2f30: 61 70 70 6c 69 63 61 74 69 6f 6e 20 63 61 6c 6c application call
2f40: 62 61 63 6b 0a 09 20 20 20 20 20 20 20 73 65 74 back.. set
2f50: 20 62 79 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f by SSL_CTX_set_
2f60: 63 6c 69 65 6e 74 5f 68 65 6c 6c 6f 5f 63 62 28 client_hello_cb(
2f70: 29 20 68 61 73 20 61 73 6b 65 64 20 74 6f 20 62 ) has asked to b
2f80: 65 20 63 61 6c 6c 65 64 20 61 67 61 69 6e 2e 20 e called again.
2f90: 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 */.#if OPENSSL_V
2fa0: 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d ERSION_NUMBER >=
2fb0: 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 63 61 0x30000000L..ca
2fc0: 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e se SSL_ERROR_WAN
2fd0: 54 5f 52 45 54 52 59 5f 56 45 52 49 46 59 3a 0a T_RETRY_VERIFY:.
2fe0: 09 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 65 72 . /* The oper
2ff0: 61 74 69 6f 6e 20 64 69 64 20 6e 6f 74 20 63 6f ation did not co
3000: 6d 70 6c 65 74 65 20 62 65 63 61 75 73 65 20 61 mplete because a
3010: 20 63 65 72 74 69 66 69 63 61 74 65 20 76 65 72 certificate ver
3020: 69 66 69 63 61 74 69 6f 6e 0a 09 20 20 20 20 20 ification..
3030: 20 20 63 61 6c 6c 62 61 63 6b 20 68 61 73 20 61 callback has a
3040: 73 6b 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65 sked to be calle
3050: 64 20 61 67 61 69 6e 20 76 69 61 20 53 53 4c 5f d again via SSL_
3060: 73 65 74 5f 72 65 74 72 79 5f 76 65 72 69 66 79 set_retry_verify
3070: 28 33 29 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 09 (3). */.#endif..
3080: 64 65 66 61 75 6c 74 3a 0a 09 20 20 20 20 2f 2a default:.. /*
3090: 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 64 The operation d
30a0: 69 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 id not complete
30b0: 61 6e 64 20 73 68 6f 75 6c 64 20 62 65 20 72 65 and should be re
30c0: 74 72 69 65 64 20 6c 61 74 65 72 2e 20 2a 2f 0a tried later. */.
30d0: 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 4f 70 . dprintf("Op
30e0: 65 72 61 74 69 6f 6e 20 64 69 64 20 6e 6f 74 20 eration did not
30f0: 63 6f 6d 70 6c 65 74 65 2c 20 63 61 6c 6c 20 66 complete, call f
3100: 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 20 6c 61 unction again la
3110: 74 65 72 22 29 3b 0a 09 20 20 20 20 2a 65 72 72 ter");.. *err
3120: 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 41 47 41 orCodePtr = EAGA
3130: 49 4e 3b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 IN;.. dprintf
3140: 28 22 45 52 52 28 4f 74 68 65 72 2c 20 45 41 47 ("ERR(Other, EAG
3150: 41 49 4e 29 22 29 3b 0a 09 20 20 20 20 72 65 74 AIN)");.. ret
3160: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 urn 0;. }..
3170: 20 20 64 70 72 69 6e 74 66 28 22 52 65 6d 6f 76 dprintf("Remov
3180: 69 6e 67 20 74 68 65 20 5c 22 54 4c 53 5f 54 43 ing the \"TLS_TC
3190: 4c 5f 49 4e 49 54 5c 22 20 66 6c 61 67 20 73 69 L_INIT\" flag si
31a0: 6e 63 65 20 77 65 20 68 61 76 65 20 63 6f 6d 70 nce we have comp
31b0: 6c 65 74 65 64 20 74 68 65 20 68 61 6e 64 73 68 leted the handsh
31c0: 61 6b 65 22 29 3b 0a 20 20 20 20 73 74 61 74 65 ake");. state
31d0: 50 74 72 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 54 Ptr->flags &= ~T
31e0: 4c 53 5f 54 43 4c 5f 49 4e 49 54 3b 0a 0a 20 20 LS_TCL_INIT;..
31f0: 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 dprintf("Retur
3200: 6e 69 6e 67 20 73 75 63 63 65 73 73 22 29 3b 0a ning success");.
3210: 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 *errorCodePt
3220: 72 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 r = 0;. retur
3230: 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d n 1;.}../*. *---
3240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
3290: 20 54 6c 73 49 6e 70 75 74 50 72 6f 63 20 2d 2d TlsInputProc --
32a0: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 . *. *.This proc
32b0: 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 edure is invoked
32c0: 20 62 79 20 74 68 65 20 67 65 6e 65 72 69 63 20 by the generic
32d0: 49 2f 4f 20 6c 61 79 65 72 20 74 6f 20 72 65 61 I/O layer to rea
32e0: 64 20 64 61 74 61 20 66 72 6f 6d 0a 20 2a 09 74 d data from. *.t
32f0: 68 65 20 42 49 4f 20 77 68 65 6e 65 76 65 72 20 he BIO whenever
3300: 74 68 65 20 54 63 6c 5f 52 65 61 64 28 29 2c 20 the Tcl_Read(),
3310: 54 63 6c 5f 52 65 61 64 43 68 61 72 73 2c 20 54 Tcl_ReadChars, T
3320: 63 6c 5f 47 65 74 73 2c 20 61 6e 64 0a 20 2a 09 cl_Gets, and. *.
3330: 54 63 6c 5f 47 65 74 73 4f 62 6a 20 66 75 6e 63 Tcl_GetsObj func
3340: 74 69 6f 6e 73 20 61 72 65 20 75 73 65 64 2e 20 tions are used.
3350: 45 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 53 53 Equivalent to SS
3360: 4c 5f 72 65 61 64 5f 65 78 20 61 6e 64 20 53 53 L_read_ex and SS
3370: 4c 5f 72 65 61 64 2e 0a 20 2a 0a 20 2a 20 52 65 L_read.. *. * Re
3380: 73 75 6c 74 73 3a 0a 20 2a 09 52 65 74 75 72 6e sults:. *.Return
3390: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 s the number of
33a0: 62 79 74 65 73 20 72 65 61 64 20 6f 72 20 2d 31 bytes read or -1
33b0: 20 6f 6e 20 65 72 72 6f 72 2e 20 53 65 74 73 20 on error. Sets
33c0: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 74 6f 0a errorCodePtr to.
33d0: 20 2a 09 61 20 50 4f 53 49 58 20 65 72 72 6f 72 *.a POSIX error
33e0: 20 63 6f 64 65 20 69 66 20 61 6e 20 65 72 72 6f code if an erro
33f0: 72 20 6f 63 63 75 72 72 65 64 2c 20 6f 72 20 30 r occurred, or 0
3400: 20 69 66 20 6e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 if none.. *. *
3410: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
3420: 09 52 65 61 64 73 20 69 6e 70 75 74 20 66 72 6f .Reads input fro
3430: 6d 20 74 68 65 20 69 6e 70 75 74 20 64 65 76 69 m the input devi
3440: 63 65 20 6f 66 20 74 68 65 20 63 68 61 6e 6e 65 ce of the channe
3450: 6c 2e 0a 20 2a 0a 20 2a 20 44 61 74 61 20 69 73 l.. *. * Data is
3460: 20 72 65 63 65 69 76 65 64 20 69 6e 20 77 68 6f received in who
3470: 6c 65 20 62 6c 6f 63 6b 73 20 6b 6e 6f 77 6e 20 le blocks known
3480: 61 73 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 as records from
3490: 74 68 65 20 70 65 65 72 2e 20 41 20 77 68 6f 6c the peer. A whol
34a0: 65 0a 20 2a 20 72 65 63 6f 72 64 20 69 73 20 70 e. * record is p
34b0: 72 6f 63 65 73 73 65 64 20 28 65 2e 67 2e 20 64 rocessed (e.g. d
34c0: 65 63 72 79 70 74 65 64 29 20 69 6e 20 6f 6e 65 ecrypted) in one
34d0: 20 67 6f 20 61 6e 64 20 69 73 20 62 75 66 66 65 go and is buffe
34e0: 72 65 64 20 62 79 20 4f 70 65 6e 53 53 4c 0a 20 red by OpenSSL.
34f0: 2a 20 75 6e 74 69 6c 20 69 74 20 69 73 20 72 65 * until it is re
3500: 61 64 20 62 79 20 74 68 65 20 61 70 70 6c 69 63 ad by the applic
3510: 61 74 69 6f 6e 20 76 69 61 20 61 20 63 61 6c 6c ation via a call
3520: 20 74 6f 20 53 53 4c 5f 72 65 61 64 2e 0a 20 2a to SSL_read.. *
3530: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
3540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3580: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 . */.static int
3590: 54 6c 73 49 6e 70 75 74 50 72 6f 63 28 0a 20 20 TlsInputProc(.
35a0: 20 20 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 ClientData ins
35b0: 74 61 6e 63 65 44 61 74 61 2c 09 2f 2a 20 43 6f tanceData,./* Co
35c0: 6e 6e 65 63 74 69 6f 6e 20 73 74 61 74 65 20 69 nnection state i
35d0: 6e 66 6f 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 nfo */. char
35e0: 2a 62 75 66 2c 09 09 09 2f 2a 20 42 75 66 66 65 *buf,.../* Buffe
35f0: 72 20 74 6f 20 73 74 6f 72 65 20 64 61 74 61 20 r to store data
3600: 72 65 61 64 20 66 72 6f 6d 20 42 49 4f 20 2a 2f read from BIO */
3610: 0a 20 20 20 20 69 6e 74 20 62 75 66 53 69 7a 65 . int bufSize
3620: 2c 09 09 2f 2a 20 42 75 66 66 65 72 20 73 69 7a ,../* Buffer siz
3630: 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 e in bytes */.
3640: 20 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 int *errorCode
3650: 50 74 72 29 09 09 2f 2a 20 53 74 6f 72 61 67 65 Ptr)../* Storage
3660: 20 66 6f 72 20 65 72 72 6f 72 20 63 6f 64 65 20 for error code
3670: 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 7b 0a 20 to return */.{.
3680: 20 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 unsigned long
3690: 20 62 61 63 6b 69 6e 67 45 72 72 6f 72 3b 0a 20 backingError;.
36a0: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 State *stateP
36b0: 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 20 69 tr = (State *) i
36c0: 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 20 20 20 nstanceData;.
36d0: 20 69 6e 74 20 62 79 74 65 73 52 65 61 64 2c 20 int bytesRead,
36e0: 65 72 72 3b 0a 20 20 20 20 2a 65 72 72 6f 72 43 err;. *errorC
36f0: 6f 64 65 50 74 72 20 3d 20 30 3b 0a 0a 20 20 20 odePtr = 0;..
3700: 20 64 70 72 69 6e 74 66 28 22 52 65 61 64 28 25 dprintf("Read(%
3710: 64 29 22 2c 20 62 75 66 53 69 7a 65 29 3b 0a 0a d)", bufSize);..
3720: 20 20 20 20 2f 2a 20 41 62 6f 72 74 20 69 66 20 /* Abort if
3730: 74 68 65 20 75 73 65 72 20 76 65 72 69 66 79 20 the user verify
3740: 63 61 6c 6c 62 61 63 6b 20 69 73 20 73 74 69 6c callback is stil
3750: 6c 20 72 75 6e 6e 69 6e 67 20 74 6f 20 61 76 6f l running to avo
3760: 69 64 20 74 72 69 67 67 65 72 69 6e 67 0a 20 20 id triggering.
3770: 20 20 20 2a 20 61 6e 6f 74 68 65 72 20 63 61 6c * another cal
3780: 6c 20 62 65 66 6f 72 65 20 74 68 65 20 63 75 72 l before the cur
3790: 72 65 6e 74 20 6f 6e 65 20 69 73 20 63 6f 6d 70 rent one is comp
37a0: 6c 65 74 65 2e 20 2a 2f 0a 20 20 20 20 69 66 20 lete. */. if
37b0: 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 (statePtr->flags
37c0: 20 26 20 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 & TLS_TCL_CALLB
37d0: 41 43 4b 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 ACK) {..dprintf(
37e0: 22 43 61 6c 6c 62 61 63 6b 20 69 73 20 72 75 6e "Callback is run
37f0: 6e 69 6e 67 2c 20 72 65 61 64 69 6e 67 20 30 20 ning, reading 0
3800: 62 79 74 65 73 22 29 3b 0a 09 72 65 74 75 72 6e bytes");..return
3810: 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 0;. }.. /
3820: 2a 20 49 66 20 6e 6f 74 20 69 6e 69 74 69 61 6c * If not initial
3830: 69 7a 65 64 2c 20 64 6f 20 63 6f 6e 6e 65 63 74 ized, do connect
3840: 20 2a 2f 0a 20 20 20 20 2f 2a 20 43 61 6e 20 61 */. /* Can a
3850: 6c 73 6f 20 63 68 65 63 6b 20 53 53 4c 5f 69 73 lso check SSL_is
3860: 5f 69 6e 69 74 5f 66 69 6e 69 73 68 65 64 28 73 _init_finished(s
3870: 73 6c 29 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 sl) */. if (s
3880: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 tatePtr->flags &
3890: 20 54 4c 53 5f 54 43 4c 5f 49 4e 49 54 29 20 7b TLS_TCL_INIT) {
38a0: 0a 09 69 6e 74 20 74 6c 73 43 6f 6e 6e 65 63 74 ..int tlsConnect
38b0: 3b 0a 0a 09 64 70 72 69 6e 74 66 28 22 43 61 6c ;...dprintf("Cal
38c0: 6c 69 6e 67 20 54 6c 73 5f 57 61 69 74 46 6f 72 ling Tls_WaitFor
38d0: 43 6f 6e 6e 65 63 74 22 29 3b 0a 0a 09 74 6c 73 Connect");...tls
38e0: 43 6f 6e 6e 65 63 74 20 3d 20 54 6c 73 5f 57 61 Connect = Tls_Wa
38f0: 69 74 46 6f 72 43 6f 6e 6e 65 63 74 28 73 74 61 itForConnect(sta
3900: 74 65 50 74 72 2c 20 65 72 72 6f 72 43 6f 64 65 tePtr, errorCode
3910: 50 74 72 2c 20 30 29 3b 0a 09 69 66 20 28 74 6c Ptr, 0);..if (tl
3920: 73 43 6f 6e 6e 65 63 74 20 3c 20 30 29 20 7b 0a sConnect < 0) {.
3930: 09 20 20 20 20 2f 2a 20 46 61 69 6c 75 72 65 2c . /* Failure,
3940: 20 73 6f 20 61 62 6f 72 74 20 2a 2f 0a 09 20 20 so abort */..
3950: 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20 61 dprintf("Got a
3960: 6e 20 65 72 72 6f 72 20 77 61 69 74 69 6e 67 20 n error waiting
3970: 74 6f 20 63 6f 6e 6e 65 63 74 20 28 74 6c 73 43 to connect (tlsC
3980: 6f 6e 6e 65 63 74 20 3d 20 25 69 2c 20 2a 65 72 onnect = %i, *er
3990: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 25 69 29 rorCodePtr = %i)
39a0: 22 2c 20 74 6c 73 43 6f 6e 6e 65 63 74 2c 20 2a ", tlsConnect, *
39b0: 65 72 72 6f 72 43 6f 64 65 50 74 72 29 3b 0a 0a errorCodePtr);..
39c0: 09 20 20 20 20 62 79 74 65 73 52 65 61 64 20 3d . bytesRead =
39d0: 20 2d 31 3b 0a 09 20 20 20 20 69 66 20 28 2a 65 -1;.. if (*e
39e0: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 3d 20 45 rrorCodePtr == E
39f0: 43 4f 4e 4e 52 45 53 45 54 29 20 7b 0a 09 09 64 CONNRESET) {...d
3a00: 70 72 69 6e 74 66 28 22 47 6f 74 20 63 6f 6e 6e printf("Got conn
3a10: 65 63 74 69 6f 6e 20 72 65 73 65 74 22 29 3b 0a ection reset");.
3a20: 09 09 2f 2a 20 53 6f 66 74 20 45 4f 46 20 2a 2f ../* Soft EOF */
3a30: 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 ...*errorCodePtr
3a40: 20 3d 20 30 3b 0a 09 09 62 79 74 65 73 52 65 61 = 0;...bytesRea
3a50: 64 20 3d 20 30 3b 0a 09 20 20 20 20 7d 0a 09 20 d = 0;.. }..
3a60: 20 20 20 72 65 74 75 72 6e 20 62 79 74 65 73 52 return bytesR
3a70: 65 61 64 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 ead;..} else if
3a80: 28 74 6c 73 43 6f 6e 6e 65 63 74 20 3d 3d 20 30 (tlsConnect == 0
3a90: 29 20 7b 0a 09 20 20 20 20 2f 2a 20 54 72 79 20 ) {.. /* Try
3aa0: 61 67 61 69 6e 20 2a 2f 0a 09 20 20 20 20 62 79 again */.. by
3ab0: 74 65 73 52 65 61 64 20 3d 20 2d 31 3b 0a 09 20 tesRead = -1;..
3ac0: 20 20 20 72 65 74 75 72 6e 20 62 79 74 65 73 52 return bytesR
3ad0: 65 61 64 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 ead;..}. }..
3ae0: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 57 65 20 /*. * We
3af0: 6e 65 65 64 20 74 6f 20 63 6c 65 61 72 20 74 68 need to clear th
3b00: 65 20 53 53 4c 20 65 72 72 6f 72 20 73 74 61 63 e SSL error stac
3b10: 6b 20 6e 6f 77 20 62 65 63 61 75 73 65 20 77 65 k now because we
3b20: 20 73 6f 6d 65 74 69 6d 65 73 20 72 65 61 63 68 sometimes reach
3b30: 0a 20 20 20 20 20 2a 20 74 68 69 73 20 66 75 6e . * this fun
3b40: 63 74 69 6f 6e 20 77 69 74 68 20 6c 65 66 74 6f ction with lefto
3b50: 76 65 72 20 65 72 72 6f 72 73 20 69 6e 20 74 68 ver errors in th
3b60: 65 20 73 74 61 63 6b 2e 20 20 49 66 20 42 49 4f e stack. If BIO
3b70: 5f 72 65 61 64 0a 20 20 20 20 20 2a 20 72 65 74 _read. * ret
3b80: 75 72 6e 73 20 2d 31 20 61 6e 64 20 69 6e 74 65 urns -1 and inte
3b90: 6e 64 73 20 45 41 47 41 49 4e 2c 20 74 68 65 72 nds EAGAIN, ther
3ba0: 65 20 69 73 20 61 20 6c 65 66 74 6f 76 65 72 20 e is a leftover
3bb0: 65 72 72 6f 72 2c 20 69 74 20 77 69 6c 6c 20 62 error, it will b
3bc0: 65 0a 20 20 20 20 20 2a 20 6d 69 73 63 6f 6e 73 e. * miscons
3bd0: 74 72 75 65 64 20 61 73 20 61 6e 20 65 72 72 6f trued as an erro
3be0: 72 2c 20 6e 6f 74 20 45 41 47 41 49 4e 2e 0a 20 r, not EAGAIN..
3bf0: 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 41 6c 74 *. * Alt
3c00: 65 72 6e 61 74 69 76 65 6c 79 2c 20 77 65 20 6d ernatively, we m
3c10: 61 79 20 77 61 6e 74 20 74 6f 20 68 61 6e 64 6c ay want to handl
3c20: 65 20 74 68 65 20 3c 30 20 72 65 74 75 72 6e 20 e the <0 return
3c30: 63 6f 64 65 73 20 66 72 6f 6d 0a 20 20 20 20 20 codes from.
3c40: 2a 20 42 49 4f 5f 72 65 61 64 20 73 70 65 63 69 * BIO_read speci
3c50: 61 6c 6c 79 20 28 61 73 20 61 64 76 69 73 65 64 ally (as advised
3c60: 20 69 6e 20 74 68 65 20 52 53 41 20 64 6f 63 73 in the RSA docs
3c70: 29 2e 20 20 54 4c 53 27 73 20 6c 6f 77 65 72 20 ). TLS's lower
3c80: 6c 65 76 65 6c 20 42 49 4f 0a 20 20 20 20 20 2a level BIO. *
3c90: 20 66 75 6e 63 74 69 6f 6e 73 20 70 6c 61 79 20 functions play
3ca0: 77 69 74 68 20 74 68 65 20 72 65 74 72 79 20 66 with the retry f
3cb0: 6c 61 67 73 20 74 68 6f 75 67 68 2c 20 61 6e 64 lags though, and
3cc0: 20 74 68 69 73 20 73 65 65 6d 73 20 74 6f 20 77 this seems to w
3cd0: 6f 72 6b 0a 20 20 20 20 20 2a 20 63 6f 72 72 65 ork. * corre
3ce0: 63 74 6c 79 2e 20 20 53 69 6d 69 6c 61 72 20 66 ctly. Similar f
3cf0: 69 78 20 69 6e 20 54 6c 73 4f 75 74 70 75 74 50 ix in TlsOutputP
3d00: 72 6f 63 2e 20 2d 20 68 6f 62 62 73 0a 20 20 20 roc. - hobbs.
3d10: 20 20 2a 2f 0a 20 20 20 20 45 52 52 5f 63 6c 65 */. ERR_cle
3d20: 61 72 5f 65 72 72 6f 72 28 29 3b 0a 20 20 20 20 ar_error();.
3d30: 42 49 4f 5f 63 6c 65 61 72 5f 72 65 74 72 79 5f BIO_clear_retry_
3d40: 66 6c 61 67 73 28 73 74 61 74 65 50 74 72 2d 3e flags(statePtr->
3d50: 62 69 6f 29 3b 0a 20 20 20 20 62 79 74 65 73 52 bio);. bytesR
3d60: 65 61 64 20 3d 20 42 49 4f 5f 72 65 61 64 28 73 ead = BIO_read(s
3d70: 74 61 74 65 50 74 72 2d 3e 62 69 6f 2c 20 62 75 tatePtr->bio, bu
3d80: 66 2c 20 62 75 66 53 69 7a 65 29 3b 0a 20 20 20 f, bufSize);.
3d90: 20 64 70 72 69 6e 74 66 28 22 42 49 4f 5f 72 65 dprintf("BIO_re
3da0: 61 64 20 2d 3e 20 25 64 22 2c 20 62 79 74 65 73 ad -> %d", bytes
3db0: 52 65 61 64 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 Read);.. /* S
3dc0: 61 6d 65 20 61 73 20 53 53 4c 5f 77 61 6e 74 2c ame as SSL_want,
3dd0: 20 62 75 74 20 61 6c 73 6f 20 63 68 65 63 6b 73 but also checks
3de0: 20 74 68 65 20 65 72 72 6f 72 20 71 75 65 75 65 the error queue
3df0: 20 2a 2f 0a 20 20 20 20 65 72 72 20 3d 20 53 53 */. err = SS
3e00: 4c 5f 67 65 74 5f 65 72 72 6f 72 28 73 74 61 74 L_get_error(stat
3e10: 65 50 74 72 2d 3e 73 73 6c 2c 20 62 79 74 65 73 ePtr->ssl, bytes
3e20: 52 65 61 64 29 3b 0a 20 20 20 20 62 61 63 6b 69 Read);. backi
3e30: 6e 67 45 72 72 6f 72 20 3d 20 45 52 52 5f 67 65 ngError = ERR_ge
3e40: 74 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 t_error();..
3e50: 69 66 20 28 62 79 74 65 73 52 65 61 64 20 3c 3d if (bytesRead <=
3e60: 20 30 29 20 7b 0a 09 2f 2a 20 54 68 65 20 72 65 0) {../* The re
3e70: 74 72 79 20 66 6c 61 67 20 69 73 20 73 65 74 20 try flag is set
3e80: 62 79 20 74 68 65 20 42 49 4f 5f 73 65 74 5f 72 by the BIO_set_r
3e90: 65 74 72 79 5f 2a 20 66 75 6e 63 74 69 6f 6e 73 etry_* functions
3ea0: 20 2a 2f 0a 09 69 66 20 28 42 49 4f 5f 73 68 6f */..if (BIO_sho
3eb0: 75 6c 64 5f 72 65 74 72 79 28 73 74 61 74 65 50 uld_retry(stateP
3ec0: 74 72 2d 3e 62 69 6f 29 29 20 7b 0a 09 20 20 20 tr->bio)) {..
3ed0: 20 64 70 72 69 6e 74 66 28 22 52 65 61 64 20 66 dprintf("Read f
3ee0: 61 69 6c 65 64 20 77 69 74 68 20 63 6f 64 65 3d ailed with code=
3ef0: 25 64 2c 20 62 79 74 65 73 20 72 65 61 64 3d 25 %d, bytes read=%
3f00: 64 3a 20 73 68 6f 75 6c 64 20 72 65 74 72 79 22 d: should retry"
3f10: 2c 20 65 72 72 2c 20 62 79 74 65 73 52 65 61 64 , err, bytesRead
3f20: 29 3b 0a 09 20 20 20 20 2f 2a 20 53 6f 6d 65 20 );.. /* Some
3f30: 64 6f 63 73 20 69 6d 70 6c 79 20 77 65 20 73 68 docs imply we sh
3f40: 6f 75 6c 64 20 72 65 64 6f 20 74 68 65 20 42 49 ould redo the BI
3f50: 4f 5f 72 65 61 64 20 6e 6f 77 20 2a 2f 0a 09 7d O_read now */..}
3f60: 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 64 70 72 else {.. dpr
3f70: 69 6e 74 66 28 22 52 65 61 64 20 66 61 69 6c 65 intf("Read faile
3f80: 64 20 77 69 74 68 20 63 6f 64 65 3d 25 64 2c 20 d with code=%d,
3f90: 62 79 74 65 73 20 72 65 61 64 3d 25 64 3a 20 65 bytes read=%d: e
3fa0: 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 22 2c rror condition",
3fb0: 20 65 72 72 2c 20 62 79 74 65 73 52 65 61 64 29 err, bytesRead)
3fc0: 3b 0a 09 7d 0a 0a 09 64 70 72 69 6e 74 66 28 22 ;..}...dprintf("
3fd0: 42 49 4f 20 69 73 20 45 4f 46 20 25 64 22 2c 20 BIO is EOF %d",
3fe0: 42 49 4f 5f 65 6f 66 28 73 74 61 74 65 50 74 72 BIO_eof(statePtr
3ff0: 2d 3e 62 69 6f 29 29 3b 0a 0a 09 2f 2a 20 54 68 ->bio));.../* Th
4000: 65 73 65 20 61 72 65 20 74 68 65 20 73 61 6d 65 ese are the same
4010: 20 61 73 20 42 49 4f 5f 72 65 74 72 79 5f 74 79 as BIO_retry_ty
4020: 70 65 20 2a 2f 0a 09 69 66 20 28 42 49 4f 5f 73 pe */..if (BIO_s
4030: 68 6f 75 6c 64 5f 72 65 61 64 28 73 74 61 74 65 hould_read(state
4040: 50 74 72 2d 3e 62 69 6f 29 29 20 7b 0a 09 20 20 Ptr->bio)) {..
4050: 20 20 64 70 72 69 6e 74 66 28 22 42 49 4f 20 68 dprintf("BIO h
4060: 61 73 20 69 6e 73 75 66 66 69 63 69 65 6e 74 20 as insufficient
4070: 64 61 74 61 20 74 6f 20 72 65 61 64 20 61 6e 64 data to read and
4080: 20 72 65 74 75 72 6e 22 29 3b 0a 09 20 20 20 20 return");..
4090: 73 74 61 74 65 50 74 72 2d 3e 77 61 6e 74 20 7c statePtr->want |
40a0: 3d 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 3b 0a = TCL_READABLE;.
40b0: 09 7d 0a 09 69 66 20 28 42 49 4f 5f 73 68 6f 75 .}..if (BIO_shou
40c0: 6c 64 5f 77 72 69 74 65 28 73 74 61 74 65 50 74 ld_write(statePt
40d0: 72 2d 3e 62 69 6f 29 29 20 7b 0a 09 20 20 20 20 r->bio)) {..
40e0: 64 70 72 69 6e 74 66 28 22 42 49 4f 20 68 61 73 dprintf("BIO has
40f0: 20 70 65 6e 64 69 6e 67 20 64 61 74 61 20 74 6f pending data to
4100: 20 77 72 69 74 65 22 29 3b 0a 09 20 20 20 20 73 write");.. s
4110: 74 61 74 65 50 74 72 2d 3e 77 61 6e 74 20 7c 3d tatePtr->want |=
4120: 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 3b 0a 09 TCL_WRITABLE;..
4130: 7d 0a 09 69 66 20 28 42 49 4f 5f 73 68 6f 75 6c }..if (BIO_shoul
4140: 64 5f 69 6f 5f 73 70 65 63 69 61 6c 28 73 74 61 d_io_special(sta
4150: 74 65 50 74 72 2d 3e 62 69 6f 29 29 20 7b 0a 09 tePtr->bio)) {..
4160: 20 20 20 20 69 6e 74 20 72 65 61 73 6f 6e 20 3d int reason =
4170: 20 42 49 4f 5f 67 65 74 5f 72 65 74 72 79 5f 72 BIO_get_retry_r
4180: 65 61 73 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e eason(statePtr->
4190: 62 69 6f 29 3b 0a 09 20 20 20 20 64 70 72 69 6e bio);.. dprin
41a0: 74 66 28 22 42 49 4f 20 68 61 73 20 73 6f 6d 65 tf("BIO has some
41b0: 20 73 70 65 63 69 61 6c 20 63 6f 6e 64 69 74 69 special conditi
41c0: 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 72 65 on other than re
41d0: 61 64 20 6f 72 20 77 72 69 74 65 3a 20 63 6f 64 ad or write: cod
41e0: 65 3d 25 64 22 2c 20 72 65 61 73 6f 6e 29 3b 0a e=%d", reason);.
41f0: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 77 .}. }.. sw
4200: 69 74 63 68 20 28 65 72 72 29 20 7b 0a 09 63 61 itch (err) {..ca
4210: 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 4e 4f 4e se SSL_ERROR_NON
4220: 45 3a 0a 09 20 20 20 20 2f 2a 20 49 2f 4f 20 6f E:.. /* I/O o
4230: 70 65 72 61 74 69 6f 6e 20 63 6f 6d 70 6c 65 74 peration complet
4240: 65 64 20 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e ed */.. dprin
4250: 74 66 28 22 53 53 4c 5f 45 52 52 4f 52 5f 4e 4f tf("SSL_ERROR_NO
4260: 4e 45 22 29 3b 0a 09 20 20 20 20 64 70 72 69 6e NE");.. dprin
4270: 74 42 75 66 66 65 72 28 62 75 66 2c 20 62 79 74 tBuffer(buf, byt
4280: 65 73 52 65 61 64 29 3b 0a 09 20 20 20 20 62 72 esRead);.. br
4290: 65 61 6b 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f eak;...case SSL_
42a0: 45 52 52 4f 52 5f 53 53 4c 3a 0a 09 20 20 20 20 ERROR_SSL:..
42b0: 2f 2a 20 41 20 6e 6f 6e 2d 72 65 63 6f 76 65 72 /* A non-recover
42c0: 61 62 6c 65 2c 20 66 61 74 61 6c 20 65 72 72 6f able, fatal erro
42d0: 72 20 69 6e 20 74 68 65 20 53 53 4c 20 6c 69 62 r in the SSL lib
42e0: 72 61 72 79 20 6f 63 63 75 72 72 65 64 2c 0a 09 rary occurred,..
42f0: 20 20 20 20 20 20 20 75 73 75 61 6c 6c 79 20 61 usually a
4300: 20 70 72 6f 74 6f 63 6f 6c 20 65 72 72 6f 72 2e protocol error.
4310: 20 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e 74 66 */.. dprintf
4320: 28 22 53 53 4c 5f 45 52 52 4f 52 5f 53 53 4c 3a ("SSL_ERROR_SSL:
4330: 20 46 61 74 61 6c 20 53 53 4c 20 70 72 6f 74 6f Fatal SSL proto
4340: 63 6f 6c 20 65 72 72 6f 72 20 6f 63 63 75 72 72 col error occurr
4350: 65 64 22 29 3b 0a 09 20 20 20 20 69 66 20 28 62 ed");.. if (b
4360: 61 63 6b 69 6e 67 45 72 72 6f 72 20 21 3d 20 30 ackingError != 0
4370: 29 20 7b 0a 09 09 54 6c 73 5f 45 72 72 6f 72 28 ) {...Tls_Error(
4380: 73 74 61 74 65 50 74 72 2c 20 45 52 52 5f 72 65 statePtr, ERR_re
4390: 61 73 6f 6e 5f 65 72 72 6f 72 5f 73 74 72 69 6e ason_error_strin
43a0: 67 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 29 29 g(backingError))
43b0: 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 ;.. } else if
43c0: 20 28 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 (SSL_get_verify
43d0: 5f 72 65 73 75 6c 74 28 73 74 61 74 65 50 74 72 _result(statePtr
43e0: 2d 3e 73 73 6c 29 20 21 3d 20 58 35 30 39 5f 56 ->ssl) != X509_V
43f0: 5f 4f 4b 29 20 7b 0a 09 09 54 6c 73 5f 45 72 72 _OK) {...Tls_Err
4400: 6f 72 28 73 74 61 74 65 50 74 72 2c 0a 09 09 20 or(statePtr,...
4410: 20 20 20 58 35 30 39 5f 76 65 72 69 66 79 5f 63 X509_verify_c
4420: 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 ert_error_string
4430: 28 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f (SSL_get_verify_
4440: 72 65 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d result(statePtr-
4450: 3e 73 73 6c 29 29 29 3b 0a 09 20 20 20 20 7d 20 >ssl)));.. }
4460: 65 6c 73 65 20 7b 0a 09 09 54 6c 73 5f 45 72 72 else {...Tls_Err
4470: 6f 72 28 73 74 61 74 65 50 74 72 2c 20 22 55 6e or(statePtr, "Un
4480: 6b 6e 6f 77 6e 20 53 53 4c 20 65 72 72 6f 72 22 known SSL error"
4490: 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 2a );.. }.. *
44a0: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 errorCodePtr = E
44b0: 43 4f 4e 4e 41 42 4f 52 54 45 44 3b 0a 09 20 20 CONNABORTED;..
44c0: 20 20 62 79 74 65 73 52 65 61 64 20 3d 20 2d 31 bytesRead = -1
44d0: 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 ;..#if OPENSSL_V
44e0: 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d ERSION_NUMBER >=
44f0: 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 20 20 0x30000000L..
4500: 20 20 2f 2a 20 55 6e 65 78 70 65 63 74 65 64 20 /* Unexpected
4510: 45 4f 46 20 66 72 6f 6d 20 74 68 65 20 70 65 65 EOF from the pee
4520: 72 20 66 6f 72 20 4f 70 65 6e 53 53 4c 20 33 2e r for OpenSSL 3.
4530: 30 2b 20 2a 2f 0a 09 20 20 20 20 69 66 20 28 45 0+ */.. if (E
4540: 52 52 5f 47 45 54 5f 52 45 41 53 4f 4e 28 62 61 RR_GET_REASON(ba
4550: 63 6b 69 6e 67 45 72 72 6f 72 29 20 3d 3d 20 53 ckingError) == S
4560: 53 4c 5f 52 5f 55 4e 45 58 50 45 43 54 45 44 5f SL_R_UNEXPECTED_
4570: 45 4f 46 5f 57 48 49 4c 45 5f 52 45 41 44 49 4e EOF_WHILE_READIN
4580: 47 29 20 7b 0a 09 09 64 70 72 69 6e 74 66 28 22 G) {...dprintf("
4590: 28 55 6e 65 78 70 65 63 74 65 64 29 20 45 4f 46 (Unexpected) EOF
45a0: 20 72 65 61 63 68 65 64 22 29 0a 09 09 2a 65 72 reached")...*er
45b0: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a rorCodePtr = 0;.
45c0: 09 09 62 79 74 65 73 52 65 61 64 20 3d 20 30 3b ..bytesRead = 0;
45d0: 0a 09 09 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 ...Tls_Error(sta
45e0: 74 65 50 74 72 2c 20 22 45 4f 46 20 72 65 61 63 tePtr, "EOF reac
45f0: 68 65 64 22 29 3b 0a 09 20 20 20 20 7d 0a 23 65 hed");.. }.#e
4600: 6e 64 69 66 0a 09 20 20 20 20 62 72 65 61 6b 3b ndif.. break;
4610: 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f ...case SSL_ERRO
4620: 52 5f 57 41 4e 54 5f 52 45 41 44 3a 0a 09 20 20 R_WANT_READ:..
4630: 20 20 2f 2a 20 4f 70 65 72 61 74 69 6f 6e 20 64 /* Operation d
4640: 69 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 id not complete
4650: 64 75 65 20 74 6f 20 6e 6f 74 20 65 6e 6f 75 67 due to not enoug
4660: 68 20 64 61 74 61 20 77 61 73 20 61 76 61 69 6c h data was avail
4670: 61 62 6c 65 2e 0a 09 20 20 20 20 20 20 20 52 65 able... Re
4680: 74 72 79 20 61 67 61 69 6e 20 6c 61 74 65 72 2e try again later.
4690: 20 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e 74 66 */.. dprintf
46a0: 28 22 47 6f 74 20 53 53 4c 5f 45 52 52 4f 52 5f ("Got SSL_ERROR_
46b0: 57 41 4e 54 5f 52 45 41 44 2c 20 6d 61 70 70 69 WANT_READ, mappi
46c0: 6e 67 20 74 68 69 73 20 74 6f 20 45 41 47 41 49 ng this to EAGAI
46d0: 4e 22 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 N");.. *error
46e0: 43 6f 64 65 50 74 72 20 3d 20 45 41 47 41 49 4e CodePtr = EAGAIN
46f0: 3b 0a 09 20 20 20 20 62 79 74 65 73 52 65 61 64 ;.. bytesRead
4700: 20 3d 20 2d 31 3b 0a 09 20 20 20 20 73 74 61 74 = -1;.. stat
4710: 65 50 74 72 2d 3e 77 61 6e 74 20 7c 3d 20 54 43 ePtr->want |= TC
4720: 4c 5f 52 45 41 44 41 42 4c 45 3b 0a 09 20 20 20 L_READABLE;..
4730: 20 42 49 4f 5f 73 65 74 5f 72 65 74 72 79 5f 72 BIO_set_retry_r
4740: 65 61 64 28 73 74 61 74 65 50 74 72 2d 3e 62 69 ead(statePtr->bi
4750: 6f 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a o);.. break;.
4760: 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 ..case SSL_ERROR
4770: 5f 57 41 4e 54 5f 57 52 49 54 45 3a 0a 09 20 20 _WANT_WRITE:..
4780: 20 20 2f 2a 20 4f 70 65 72 61 74 69 6f 6e 20 64 /* Operation d
4790: 69 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 id not complete
47a0: 64 75 65 20 74 6f 20 75 6e 61 62 6c 65 20 74 6f due to unable to
47b0: 20 73 65 6e 64 20 61 6c 6c 20 64 61 74 61 20 74 send all data t
47c0: 6f 20 74 68 65 0a 09 20 20 20 20 20 20 20 42 49 o the.. BI
47d0: 4f 2e 20 52 65 74 72 79 20 61 67 61 69 6e 20 6c O. Retry again l
47e0: 61 74 65 72 2e 20 2a 2f 0a 09 20 20 20 20 64 70 ater. */.. dp
47f0: 72 69 6e 74 66 28 22 47 6f 74 20 53 53 4c 5f 45 rintf("Got SSL_E
4800: 52 52 4f 52 5f 57 41 4e 54 5f 57 52 49 54 45 2c RROR_WANT_WRITE,
4810: 20 6d 61 70 70 69 6e 67 20 74 68 69 73 20 74 6f mapping this to
4820: 20 45 41 47 41 49 4e 22 29 3b 0a 09 20 20 20 20 EAGAIN");..
4830: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 *errorCodePtr =
4840: 45 41 47 41 49 4e 3b 0a 09 20 20 20 20 62 79 74 EAGAIN;.. byt
4850: 65 73 52 65 61 64 20 3d 20 2d 31 3b 0a 09 20 20 esRead = -1;..
4860: 20 20 73 74 61 74 65 50 74 72 2d 3e 77 61 6e 74 statePtr->want
4870: 20 7c 3d 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 |= TCL_WRITABLE
4880: 3b 0a 09 20 20 20 20 42 49 4f 5f 73 65 74 5f 72 ;.. BIO_set_r
4890: 65 74 72 79 5f 77 72 69 74 65 28 73 74 61 74 65 etry_write(state
48a0: 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 20 20 20 20 Ptr->bio);..
48b0: 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20 53 53 break;...case SS
48c0: 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 58 35 30 L_ERROR_WANT_X50
48d0: 39 5f 4c 4f 4f 4b 55 50 3a 0a 09 20 20 20 20 2f 9_LOOKUP:.. /
48e0: 2a 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 * The operation
48f0: 64 69 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 did not complete
4900: 20 62 65 63 61 75 73 65 20 61 6e 20 61 70 70 6c because an appl
4910: 69 63 61 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b ication callback
4920: 0a 09 20 20 20 20 20 20 20 73 65 74 20 62 79 20 .. set by
4930: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 SSL_CTX_set_clie
4940: 6e 74 5f 63 65 72 74 5f 63 62 28 29 20 68 61 73 nt_cert_cb() has
4950: 20 61 73 6b 65 64 20 74 6f 20 62 65 20 63 61 6c asked to be cal
4960: 6c 65 64 20 61 67 61 69 6e 2e 20 2a 2f 0a 09 20 led again. */..
4970: 20 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20 dprintf("Got
4980: 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 58 SSL_ERROR_WANT_X
4990: 35 30 39 5f 4c 4f 4f 4b 55 50 2c 20 6d 61 70 70 509_LOOKUP, mapp
49a0: 69 6e 67 20 69 74 20 74 6f 20 45 41 47 41 49 4e ing it to EAGAIN
49b0: 22 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 ");.. *errorC
49c0: 6f 64 65 50 74 72 20 3d 20 45 41 47 41 49 4e 3b odePtr = EAGAIN;
49d0: 0a 09 20 20 20 20 62 79 74 65 73 52 65 61 64 20 .. bytesRead
49e0: 3d 20 2d 31 3b 0a 09 20 20 20 20 62 72 65 61 6b = -1;.. break
49f0: 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52 ;...case SSL_ERR
4a00: 4f 52 5f 53 59 53 43 41 4c 4c 3a 0a 09 20 20 20 OR_SYSCALL:..
4a10: 20 2f 2a 20 53 6f 6d 65 20 6e 6f 6e 2d 72 65 63 /* Some non-rec
4a20: 6f 76 65 72 61 62 6c 65 2c 20 66 61 74 61 6c 20 overable, fatal
4a30: 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 72 I/O error occurr
4a40: 65 64 20 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e ed */.. dprin
4a50: 74 66 28 22 53 53 4c 5f 45 52 52 4f 52 5f 53 59 tf("SSL_ERROR_SY
4a60: 53 43 41 4c 4c 3a 20 46 61 74 61 6c 20 49 2f 4f SCALL: Fatal I/O
4a70: 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 22 error occurred"
4a80: 29 3b 0a 0a 09 20 20 20 20 69 66 20 28 62 61 63 );... if (bac
4a90: 6b 69 6e 67 45 72 72 6f 72 20 3d 3d 20 30 20 26 kingError == 0 &
4aa0: 26 20 62 79 74 65 73 52 65 61 64 20 3d 3d 20 30 & bytesRead == 0
4ab0: 29 20 7b 0a 09 09 2f 2a 20 55 6e 65 78 70 65 63 ) {.../* Unexpec
4ac0: 74 65 64 20 45 4f 46 20 66 72 6f 6d 20 74 68 65 ted EOF from the
4ad0: 20 70 65 65 72 20 66 6f 72 20 4f 70 65 6e 53 53 peer for OpenSS
4ae0: 4c 20 31 2e 31 20 2a 2f 0a 09 09 64 70 72 69 6e L 1.1 */...dprin
4af0: 74 66 28 22 28 55 6e 65 78 70 65 63 74 65 64 29 tf("(Unexpected)
4b00: 20 45 4f 46 20 72 65 61 63 68 65 64 22 29 0a 09 EOF reached")..
4b10: 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d .*errorCodePtr =
4b20: 20 30 3b 0a 09 09 62 79 74 65 73 52 65 61 64 20 0;...bytesRead
4b30: 3d 20 30 3b 0a 09 09 54 6c 73 5f 45 72 72 6f 72 = 0;...Tls_Error
4b40: 28 73 74 61 74 65 50 74 72 2c 20 22 45 4f 46 20 (statePtr, "EOF
4b50: 72 65 61 63 68 65 64 22 29 3b 0a 0a 09 20 20 20 reached");...
4b60: 20 7d 20 65 6c 73 65 20 69 66 20 28 62 61 63 6b } else if (back
4b70: 69 6e 67 45 72 72 6f 72 20 3d 3d 20 30 20 26 26 ingError == 0 &&
4b80: 20 62 79 74 65 73 52 65 61 64 20 3d 3d 20 2d 31 bytesRead == -1
4b90: 29 20 7b 0a 09 09 64 70 72 69 6e 74 66 28 22 49 ) {...dprintf("I
4ba0: 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 /O error occurre
4bb0: 64 20 28 65 72 72 6e 6f 20 3d 20 25 6c 75 29 22 d (errno = %lu)"
4bc0: 2c 0a 09 09 20 20 20 20 28 75 6e 73 69 67 6e 65 ,... (unsigne
4bd0: 64 20 6c 6f 6e 67 29 20 54 63 6c 5f 47 65 74 45 d long) Tcl_GetE
4be0: 72 72 6e 6f 28 29 29 3b 0a 09 09 2a 65 72 72 6f rrno());...*erro
4bf0: 72 43 6f 64 65 50 74 72 20 3d 20 54 63 6c 5f 47 rCodePtr = Tcl_G
4c00: 65 74 45 72 72 6e 6f 28 29 3b 0a 09 09 62 79 74 etErrno();...byt
4c10: 65 73 52 65 61 64 20 3d 20 2d 31 3b 0a 09 09 54 esRead = -1;...T
4c20: 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 ls_Error(statePt
4c30: 72 2c 20 54 63 6c 5f 45 72 72 6e 6f 4d 73 67 28 r, Tcl_ErrnoMsg(
4c40: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29 29 3b *errorCodePtr));
4c50: 0a 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a ... } else {.
4c60: 09 09 64 70 72 69 6e 74 66 28 22 49 2f 4f 20 65 ..dprintf("I/O e
4c70: 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 28 62 rror occurred (b
4c80: 61 63 6b 69 6e 67 45 72 72 6f 72 20 3d 20 25 6c ackingError = %l
4c90: 75 29 22 2c 20 62 61 63 6b 69 6e 67 45 72 72 6f u)", backingErro
4ca0: 72 29 3b 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65 r);...*errorCode
4cb0: 50 74 72 20 3d 20 54 63 6c 5f 47 65 74 45 72 72 Ptr = Tcl_GetErr
4cc0: 6e 6f 28 29 3b 0a 09 09 62 79 74 65 73 52 65 61 no();...bytesRea
4cd0: 64 20 3d 20 2d 31 3b 0a 09 09 54 6c 73 5f 45 72 d = -1;...Tls_Er
4ce0: 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20 45 52 ror(statePtr, ER
4cf0: 52 5f 72 65 61 73 6f 6e 5f 65 72 72 6f 72 5f 73 R_reason_error_s
4d00: 74 72 69 6e 67 28 62 61 63 6b 69 6e 67 45 72 72 tring(backingErr
4d10: 6f 72 29 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 or));.. }..
4d20: 20 20 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20 break;...case
4d30: 53 53 4c 5f 45 52 52 4f 52 5f 5a 45 52 4f 5f 52 SSL_ERROR_ZERO_R
4d40: 45 54 55 52 4e 3a 0a 09 20 20 20 20 2f 2a 20 50 ETURN:.. /* P
4d50: 65 65 72 20 68 61 73 20 63 6c 65 61 6e 6c 79 20 eer has cleanly
4d60: 63 6c 6f 73 65 64 20 74 68 65 20 63 6f 6e 6e 65 closed the conne
4d70: 63 74 69 6f 6e 20 62 79 20 73 65 6e 64 69 6e 67 ction by sending
4d80: 20 74 68 65 20 63 6c 6f 73 65 5f 6e 6f 74 69 66 the close_notif
4d90: 79 0a 09 20 20 20 20 20 20 20 61 6c 65 72 74 2e y.. alert.
4da0: 20 43 61 6e 27 74 20 72 65 61 64 2c 20 62 75 74 Can't read, but
4db0: 20 63 61 6e 20 77 72 69 74 65 2e 20 4e 65 65 64 can write. Need
4dc0: 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 45 4f to return an EO
4dd0: 46 2c 20 73 6f 20 74 68 65 0a 09 20 20 20 20 20 F, so the..
4de0: 20 20 63 68 61 6e 6e 65 6c 20 69 73 20 63 6c 6f channel is clo
4df0: 73 65 64 20 77 68 69 63 68 20 77 69 6c 6c 20 73 sed which will s
4e00: 65 6e 64 20 61 6e 20 53 53 4c 5f 73 68 75 74 64 end an SSL_shutd
4e10: 6f 77 6e 28 29 2e 20 2a 2f 0a 09 20 20 20 20 64 own(). */.. d
4e20: 70 72 69 6e 74 66 28 22 53 53 4c 5f 45 52 52 4f printf("SSL_ERRO
4e30: 52 5f 5a 45 52 4f 5f 52 45 54 55 52 4e 3a 20 50 R_ZERO_RETURN: P
4e40: 65 65 72 20 68 61 73 20 63 6c 6f 73 65 64 20 74 eer has closed t
4e50: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 22 29 3b he connection");
4e60: 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 .. *errorCode
4e70: 50 74 72 20 3d 20 30 3b 0a 09 20 20 20 20 62 79 Ptr = 0;.. by
4e80: 74 65 73 52 65 61 64 20 3d 20 30 3b 0a 09 20 20 tesRead = 0;..
4e90: 20 20 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 Tls_Error(stat
4ea0: 65 50 74 72 2c 20 22 50 65 65 72 20 68 61 73 20 ePtr, "Peer has
4eb0: 63 6c 6f 73 65 64 20 74 68 65 20 63 6f 6e 6e 65 closed the conne
4ec0: 63 74 69 6f 6e 20 66 6f 72 20 77 72 69 74 69 6e ction for writin
4ed0: 67 20 62 79 20 73 65 6e 64 69 6e 67 20 74 68 65 g by sending the
4ee0: 20 63 6c 6f 73 65 5f 6e 6f 74 69 66 79 20 61 6c close_notify al
4ef0: 65 72 74 22 29 3b 0a 09 20 20 20 20 62 72 65 61 ert");.. brea
4f00: 6b 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 k;...case SSL_ER
4f10: 52 4f 52 5f 57 41 4e 54 5f 41 53 59 4e 43 3a 0a ROR_WANT_ASYNC:.
4f20: 09 20 20 20 20 2f 2a 20 55 73 65 64 20 77 69 74 . /* Used wit
4f30: 68 20 66 6c 61 67 20 53 53 4c 5f 4d 4f 44 45 5f h flag SSL_MODE_
4f40: 41 53 59 4e 43 2c 20 6f 70 65 72 61 74 69 6f 6e ASYNC, operation
4f50: 20 64 69 64 6e 27 74 20 63 6f 6d 70 6c 65 74 65 didn't complete
4f60: 20 62 65 63 61 75 73 65 0a 09 20 20 20 20 20 20 because..
4f70: 20 61 6e 20 61 73 79 6e 63 20 65 6e 67 69 6e 65 an async engine
4f80: 20 69 73 20 73 74 69 6c 6c 20 70 72 6f 63 65 73 is still proces
4f90: 73 69 6e 67 20 64 61 74 61 2e 20 2a 2f 0a 09 20 sing data. */..
4fa0: 20 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20 dprintf("Got
4fb0: 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 41 SSL_ERROR_WANT_A
4fc0: 53 59 4e 43 2c 20 6d 61 70 70 69 6e 67 20 74 68 SYNC, mapping th
4fd0: 69 73 20 74 6f 20 45 41 47 41 49 4e 22 29 3b 0a is to EAGAIN");.
4fe0: 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 . *errorCodeP
4ff0: 74 72 20 3d 20 45 41 47 41 49 4e 3b 0a 09 20 20 tr = EAGAIN;..
5000: 20 20 62 79 74 65 73 52 65 61 64 20 3d 20 30 3b bytesRead = 0;
5010: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 64 .. break;...d
5020: 65 66 61 75 6c 74 3a 0a 09 20 20 20 20 64 70 72 efault:.. dpr
5030: 69 6e 74 66 28 22 55 6e 6b 6e 6f 77 6e 20 65 72 intf("Unknown er
5040: 72 6f 72 20 28 65 72 72 20 3d 20 25 69 29 2c 20 ror (err = %i),
5050: 6d 61 70 70 69 6e 67 20 74 6f 20 45 4f 46 22 2c mapping to EOF",
5060: 20 65 72 72 29 3b 0a 09 20 20 20 20 2a 65 72 72 err);.. *err
5070: 6f 72 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a 09 orCodePtr = 0;..
5080: 20 20 20 20 62 79 74 65 73 52 65 61 64 20 3d 20 bytesRead =
5090: 30 3b 0a 09 20 20 20 20 54 6c 73 5f 45 72 72 6f 0;.. Tls_Erro
50a0: 72 28 73 74 61 74 65 50 74 72 2c 20 22 55 6e 6b r(statePtr, "Unk
50b0: 6e 6f 77 6e 20 65 72 72 6f 72 22 29 3b 0a 09 20 nown error");..
50c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a break;. }.
50d0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 49 6e . dprintf("In
50e0: 70 75 74 28 25 64 29 20 2d 3e 20 25 64 20 5b 25 put(%d) -> %d [%
50f0: 64 5d 22 2c 20 62 75 66 53 69 7a 65 2c 20 62 79 d]", bufSize, by
5100: 74 65 73 52 65 61 64 2c 20 2a 65 72 72 6f 72 43 tesRead, *errorC
5110: 6f 64 65 50 74 72 29 3b 0a 20 20 20 20 72 65 74 odePtr);. ret
5120: 75 72 6e 20 62 79 74 65 73 52 65 61 64 3b 0a 7d urn bytesRead;.}
5130: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
5140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5180: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 4f 75 ----. *. * TlsOu
5190: 74 70 75 74 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 tputProc --. *.
51a0: 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 *.This procedure
51b0: 20 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 is invoked by t
51c0: 68 65 20 67 65 6e 65 72 69 63 20 49 2f 4f 20 6c he generic I/O l
51d0: 61 79 65 72 20 74 6f 20 77 72 69 74 65 20 64 61 ayer to write da
51e0: 74 61 20 74 6f 20 74 68 65 0a 20 2a 09 42 49 4f ta to the. *.BIO
51f0: 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 74 68 whenever the th
5200: 65 20 54 63 6c 5f 57 72 69 74 65 28 29 2c 20 54 e Tcl_Write(), T
5210: 63 6c 5f 57 72 69 74 65 43 68 61 72 73 2c 20 61 cl_WriteChars, a
5220: 6e 64 20 54 63 6c 5f 57 72 69 74 65 4f 62 6a 0a nd Tcl_WriteObj.
5230: 20 2a 09 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 *.functions are
5240: 20 75 73 65 64 2e 20 45 71 75 69 76 61 6c 65 6e used. Equivalen
5250: 74 20 74 6f 20 53 53 4c 5f 77 72 69 74 65 5f 65 t to SSL_write_e
5260: 78 20 61 6e 64 20 53 53 4c 5f 77 72 69 74 65 2e x and SSL_write.
5270: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
5280: 20 2a 09 52 65 74 75 72 6e 73 20 74 68 65 20 6e *.Returns the n
5290: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 umber of bytes w
52a0: 72 69 74 74 65 6e 20 6f 72 20 2d 31 20 6f 6e 20 ritten or -1 on
52b0: 65 72 72 6f 72 2e 20 53 65 74 73 20 65 72 72 6f error. Sets erro
52c0: 72 43 6f 64 65 50 74 72 0a 20 2a 09 74 6f 20 61 rCodePtr. *.to a
52d0: 20 50 4f 53 49 58 20 65 72 72 6f 72 20 63 6f 64 POSIX error cod
52e0: 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 e if an error oc
52f0: 63 75 72 72 65 64 2c 20 6f 72 20 30 20 69 66 20 curred, or 0 if
5300: 6e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 none.. *. * Side
5310: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 57 72 69 effects:. *.Wri
5320: 74 65 73 20 6f 75 74 70 75 74 20 6f 6e 20 74 68 tes output on th
5330: 65 20 6f 75 74 70 75 74 20 64 65 76 69 63 65 20 e output device
5340: 6f 66 20 74 68 65 20 63 68 61 6e 6e 65 6c 2e 0a of the channel..
5350: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
5360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
53a0: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e --. */.static in
53b0: 74 20 54 6c 73 4f 75 74 70 75 74 50 72 6f 63 28 t TlsOutputProc(
53c0: 0a 20 20 20 20 43 6c 69 65 6e 74 44 61 74 61 20 . ClientData
53d0: 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 09 2f 2a instanceData,./*
53e0: 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 61 74 Connection stat
53f0: 65 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 63 6f e info */. co
5400: 6e 73 74 20 63 68 61 72 20 2a 62 75 66 2c 09 09 nst char *buf,..
5410: 2f 2a 20 42 75 66 66 65 72 20 77 69 74 68 20 64 /* Buffer with d
5420: 61 74 61 20 74 6f 20 77 72 69 74 65 20 74 6f 20 ata to write to
5430: 42 49 4f 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 BIO */. int t
5440: 6f 57 72 69 74 65 2c 09 09 2f 2a 20 53 69 7a 65 oWrite,../* Size
5450: 20 6f 66 20 64 61 74 61 20 74 6f 20 77 72 69 74 of data to writ
5460: 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 e in bytes */.
5470: 20 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 int *errorCode
5480: 50 74 72 29 09 09 2f 2a 20 53 74 6f 72 61 67 65 Ptr)../* Storage
5490: 20 66 6f 72 20 65 72 72 6f 72 20 63 6f 64 65 20 for error code
54a0: 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 7b 0a 20 to return */.{.
54b0: 20 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 unsigned long
54c0: 20 62 61 63 6b 69 6e 67 45 72 72 6f 72 3b 0a 20 backingError;.
54d0: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 State *stateP
54e0: 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 20 69 tr = (State *) i
54f0: 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 20 20 20 nstanceData;.
5500: 20 69 6e 74 20 77 72 69 74 74 65 6e 2c 20 65 72 int written, er
5510: 72 3b 0a 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 r;. *errorCod
5520: 65 50 74 72 20 3d 20 30 3b 0a 0a 20 20 20 20 64 ePtr = 0;.. d
5530: 70 72 69 6e 74 66 28 22 57 72 69 74 65 28 25 70 printf("Write(%p
5540: 2c 20 25 64 29 22 2c 20 28 76 6f 69 64 20 2a 29 , %d)", (void *)
5550: 20 73 74 61 74 65 50 74 72 2c 20 74 6f 57 72 69 statePtr, toWri
5560: 74 65 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 42 te);. dprintB
5570: 75 66 66 65 72 28 62 75 66 2c 20 74 6f 57 72 69 uffer(buf, toWri
5580: 74 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 62 6f te);.. /* Abo
5590: 72 74 20 69 66 20 74 68 65 20 75 73 65 72 20 76 rt if the user v
55a0: 65 72 69 66 79 20 63 61 6c 6c 62 61 63 6b 20 69 erify callback i
55b0: 73 20 73 74 69 6c 6c 20 72 75 6e 6e 69 6e 67 20 s still running
55c0: 74 6f 20 61 76 6f 69 64 20 74 72 69 67 67 65 72 to avoid trigger
55d0: 69 6e 67 0a 20 20 20 20 20 2a 20 61 6e 6f 74 68 ing. * anoth
55e0: 65 72 20 63 61 6c 6c 20 62 65 66 6f 72 65 20 74 er call before t
55f0: 68 65 20 63 75 72 72 65 6e 74 20 6f 6e 65 20 69 he current one i
5600: 73 20 63 6f 6d 70 6c 65 74 65 2e 20 2a 2f 0a 20 s complete. */.
5610: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
5620: 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c >flags & TLS_TCL
5630: 5f 43 41 4c 4c 42 41 43 4b 29 20 7b 0a 09 64 70 _CALLBACK) {..dp
5640: 72 69 6e 74 66 28 22 44 6f 6e 27 74 20 70 72 6f rintf("Don't pro
5650: 63 65 73 73 20 6f 75 74 70 75 74 20 77 68 69 6c cess output whil
5660: 65 20 63 61 6c 6c 62 61 63 6b 73 20 61 72 65 20 e callbacks are
5670: 72 75 6e 6e 69 6e 67 22 29 3b 0a 09 77 72 69 74 running");..writ
5680: 74 65 6e 20 3d 20 2d 31 3b 0a 09 2a 65 72 72 6f ten = -1;..*erro
5690: 72 43 6f 64 65 50 74 72 20 3d 20 45 41 47 41 49 rCodePtr = EAGAI
56a0: 4e 3b 0a 09 72 65 74 75 72 6e 20 2d 31 3b 0a 20 N;..return -1;.
56b0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 }.. /* If
56c0: 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c not initialized,
56d0: 20 64 6f 20 63 6f 6e 6e 65 63 74 20 2a 2f 0a 20 do connect */.
56e0: 20 20 20 2f 2a 20 43 61 6e 20 61 6c 73 6f 20 63 /* Can also c
56f0: 68 65 63 6b 20 53 53 4c 5f 69 73 5f 69 6e 69 74 heck SSL_is_init
5700: 5f 66 69 6e 69 73 68 65 64 28 73 73 6c 29 20 2a _finished(ssl) *
5710: 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 /. if (stateP
5720: 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f tr->flags & TLS_
5730: 54 43 4c 5f 49 4e 49 54 29 20 7b 0a 09 69 6e 74 TCL_INIT) {..int
5740: 20 74 6c 73 43 6f 6e 6e 65 63 74 3b 0a 0a 09 64 tlsConnect;...d
5750: 70 72 69 6e 74 66 28 22 43 61 6c 6c 69 6e 67 20 printf("Calling
5760: 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 Tls_WaitForConne
5770: 63 74 22 29 3b 0a 0a 09 74 6c 73 43 6f 6e 6e 65 ct");...tlsConne
5780: 63 74 20 3d 20 54 6c 73 5f 57 61 69 74 46 6f 72 ct = Tls_WaitFor
5790: 43 6f 6e 6e 65 63 74 28 73 74 61 74 65 50 74 72 Connect(statePtr
57a0: 2c 20 65 72 72 6f 72 43 6f 64 65 50 74 72 2c 20 , errorCodePtr,
57b0: 31 29 3b 0a 09 69 66 20 28 74 6c 73 43 6f 6e 6e 1);..if (tlsConn
57c0: 65 63 74 20 3c 20 30 29 20 7b 0a 09 20 20 20 20 ect < 0) {..
57d0: 64 70 72 69 6e 74 66 28 22 47 6f 74 20 61 6e 20 dprintf("Got an
57e0: 65 72 72 6f 72 20 77 61 69 74 69 6e 67 20 74 6f error waiting to
57f0: 20 63 6f 6e 6e 65 63 74 20 28 74 6c 73 43 6f 6e connect (tlsCon
5800: 6e 65 63 74 20 3d 20 25 69 2c 20 2a 65 72 72 6f nect = %i, *erro
5810: 72 43 6f 64 65 50 74 72 20 3d 20 25 69 29 22 2c rCodePtr = %i)",
5820: 0a 09 09 74 6c 73 43 6f 6e 6e 65 63 74 2c 20 2a ...tlsConnect, *
5830: 65 72 72 6f 72 43 6f 64 65 50 74 72 29 3b 0a 0a errorCodePtr);..
5840: 09 20 20 20 20 77 72 69 74 74 65 6e 20 3d 20 2d . written = -
5850: 31 3b 0a 09 20 20 20 20 69 66 20 28 2a 65 72 72 1;.. if (*err
5860: 6f 72 43 6f 64 65 50 74 72 20 3d 3d 20 45 43 4f orCodePtr == ECO
5870: 4e 4e 52 45 53 45 54 29 20 7b 0a 09 09 64 70 72 NNRESET) {...dpr
5880: 69 6e 74 66 28 22 47 6f 74 20 63 6f 6e 6e 65 63 intf("Got connec
5890: 74 69 6f 6e 20 72 65 73 65 74 22 29 3b 0a 09 09 tion reset");...
58a0: 2f 2a 20 53 6f 66 74 20 45 4f 46 20 2a 2f 0a 09 /* Soft EOF */..
58b0: 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d .*errorCodePtr =
58c0: 20 30 3b 0a 09 09 77 72 69 74 74 65 6e 20 3d 20 0;...written =
58d0: 30 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 72 0;.. }.. r
58e0: 65 74 75 72 6e 20 77 72 69 74 74 65 6e 3b 0a 09 eturn written;..
58f0: 7d 20 65 6c 73 65 20 69 66 20 28 74 6c 73 43 6f } else if (tlsCo
5900: 6e 6e 65 63 74 20 3d 3d 20 30 29 20 7b 0a 09 20 nnect == 0) {..
5910: 20 20 20 2f 2a 20 54 72 79 20 61 67 61 69 6e 20 /* Try again
5920: 2a 2f 0a 09 20 20 20 20 77 72 69 74 74 65 6e 20 */.. written
5930: 3d 20 2d 31 3b 0a 09 20 20 20 20 72 65 74 75 72 = -1;.. retur
5940: 6e 20 77 72 69 74 74 65 6e 3b 0a 09 7d 0a 20 20 n written;..}.
5950: 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 74 6f 57 }.. if (toW
5960: 72 69 74 65 20 3d 3d 20 30 29 20 7b 0a 09 64 70 rite == 0) {..dp
5970: 72 69 6e 74 66 28 22 7a 65 72 6f 2d 77 72 69 74 rintf("zero-writ
5980: 65 22 29 3b 0a 09 65 72 72 20 3d 20 42 49 4f 5f e");..err = BIO_
5990: 66 6c 75 73 68 28 73 74 61 74 65 50 74 72 2d 3e flush(statePtr->
59a0: 62 69 6f 29 3b 0a 0a 09 69 66 20 28 65 72 72 20 bio);...if (err
59b0: 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 64 70 72 <= 0) {.. dpr
59c0: 69 6e 74 66 28 22 46 6c 75 73 68 69 6e 67 20 66 intf("Flushing f
59d0: 61 69 6c 65 64 22 29 3b 0a 09 20 20 20 20 54 6c ailed");.. Tl
59e0: 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 s_Error(statePtr
59f0: 2c 20 22 46 6c 75 73 68 20 66 61 69 6c 65 64 22 , "Flush failed"
5a00: 29 3b 0a 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 );... *errorC
5a10: 6f 64 65 50 74 72 20 3d 20 45 49 4f 3b 0a 09 20 odePtr = EIO;..
5a20: 20 20 20 77 72 69 74 74 65 6e 20 3d 20 30 3b 0a written = 0;.
5a30: 09 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a . return -1;.
5a40: 09 7d 0a 0a 09 2a 65 72 72 6f 72 43 6f 64 65 50 .}...*errorCodeP
5a50: 74 72 20 3d 20 30 3b 0a 09 77 72 69 74 74 65 6e tr = 0;..written
5a60: 20 3d 20 30 3b 0a 09 72 65 74 75 72 6e 20 30 3b = 0;..return 0;
5a70: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 . }.. /*.
5a80: 20 20 20 20 2a 20 57 65 20 6e 65 65 64 20 74 6f * We need to
5a90: 20 63 6c 65 61 72 20 74 68 65 20 53 53 4c 20 65 clear the SSL e
5aa0: 72 72 6f 72 20 73 74 61 63 6b 20 6e 6f 77 20 62 rror stack now b
5ab0: 65 63 61 75 73 65 20 77 65 20 73 6f 6d 65 74 69 ecause we someti
5ac0: 6d 65 73 20 72 65 61 63 68 0a 20 20 20 20 20 2a mes reach. *
5ad0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 this function w
5ae0: 69 74 68 20 6c 65 66 74 6f 76 65 72 20 65 72 72 ith leftover err
5af0: 6f 72 73 20 69 6e 20 74 68 65 20 73 74 61 63 6b ors in the stack
5b00: 2e 20 20 49 66 20 42 49 4f 5f 77 72 69 74 65 0a . If BIO_write.
5b10: 20 20 20 20 20 2a 20 72 65 74 75 72 6e 73 20 2d * returns -
5b20: 31 20 61 6e 64 20 69 6e 74 65 6e 64 73 20 45 41 1 and intends EA
5b30: 47 41 49 4e 2c 20 74 68 65 72 65 20 69 73 20 61 GAIN, there is a
5b40: 20 6c 65 66 74 6f 76 65 72 20 65 72 72 6f 72 2c leftover error,
5b50: 20 69 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 it will be.
5b60: 20 2a 20 6d 69 73 63 6f 6e 73 74 72 75 65 64 20 * misconstrued
5b70: 61 73 20 61 6e 20 65 72 72 6f 72 2c 20 6e 6f 74 as an error, not
5b80: 20 45 41 47 41 49 4e 2e 0a 20 20 20 20 20 2a 0a EAGAIN.. *.
5b90: 20 20 20 20 20 2a 20 41 6c 74 65 72 6e 61 74 69 * Alternati
5ba0: 76 65 6c 79 2c 20 77 65 20 6d 61 79 20 77 61 6e vely, we may wan
5bb0: 74 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 t to handle the
5bc0: 3c 30 20 72 65 74 75 72 6e 20 63 6f 64 65 73 20 <0 return codes
5bd0: 66 72 6f 6d 0a 20 20 20 20 20 2a 20 42 49 4f 5f from. * BIO_
5be0: 77 72 69 74 65 20 73 70 65 63 69 61 6c 6c 79 20 write specially
5bf0: 28 61 73 20 61 64 76 69 73 65 64 20 69 6e 20 74 (as advised in t
5c00: 68 65 20 52 53 41 20 64 6f 63 73 29 2e 20 20 54 he RSA docs). T
5c10: 4c 53 27 73 20 6c 6f 77 65 72 20 6c 65 76 65 6c LS's lower level
5c20: 0a 20 20 20 20 20 2a 20 42 49 4f 20 66 75 6e 63 . * BIO func
5c30: 74 69 6f 6e 73 20 70 6c 61 79 20 77 69 74 68 20 tions play with
5c40: 74 68 65 20 72 65 74 72 79 20 66 6c 61 67 73 20 the retry flags
5c50: 74 68 6f 75 67 68 2c 20 61 6e 64 20 74 68 69 73 though, and this
5c60: 20 73 65 65 6d 73 20 74 6f 0a 20 20 20 20 20 2a seems to. *
5c70: 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e work correctly.
5c80: 20 20 53 69 6d 69 6c 61 72 20 66 69 78 20 69 6e Similar fix in
5c90: 20 54 6c 73 49 6e 70 75 74 50 72 6f 63 2e 20 2d TlsInputProc. -
5ca0: 20 68 6f 62 62 73 0a 20 20 20 20 20 2a 2f 0a 20 hobbs. */.
5cb0: 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 ERR_clear_err
5cc0: 6f 72 28 29 3b 0a 20 20 20 20 42 49 4f 5f 63 6c or();. BIO_cl
5cd0: 65 61 72 5f 72 65 74 72 79 5f 66 6c 61 67 73 28 ear_retry_flags(
5ce0: 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a statePtr->bio);.
5cf0: 20 20 20 20 77 72 69 74 74 65 6e 20 3d 20 42 49 written = BI
5d00: 4f 5f 77 72 69 74 65 28 73 74 61 74 65 50 74 72 O_write(statePtr
5d10: 2d 3e 62 69 6f 2c 20 62 75 66 2c 20 74 6f 57 72 ->bio, buf, toWr
5d20: 69 74 65 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 ite);. dprint
5d30: 66 28 22 42 49 4f 5f 77 72 69 74 65 28 25 70 2c f("BIO_write(%p,
5d40: 20 25 64 29 20 2d 3e 20 5b 25 64 5d 22 2c 20 28 %d) -> [%d]", (
5d50: 76 6f 69 64 20 2a 29 20 73 74 61 74 65 50 74 72 void *) statePtr
5d60: 2c 20 74 6f 57 72 69 74 65 2c 20 77 72 69 74 74 , toWrite, writt
5d70: 65 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 61 6d en);.. /* Sam
5d80: 65 20 61 73 20 53 53 4c 5f 77 61 6e 74 2c 20 62 e as SSL_want, b
5d90: 75 74 20 61 6c 73 6f 20 63 68 65 63 6b 73 20 74 ut also checks t
5da0: 68 65 20 65 72 72 6f 72 20 71 75 65 75 65 20 2a he error queue *
5db0: 2f 0a 20 20 20 20 65 72 72 20 3d 20 53 53 4c 5f /. err = SSL_
5dc0: 67 65 74 5f 65 72 72 6f 72 28 73 74 61 74 65 50 get_error(stateP
5dd0: 74 72 2d 3e 73 73 6c 2c 20 77 72 69 74 74 65 6e tr->ssl, written
5de0: 29 3b 0a 20 20 20 20 62 61 63 6b 69 6e 67 45 72 );. backingEr
5df0: 72 6f 72 20 3d 20 45 52 52 5f 67 65 74 5f 65 72 ror = ERR_get_er
5e00: 72 6f 72 28 29 3b 0a 0a 20 20 20 20 69 66 20 28 ror();.. if (
5e10: 77 72 69 74 74 65 6e 20 3c 3d 20 30 29 20 7b 0a written <= 0) {.
5e20: 09 2f 2a 20 54 68 65 20 72 65 74 72 79 20 66 6c ./* The retry fl
5e30: 61 67 20 69 73 20 73 65 74 20 62 79 20 74 68 65 ag is set by the
5e40: 20 42 49 4f 5f 73 65 74 5f 72 65 74 72 79 5f 2a BIO_set_retry_*
5e50: 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 09 69 functions */..i
5e60: 66 20 28 42 49 4f 5f 73 68 6f 75 6c 64 5f 72 65 f (BIO_should_re
5e70: 74 72 79 28 73 74 61 74 65 50 74 72 2d 3e 62 69 try(statePtr->bi
5e80: 6f 29 29 20 7b 0a 09 20 20 20 20 64 70 72 69 6e o)) {.. dprin
5e90: 74 66 28 22 57 72 69 74 65 20 66 61 69 6c 65 64 tf("Write failed
5ea0: 20 77 69 74 68 20 63 6f 64 65 20 25 64 2c 20 62 with code %d, b
5eb0: 79 74 65 73 20 77 72 69 74 74 65 6e 3d 25 64 3a ytes written=%d:
5ec0: 20 73 68 6f 75 6c 64 20 72 65 74 72 79 22 2c 0a should retry",.
5ed0: 09 09 65 72 72 2c 20 77 72 69 74 74 65 6e 29 3b ..err, written);
5ee0: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 ..} else {..
5ef0: 64 70 72 69 6e 74 66 28 22 57 72 69 74 65 20 66 dprintf("Write f
5f00: 61 69 6c 65 64 20 77 69 74 68 20 63 6f 64 65 20 ailed with code
5f10: 25 64 2c 20 62 79 74 65 73 20 77 72 69 74 74 65 %d, bytes writte
5f20: 6e 3d 25 64 3a 20 65 72 72 6f 72 20 63 6f 6e 64 n=%d: error cond
5f30: 69 74 69 6f 6e 22 2c 0a 09 09 65 72 72 2c 20 77 ition",...err, w
5f40: 72 69 74 74 65 6e 29 3b 0a 09 7d 0a 0a 09 2f 2a ritten);..}.../*
5f50: 20 54 68 65 73 65 20 61 72 65 20 74 68 65 20 73 These are the s
5f60: 61 6d 65 20 61 73 20 42 49 4f 5f 72 65 74 72 79 ame as BIO_retry
5f70: 5f 74 79 70 65 20 2a 2f 0a 09 69 66 20 28 42 49 _type */..if (BI
5f80: 4f 5f 73 68 6f 75 6c 64 5f 72 65 61 64 28 73 74 O_should_read(st
5f90: 61 74 65 50 74 72 2d 3e 62 69 6f 29 29 20 7b 0a atePtr->bio)) {.
5fa0: 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 42 49 . dprintf("BI
5fb0: 4f 20 68 61 73 20 69 6e 73 75 66 66 69 63 69 65 O has insufficie
5fc0: 6e 74 20 64 61 74 61 20 74 6f 20 72 65 61 64 20 nt data to read
5fd0: 61 6e 64 20 72 65 74 75 72 6e 22 29 3b 0a 09 7d and return");..}
5fe0: 0a 09 69 66 20 28 42 49 4f 5f 73 68 6f 75 6c 64 ..if (BIO_should
5ff0: 5f 77 72 69 74 65 28 73 74 61 74 65 50 74 72 2d _write(statePtr-
6000: 3e 62 69 6f 29 29 20 7b 0a 09 20 20 20 20 64 70 >bio)) {.. dp
6010: 72 69 6e 74 66 28 22 42 49 4f 20 68 61 73 20 70 rintf("BIO has p
6020: 65 6e 64 69 6e 67 20 64 61 74 61 20 74 6f 20 77 ending data to w
6030: 72 69 74 65 22 29 3b 0a 09 7d 0a 09 69 66 20 28 rite");..}..if (
6040: 42 49 4f 5f 73 68 6f 75 6c 64 5f 69 6f 5f 73 70 BIO_should_io_sp
6050: 65 63 69 61 6c 28 73 74 61 74 65 50 74 72 2d 3e ecial(statePtr->
6060: 62 69 6f 29 29 20 7b 0a 09 20 20 20 20 69 6e 74 bio)) {.. int
6070: 20 72 65 61 73 6f 6e 20 3d 20 42 49 4f 5f 67 65 reason = BIO_ge
6080: 74 5f 72 65 74 72 79 5f 72 65 61 73 6f 6e 28 73 t_retry_reason(s
6090: 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 tatePtr->bio);..
60a0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 42 49 4f dprintf("BIO
60b0: 20 68 61 73 20 73 6f 6d 65 20 73 70 65 63 69 61 has some specia
60c0: 6c 20 63 6f 6e 64 69 74 69 6f 6e 20 6f 74 68 65 l condition othe
60d0: 72 20 74 68 61 6e 20 72 65 61 64 20 6f 72 20 77 r than read or w
60e0: 72 69 74 65 3a 20 63 6f 64 65 3d 25 64 22 2c 20 rite: code=%d",
60f0: 72 65 61 73 6f 6e 29 3b 0a 09 7d 0a 0a 20 20 20 reason);..}..
6100: 20 7d 20 65 6c 73 65 20 7b 0a 09 42 49 4f 5f 66 } else {..BIO_f
6110: 6c 75 73 68 28 73 74 61 74 65 50 74 72 2d 3e 62 lush(statePtr->b
6120: 69 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 io);. }..
6130: 73 77 69 74 63 68 20 28 65 72 72 29 20 7b 0a 09 switch (err) {..
6140: 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 4e case SSL_ERROR_N
6150: 4f 4e 45 3a 0a 09 20 20 20 20 2f 2a 20 49 2f 4f ONE:.. /* I/O
6160: 20 6f 70 65 72 61 74 69 6f 6e 20 63 6f 6d 70 6c operation compl
6170: 65 74 65 64 20 2a 2f 0a 09 20 20 20 20 64 70 72 eted */.. dpr
6180: 69 6e 74 66 28 22 53 53 4c 5f 45 52 52 4f 52 5f intf("SSL_ERROR_
6190: 4e 4f 4e 45 22 29 3b 0a 09 20 20 20 20 69 66 20 NONE");.. if
61a0: 28 77 72 69 74 74 65 6e 20 3c 20 30 29 20 7b 0a (written < 0) {.
61b0: 09 09 77 72 69 74 74 65 6e 20 3d 20 30 3b 0a 09 ..written = 0;..
61c0: 20 20 20 20 7d 0a 09 20 20 20 20 62 72 65 61 6b }.. break
61d0: 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52 ;...case SSL_ERR
61e0: 4f 52 5f 53 53 4c 3a 0a 09 20 20 20 20 2f 2a 20 OR_SSL:.. /*
61f0: 41 20 6e 6f 6e 2d 72 65 63 6f 76 65 72 61 62 6c A non-recoverabl
6200: 65 2c 20 66 61 74 61 6c 20 65 72 72 6f 72 20 69 e, fatal error i
6210: 6e 20 74 68 65 20 53 53 4c 20 6c 69 62 72 61 72 n the SSL librar
6220: 79 20 6f 63 63 75 72 72 65 64 2c 0a 09 20 20 20 y occurred,..
6230: 20 20 20 20 75 73 75 61 6c 6c 79 20 61 20 70 72 usually a pr
6240: 6f 74 6f 63 6f 6c 20 65 72 72 6f 72 20 2a 2f 0a otocol error */.
6250: 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 53 53 . dprintf("SS
6260: 4c 5f 45 52 52 4f 52 5f 53 53 4c 3a 20 46 61 74 L_ERROR_SSL: Fat
6270: 61 6c 20 53 53 4c 20 70 72 6f 74 6f 63 6f 6c 20 al SSL protocol
6280: 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 22 29 error occurred")
6290: 3b 0a 09 20 20 20 20 69 66 20 28 62 61 63 6b 69 ;.. if (backi
62a0: 6e 67 45 72 72 6f 72 20 21 3d 20 30 29 20 7b 0a ngError != 0) {.
62b0: 09 09 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 ..Tls_Error(stat
62c0: 65 50 74 72 2c 20 45 52 52 5f 72 65 61 73 6f 6e ePtr, ERR_reason
62d0: 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 62 61 _error_string(ba
62e0: 63 6b 69 6e 67 45 72 72 6f 72 29 29 3b 0a 09 20 ckingError));..
62f0: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 53 53 } else if (SS
6300: 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 72 65 73 L_get_verify_res
6310: 75 6c 74 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ult(statePtr->ss
6320: 6c 29 20 21 3d 20 58 35 30 39 5f 56 5f 4f 4b 29 l) != X509_V_OK)
6330: 20 7b 0a 09 09 54 6c 73 5f 45 72 72 6f 72 28 73 {...Tls_Error(s
6340: 74 61 74 65 50 74 72 2c 0a 09 09 20 20 20 20 58 tatePtr,... X
6350: 35 30 39 5f 76 65 72 69 66 79 5f 63 65 72 74 5f 509_verify_cert_
6360: 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 53 53 4c error_string(SSL
6370: 5f 67 65 74 5f 76 65 72 69 66 79 5f 72 65 73 75 _get_verify_resu
6380: 6c 74 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c lt(statePtr->ssl
6390: 29 29 29 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 )));.. } else
63a0: 20 7b 0a 09 09 54 6c 73 5f 45 72 72 6f 72 28 73 {...Tls_Error(s
63b0: 74 61 74 65 50 74 72 2c 20 22 55 6e 6b 6e 6f 77 tatePtr, "Unknow
63c0: 6e 20 53 53 4c 20 65 72 72 6f 72 22 29 3b 0a 09 n SSL error");..
63d0: 20 20 20 20 7d 0a 09 20 20 20 20 2a 65 72 72 6f }.. *erro
63e0: 72 43 6f 64 65 50 74 72 20 3d 20 45 43 4f 4e 4e rCodePtr = ECONN
63f0: 41 42 4f 52 54 45 44 3b 0a 09 20 20 20 20 77 72 ABORTED;.. wr
6400: 69 74 74 65 6e 20 3d 20 2d 31 3b 0a 09 20 20 20 itten = -1;..
6410: 20 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20 53 break;...case S
6420: 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 52 45 SL_ERROR_WANT_RE
6430: 41 44 3a 0a 09 20 20 20 20 2f 2a 20 4f 70 65 72 AD:.. /* Oper
6440: 61 74 69 6f 6e 20 64 69 64 20 6e 6f 74 20 63 6f ation did not co
6450: 6d 70 6c 65 74 65 20 64 75 65 20 74 6f 20 6e 6f mplete due to no
6460: 74 20 65 6e 6f 75 67 68 20 64 61 74 61 20 77 61 t enough data wa
6470: 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a 09 20 20 s available...
6480: 20 20 20 20 20 52 65 74 72 79 20 61 67 61 69 6e Retry again
6490: 20 6c 61 74 65 72 20 77 69 74 68 20 73 61 6d 65 later with same
64a0: 20 64 61 74 61 2e 20 2a 2f 0a 09 20 20 20 20 64 data. */.. d
64b0: 70 72 69 6e 74 66 28 22 47 6f 74 20 53 53 4c 5f printf("Got SSL_
64c0: 45 52 52 4f 52 5f 57 41 4e 54 5f 52 45 41 44 2c ERROR_WANT_READ,
64d0: 20 6d 61 70 70 69 6e 67 20 69 74 20 74 6f 20 45 mapping it to E
64e0: 41 47 41 49 4e 22 29 3b 0a 09 20 20 20 20 2a 65 AGAIN");.. *e
64f0: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 41 rrorCodePtr = EA
6500: 47 41 49 4e 3b 0a 09 20 20 20 20 77 72 69 74 74 GAIN;.. writt
6510: 65 6e 20 3d 20 2d 31 3b 0a 09 20 20 20 20 73 74 en = -1;.. st
6520: 61 74 65 50 74 72 2d 3e 77 61 6e 74 20 7c 3d 20 atePtr->want |=
6530: 54 43 4c 5f 52 45 41 44 41 42 4c 45 3b 0a 09 20 TCL_READABLE;..
6540: 20 20 20 42 49 4f 5f 73 65 74 5f 72 65 74 72 79 BIO_set_retry
6550: 5f 72 65 61 64 28 73 74 61 74 65 50 74 72 2d 3e _read(statePtr->
6560: 62 69 6f 29 3b 0a 09 20 20 20 20 62 72 65 61 6b bio);.. break
6570: 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52 ;...case SSL_ERR
6580: 4f 52 5f 57 41 4e 54 5f 57 52 49 54 45 3a 0a 09 OR_WANT_WRITE:..
6590: 20 20 20 20 2f 2a 20 4f 70 65 72 61 74 69 6f 6e /* Operation
65a0: 20 64 69 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 did not complet
65b0: 65 20 64 75 65 20 74 6f 20 75 6e 61 62 6c 65 20 e due to unable
65c0: 74 6f 20 73 65 6e 64 20 61 6c 6c 20 64 61 74 61 to send all data
65d0: 20 74 6f 20 74 68 65 0a 09 20 20 20 20 20 20 20 to the..
65e0: 42 49 4f 2e 20 52 65 74 72 79 20 6c 61 74 65 72 BIO. Retry later
65f0: 20 77 69 74 68 20 73 61 6d 65 20 64 61 74 61 2e with same data.
6600: 20 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e 74 66 */.. dprintf
6610: 28 22 47 6f 74 20 53 53 4c 5f 45 52 52 4f 52 5f ("Got SSL_ERROR_
6620: 57 41 4e 54 5f 57 52 49 54 45 2c 20 6d 61 70 70 WANT_WRITE, mapp
6630: 69 6e 67 20 69 74 20 74 6f 20 45 41 47 41 49 4e ing it to EAGAIN
6640: 22 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 ");.. *errorC
6650: 6f 64 65 50 74 72 20 3d 20 45 41 47 41 49 4e 3b odePtr = EAGAIN;
6660: 0a 09 20 20 20 20 77 72 69 74 74 65 6e 20 3d 20 .. written =
6670: 2d 31 3b 0a 09 20 20 20 20 73 74 61 74 65 50 74 -1;.. statePt
6680: 72 2d 3e 77 61 6e 74 20 7c 3d 20 54 43 4c 5f 57 r->want |= TCL_W
6690: 52 49 54 41 42 4c 45 3b 0a 09 20 20 20 20 42 49 RITABLE;.. BI
66a0: 4f 5f 73 65 74 5f 72 65 74 72 79 5f 77 72 69 74 O_set_retry_writ
66b0: 65 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 e(statePtr->bio)
66c0: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 ;.. break;...
66d0: 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 57 case SSL_ERROR_W
66e0: 41 4e 54 5f 58 35 30 39 5f 4c 4f 4f 4b 55 50 3a ANT_X509_LOOKUP:
66f0: 0a 09 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 65 .. /* The ope
6700: 72 61 74 69 6f 6e 20 64 69 64 20 6e 6f 74 20 63 ration did not c
6710: 6f 6d 70 6c 65 74 65 20 62 65 63 61 75 73 65 20 omplete because
6720: 61 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 63 an application c
6730: 61 6c 6c 62 61 63 6b 0a 09 20 20 20 20 20 20 20 allback..
6740: 73 65 74 20 62 79 20 53 53 4c 5f 43 54 58 5f 73 set by SSL_CTX_s
6750: 65 74 5f 63 6c 69 65 6e 74 5f 63 65 72 74 5f 63 et_client_cert_c
6760: 62 28 29 20 68 61 73 20 61 73 6b 65 64 20 74 6f b() has asked to
6770: 20 62 65 20 63 61 6c 6c 65 64 20 61 67 61 69 6e be called again
6780: 2e 20 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e 74 . */.. dprint
6790: 66 28 22 47 6f 74 20 53 53 4c 5f 45 52 52 4f 52 f("Got SSL_ERROR
67a0: 5f 57 41 4e 54 5f 58 35 30 39 5f 4c 4f 4f 4b 55 _WANT_X509_LOOKU
67b0: 50 2c 20 6d 61 70 70 69 6e 67 20 69 74 20 74 6f P, mapping it to
67c0: 20 45 41 47 41 49 4e 22 29 3b 0a 09 20 20 20 20 EAGAIN");..
67d0: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 *errorCodePtr =
67e0: 45 41 47 41 49 4e 3b 0a 09 20 20 20 20 77 72 69 EAGAIN;.. wri
67f0: 74 74 65 6e 20 3d 20 2d 31 3b 0a 09 20 20 20 20 tten = -1;..
6800: 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20 53 53 break;...case SS
6810: 4c 5f 45 52 52 4f 52 5f 53 59 53 43 41 4c 4c 3a L_ERROR_SYSCALL:
6820: 0a 09 20 20 20 20 2f 2a 20 53 6f 6d 65 20 6e 6f .. /* Some no
6830: 6e 2d 72 65 63 6f 76 65 72 61 62 6c 65 2c 20 66 n-recoverable, f
6840: 61 74 61 6c 20 49 2f 4f 20 65 72 72 6f 72 20 6f atal I/O error o
6850: 63 63 75 72 72 65 64 20 2a 2f 0a 09 20 20 20 20 ccurred */..
6860: 64 70 72 69 6e 74 66 28 22 53 53 4c 5f 45 52 52 dprintf("SSL_ERR
6870: 4f 52 5f 53 59 53 43 41 4c 4c 3a 20 46 61 74 61 OR_SYSCALL: Fata
6880: 6c 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 l I/O error occu
6890: 72 72 65 64 22 29 3b 0a 0a 09 20 20 20 20 69 66 rred");... if
68a0: 20 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 20 3d (backingError =
68b0: 3d 20 30 20 26 26 20 77 72 69 74 74 65 6e 20 3d = 0 && written =
68c0: 3d 20 30 29 20 7b 0a 09 09 64 70 72 69 6e 74 66 = 0) {...dprintf
68d0: 28 22 45 4f 46 20 72 65 61 63 68 65 64 22 29 0a ("EOF reached").
68e0: 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 ..*errorCodePtr
68f0: 3d 20 30 3b 0a 09 09 77 72 69 74 74 65 6e 20 3d = 0;...written =
6900: 20 30 3b 0a 09 09 54 6c 73 5f 45 72 72 6f 72 28 0;...Tls_Error(
6910: 73 74 61 74 65 50 74 72 2c 20 22 45 4f 46 20 72 statePtr, "EOF r
6920: 65 61 63 68 65 64 22 29 3b 0a 0a 09 20 20 20 20 eached");...
6930: 7d 20 65 6c 73 65 20 69 66 20 28 62 61 63 6b 69 } else if (backi
6940: 6e 67 45 72 72 6f 72 20 3d 3d 20 30 20 26 26 20 ngError == 0 &&
6950: 77 72 69 74 74 65 6e 20 3d 3d 20 2d 31 29 20 7b written == -1) {
6960: 0a 09 09 64 70 72 69 6e 74 66 28 22 49 2f 4f 20 ...dprintf("I/O
6970: 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 28 error occurred (
6980: 65 72 72 6e 6f 20 3d 20 25 6c 75 29 22 2c 20 28 errno = %lu)", (
6990: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 54 unsigned long) T
69a0: 63 6c 5f 47 65 74 45 72 72 6e 6f 28 29 29 3b 0a cl_GetErrno());.
69b0: 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 ..*errorCodePtr
69c0: 3d 20 54 63 6c 5f 47 65 74 45 72 72 6e 6f 28 29 = Tcl_GetErrno()
69d0: 3b 0a 09 09 77 72 69 74 74 65 6e 20 3d 20 2d 31 ;...written = -1
69e0: 3b 0a 09 09 54 6c 73 5f 45 72 72 6f 72 28 73 74 ;...Tls_Error(st
69f0: 61 74 65 50 74 72 2c 20 54 63 6c 5f 45 72 72 6e atePtr, Tcl_Errn
6a00: 6f 4d 73 67 28 2a 65 72 72 6f 72 43 6f 64 65 50 oMsg(*errorCodeP
6a10: 74 72 29 29 3b 0a 0a 09 20 20 20 20 7d 20 65 6c tr));... } el
6a20: 73 65 20 7b 0a 09 09 64 70 72 69 6e 74 66 28 22 se {...dprintf("
6a30: 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 72 I/O error occurr
6a40: 65 64 20 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 ed (backingError
6a50: 20 3d 20 25 6c 75 29 22 2c 20 62 61 63 6b 69 6e = %lu)", backin
6a60: 67 45 72 72 6f 72 29 3b 0a 09 09 2a 65 72 72 6f gError);...*erro
6a70: 72 43 6f 64 65 50 74 72 20 3d 20 54 63 6c 5f 47 rCodePtr = Tcl_G
6a80: 65 74 45 72 72 6e 6f 28 29 3b 0a 09 09 77 72 69 etErrno();...wri
6a90: 74 74 65 6e 20 3d 20 2d 31 3b 0a 09 09 54 6c 73 tten = -1;...Tls
6aa0: 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c _Error(statePtr,
6ab0: 20 45 52 52 5f 72 65 61 73 6f 6e 5f 65 72 72 6f ERR_reason_erro
6ac0: 72 5f 73 74 72 69 6e 67 28 62 61 63 6b 69 6e 67 r_string(backing
6ad0: 45 72 72 6f 72 29 29 3b 0a 09 20 20 20 20 7d 0a Error));.. }.
6ae0: 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 63 61 . break;...ca
6af0: 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 5a 45 52 se SSL_ERROR_ZER
6b00: 4f 5f 52 45 54 55 52 4e 3a 0a 09 20 20 20 20 2f O_RETURN:.. /
6b10: 2a 20 50 65 65 72 20 68 61 73 20 63 6c 65 61 6e * Peer has clean
6b20: 6c 79 20 63 6c 6f 73 65 64 20 74 68 65 20 63 6f ly closed the co
6b30: 6e 6e 65 63 74 69 6f 6e 20 62 79 20 73 65 6e 64 nnection by send
6b40: 69 6e 67 20 74 68 65 20 63 6c 6f 73 65 5f 6e 6f ing the close_no
6b50: 74 69 66 79 0a 09 20 20 20 20 20 20 20 61 6c 65 tify.. ale
6b60: 72 74 2e 20 43 61 6e 27 74 20 72 65 61 64 2c 20 rt. Can't read,
6b70: 62 75 74 20 63 61 6e 20 77 72 69 74 65 2e 20 4e but can write. N
6b80: 65 65 64 20 74 6f 20 72 65 74 75 72 6e 20 61 6e eed to return an
6b90: 20 45 4f 46 2c 20 73 6f 20 74 68 65 0a 09 20 20 EOF, so the..
6ba0: 20 20 20 20 20 63 68 61 6e 6e 65 6c 20 69 73 20 channel is
6bb0: 63 6c 6f 73 65 64 20 77 68 69 63 68 20 77 69 6c closed which wil
6bc0: 6c 20 73 65 6e 64 20 61 6e 20 53 53 4c 5f 73 68 l send an SSL_sh
6bd0: 75 74 64 6f 77 6e 28 29 2e 20 2a 2f 0a 09 20 20 utdown(). */..
6be0: 20 20 64 70 72 69 6e 74 66 28 22 53 53 4c 5f 45 dprintf("SSL_E
6bf0: 52 52 4f 52 5f 5a 45 52 4f 5f 52 45 54 55 52 4e RROR_ZERO_RETURN
6c00: 3a 20 50 65 65 72 20 68 61 73 20 63 6c 6f 73 65 : Peer has close
6c10: 64 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e d the connection
6c20: 22 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 ");.. *errorC
6c30: 6f 64 65 50 74 72 20 3d 20 30 3b 0a 09 20 20 20 odePtr = 0;..
6c40: 20 77 72 69 74 74 65 6e 20 3d 20 30 3b 0a 09 20 written = 0;..
6c50: 20 20 20 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 Tls_Error(sta
6c60: 74 65 50 74 72 2c 20 22 50 65 65 72 20 68 61 73 tePtr, "Peer has
6c70: 20 63 6c 6f 73 65 64 20 74 68 65 20 63 6f 6e 6e closed the conn
6c80: 65 63 74 69 6f 6e 20 66 6f 72 20 77 72 69 74 69 ection for writi
6c90: 6e 67 20 62 79 20 73 65 6e 64 69 6e 67 20 74 68 ng by sending th
6ca0: 65 20 63 6c 6f 73 65 5f 6e 6f 74 69 66 79 20 61 e close_notify a
6cb0: 6c 65 72 74 22 29 3b 0a 09 20 20 20 20 62 72 65 lert");.. bre
6cc0: 61 6b 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45 ak;...case SSL_E
6cd0: 52 52 4f 52 5f 57 41 4e 54 5f 41 53 59 4e 43 3a RROR_WANT_ASYNC:
6ce0: 0a 09 20 20 20 20 2f 2a 20 55 73 65 64 20 77 69 .. /* Used wi
6cf0: 74 68 20 66 6c 61 67 20 53 53 4c 5f 4d 4f 44 45 th flag SSL_MODE
6d00: 5f 41 53 59 4e 43 2c 20 6f 70 65 72 61 74 69 6f _ASYNC, operatio
6d10: 6e 20 64 69 64 6e 27 74 20 63 6f 6d 70 6c 65 74 n didn't complet
6d20: 65 20 62 65 63 61 75 73 65 0a 09 20 20 20 20 20 e because..
6d30: 20 20 61 6e 20 61 73 79 6e 63 20 65 6e 67 69 6e an async engin
6d40: 65 20 69 73 20 73 74 69 6c 6c 20 70 72 6f 63 65 e is still proce
6d50: 73 73 69 6e 67 20 64 61 74 61 2e 20 2a 2f 0a 09 ssing data. */..
6d60: 20 20 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74 dprintf("Got
6d70: 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f SSL_ERROR_WANT_
6d80: 41 53 59 4e 43 2c 20 6d 61 70 70 69 6e 67 20 74 ASYNC, mapping t
6d90: 68 69 73 20 74 6f 20 45 41 47 41 49 4e 22 29 3b his to EAGAIN");
6da0: 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 .. *errorCode
6db0: 50 74 72 20 3d 20 45 41 47 41 49 4e 3b 0a 09 20 Ptr = EAGAIN;..
6dc0: 20 20 20 77 72 69 74 74 65 6e 20 3d 20 30 3b 0a written = 0;.
6dd0: 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 64 65 . break;...de
6de0: 66 61 75 6c 74 3a 0a 09 20 20 20 20 64 70 72 69 fault:.. dpri
6df0: 6e 74 66 28 22 75 6e 6b 6e 6f 77 6e 20 65 72 72 ntf("unknown err
6e00: 6f 72 3a 20 25 64 22 2c 20 65 72 72 29 3b 0a 09 or: %d", err);..
6e10: 20 20 20 20 54 6c 73 5f 45 72 72 6f 72 28 73 74 Tls_Error(st
6e20: 61 74 65 50 74 72 2c 20 22 55 6e 6b 6e 6f 77 6e atePtr, "Unknown
6e30: 20 65 72 72 6f 72 22 29 3b 0a 09 20 20 20 20 62 error");.. b
6e40: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 reak;. }..
6e50: 20 64 70 72 69 6e 74 66 28 22 4f 75 74 70 75 74 dprintf("Output
6e60: 28 25 64 29 20 2d 3e 20 25 64 22 2c 20 74 6f 57 (%d) -> %d", toW
6e70: 72 69 74 65 2c 20 77 72 69 74 74 65 6e 29 3b 0a rite, written);.
6e80: 20 20 20 20 72 65 74 75 72 6e 20 77 72 69 74 74 return writt
6e90: 65 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d en;.}../*. *----
6ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
6ef0: 54 6c 73 5f 47 65 74 50 61 72 65 6e 74 20 2d 2d Tls_GetParent --
6f00: 0a 20 2a 0a 20 2a 09 47 65 74 20 70 61 72 65 6e . *. *.Get paren
6f10: 74 20 63 68 61 6e 6e 65 6c 20 66 6f 72 20 61 20 t channel for a
6f20: 73 74 61 63 6b 65 64 20 63 68 61 6e 6e 65 6c 2e stacked channel.
6f30: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
6f40: 20 2a 09 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 6f *.Tcl_Channel o
6f50: 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 6e 65 2e 0a r NULL if none..
6f60: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
6f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6fb0: 2d 2d 0a 20 2a 2f 0a 54 63 6c 5f 43 68 61 6e 6e --. */.Tcl_Chann
6fc0: 65 6c 20 54 6c 73 5f 47 65 74 50 61 72 65 6e 74 el Tls_GetParent
6fd0: 28 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 (. State *sta
6fe0: 74 65 50 74 72 2c 09 09 2f 2a 20 43 6f 6e 6e 65 tePtr,../* Conne
6ff0: 63 74 69 6f 6e 20 73 74 61 74 65 20 69 6e 66 6f ction state info
7000: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 61 73 6b */. int mask
7010: 46 6c 61 67 73 29 09 09 2f 2a 20 57 68 69 63 68 Flags)../* Which
7020: 20 66 6c 61 67 73 20 74 6f 20 70 72 6f 63 65 73 flags to proces
7030: 73 20 2a 2f 0a 7b 0a 20 20 20 20 64 70 72 69 6e s */.{. dprin
7040: 74 66 28 22 52 65 71 75 65 73 74 65 64 20 74 6f tf("Requested to
7050: 20 67 65 74 20 70 61 72 65 6e 74 20 6f 66 20 63 get parent of c
7060: 68 61 6e 6e 65 6c 20 25 70 22 2c 20 73 74 61 74 hannel %p", stat
7070: 65 50 74 72 2d 3e 73 65 6c 66 29 3b 0a 0a 20 20 ePtr->self);..
7080: 20 20 69 66 20 28 28 73 74 61 74 65 50 74 72 2d if ((statePtr-
7090: 3e 66 6c 61 67 73 20 26 20 7e 6d 61 73 6b 46 6c >flags & ~maskFl
70a0: 61 67 73 29 20 26 20 54 4c 53 5f 54 43 4c 5f 46 ags) & TLS_TCL_F
70b0: 41 53 54 50 41 54 48 29 20 7b 0a 09 64 70 72 69 ASTPATH) {..dpri
70c0: 6e 74 66 28 22 41 73 6b 65 64 20 74 6f 20 67 65 ntf("Asked to ge
70d0: 74 20 74 68 65 20 70 61 72 65 6e 74 20 63 68 61 t the parent cha
70e0: 6e 6e 65 6c 20 77 68 69 6c 65 20 77 65 20 61 72 nnel while we ar
70f0: 65 20 75 73 69 6e 67 20 46 61 73 74 50 61 74 68 e using FastPath
7100: 20 2d 2d 20 72 65 74 75 72 6e 69 6e 67 20 4e 55 -- returning NU
7110: 4c 4c 22 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 LL");..return NU
7120: 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 LL;. }. re
7130: 74 75 72 6e 20 54 63 6c 5f 47 65 74 53 74 61 63 turn Tcl_GetStac
7140: 6b 65 64 43 68 61 6e 6e 65 6c 28 73 74 61 74 65 kedChannel(state
7150: 50 74 72 2d 3e 73 65 6c 66 29 3b 0a 7d 0a 0a 2f Ptr->self);.}../
7160: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
7170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
71a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
71b0: 2d 0a 20 2a 0a 20 2a 20 54 6c 73 53 65 74 4f 70 -. *. * TlsSetOp
71c0: 74 69 6f 6e 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 tionProc --. *.
71d0: 2a 09 53 65 74 73 20 61 6e 20 6f 70 74 69 6f 6e *.Sets an option
71e0: 20 74 6f 20 76 61 6c 75 65 20 66 6f 72 20 61 20 to value for a
71f0: 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64 SSL socket based
7200: 20 63 68 61 6e 6e 65 6c 2e 20 43 61 6c 6c 65 64 channel. Called
7210: 20 62 79 20 74 68 65 0a 20 2a 09 67 65 6e 65 72 by the. *.gener
7220: 69 63 20 49 2f 4f 20 6c 61 79 65 72 20 77 68 65 ic I/O layer whe
7230: 6e 65 76 65 72 20 74 68 65 20 54 63 6c 5f 53 65 never the Tcl_Se
7240: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 29 tChannelOption()
7250: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 function is use
7260: 64 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 d.. *. * Results
7270: 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 69 66 20 73 :. *.TCL_OK if s
7280: 75 63 63 65 73 73 66 75 6c 20 6f 72 20 54 43 4c uccessful or TCL
7290: 5f 45 52 52 4f 52 20 69 66 20 66 61 69 6c 65 64 _ERROR if failed
72a0: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 .. *. * Side eff
72b0: 65 63 74 73 3a 0a 20 2a 09 55 70 64 61 74 65 73 ects:. *.Updates
72c0: 20 63 68 61 6e 6e 65 6c 20 6f 70 74 69 6f 6e 20 channel option
72d0: 74 6f 20 6e 65 77 20 76 61 6c 75 65 2e 0a 20 2a to new value.. *
72e0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
72f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7330: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a . */.static int.
7340: 54 6c 73 53 65 74 4f 70 74 69 6f 6e 50 72 6f 63 TlsSetOptionProc
7350: 28 0a 20 20 20 20 43 6c 69 65 6e 74 44 61 74 61 (. ClientData
7360: 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 09 2f instanceData,./
7370: 2a 20 53 6f 63 6b 65 74 20 73 74 61 74 65 2e 20 * Socket state.
7380: 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 */. Tcl_Inter
7390: 70 20 2a 69 6e 74 65 72 70 2c 09 09 2f 2a 20 46 p *interp,../* F
73a0: 6f 72 20 65 72 72 6f 72 73 20 2d 20 63 61 6e 20 or errors - can
73b0: 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 20 20 be NULL. */.
73c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 6f 70 74 69 const char *opti
73d0: 6f 6e 4e 61 6d 65 2c 09 2f 2a 20 4e 61 6d 65 20 onName,./* Name
73e0: 6f 66 20 74 68 65 20 6f 70 74 69 6f 6e 20 74 6f of the option to
73f0: 20 73 65 74 20 74 68 65 20 76 61 6c 75 65 20 66 set the value f
7400: 6f 72 2c 20 6f 72 0a 09 09 09 09 20 2a 20 4e 55 or, or..... * NU
7410: 4c 4c 20 74 6f 20 67 65 74 20 61 6c 6c 20 6f 70 LL to get all op
7420: 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 69 72 20 tions and their
7430: 76 61 6c 75 65 73 2e 20 2a 2f 0a 20 20 20 20 63 values. */. c
7440: 6f 6e 73 74 20 63 68 61 72 20 2a 6f 70 74 69 6f onst char *optio
7450: 6e 56 61 6c 75 65 29 09 2f 2a 20 56 61 6c 75 65 nValue)./* Value
7460: 20 66 6f 72 20 6f 70 74 69 6f 6e 2e 20 2a 2f 0a for option. */.
7470: 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 {. State *sta
7480: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a tePtr = (State *
7490: 29 20 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a ) instanceData;.
74a0: 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 Tcl_Channel
74b0: 70 61 72 65 6e 74 20 3d 20 54 6c 73 5f 47 65 74 parent = Tls_Get
74c0: 50 61 72 65 6e 74 28 73 74 61 74 65 50 74 72 2c Parent(statePtr,
74d0: 20 54 4c 53 5f 54 43 4c 5f 46 41 53 54 50 41 54 TLS_TCL_FASTPAT
74e0: 48 29 3b 0a 20 20 20 20 54 63 6c 5f 44 72 69 76 H);. Tcl_Driv
74f0: 65 72 53 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 erSetOptionProc
7500: 2a 73 65 74 4f 70 74 69 6f 6e 50 72 6f 63 3b 0a *setOptionProc;.
7510: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
7520: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 lled");.. /*
7530: 50 61 73 73 20 74 6f 20 70 61 72 65 6e 74 20 2a Pass to parent *
7540: 2f 0a 20 20 20 20 73 65 74 4f 70 74 69 6f 6e 50 /. setOptionP
7550: 72 6f 63 20 3d 20 54 63 6c 5f 43 68 61 6e 6e 65 roc = Tcl_Channe
7560: 6c 53 65 74 4f 70 74 69 6f 6e 50 72 6f 63 28 54 lSetOptionProc(T
7570: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 cl_GetChannelTyp
7580: 65 28 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 e(parent));.
7590: 69 66 20 28 73 65 74 4f 70 74 69 6f 6e 50 72 6f if (setOptionPro
75a0: 63 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 c != NULL) {..re
75b0: 74 75 72 6e 20 28 2a 73 65 74 4f 70 74 69 6f 6e turn (*setOption
75c0: 50 72 6f 63 29 28 54 63 6c 5f 47 65 74 43 68 61 Proc)(Tcl_GetCha
75d0: 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 nnelInstanceData
75e0: 28 70 61 72 65 6e 74 29 2c 20 69 6e 74 65 72 70 (parent), interp
75f0: 2c 20 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20 6f 70 , optionName, op
7600: 74 69 6f 6e 56 61 6c 75 65 29 3b 0a 20 20 20 20 tionValue);.
7610: 7d 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 }. /*. *
7620: 52 65 71 75 65 73 74 20 66 6f 72 20 61 20 73 70 Request for a sp
7630: 65 63 69 66 69 63 20 6f 70 74 69 6f 6e 20 68 61 ecific option ha
7640: 73 20 74 6f 20 66 61 69 6c 2c 20 77 65 20 64 6f s to fail, we do
7650: 6e 27 74 20 68 61 76 65 20 61 6e 79 2e 0a 20 20 n't have any..
7660: 20 20 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e */. return
7670: 20 54 63 6c 5f 42 61 64 43 68 61 6e 6e 65 6c 4f Tcl_BadChannelO
7680: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 6f 70 ption(interp, op
7690: 74 69 6f 6e 4e 61 6d 65 2c 20 22 22 29 3b 0a 7d tionName, "");.}
76a0: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
76b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
76c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
76d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
76e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
76f0: 20 54 6c 73 47 65 74 4f 70 74 69 6f 6e 50 72 6f TlsGetOptionPro
7700: 63 20 2d 2d 0a 20 2a 0a 20 2a 09 47 65 74 20 61 c --. *. *.Get a
7710: 20 6f 70 74 69 6f 6e 27 73 20 76 61 6c 75 65 20 option's value
7720: 66 6f 72 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 for a SSL socket
7730: 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 2c 20 based channel,
7740: 6f 72 20 61 20 6c 69 73 74 20 6f 66 20 61 6c 6c or a list of all
7750: 0a 20 2a 09 6f 70 74 69 6f 6e 73 20 61 6e 64 20 . *.options and
7760: 74 68 65 69 72 20 76 61 6c 75 65 73 2e 20 43 61 their values. Ca
7770: 6c 6c 65 64 20 62 79 20 74 68 65 20 67 65 6e 65 lled by the gene
7780: 72 69 63 20 49 2f 4f 20 6c 61 79 65 72 20 77 68 ric I/O layer wh
7790: 65 6e 65 76 65 72 20 74 68 65 0a 20 2a 09 54 63 enever the. *.Tc
77a0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 l_GetChannelOpti
77b0: 6f 6e 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 on() function is
77c0: 20 75 73 65 64 2e 0a 20 2a 0a 20 2a 0a 20 2a 20 used.. *. *. *
77d0: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 Results:. *.A st
77e0: 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c andard Tcl resul
77f0: 74 2e 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 t. The value of
7800: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6f 70 the specified op
7810: 74 69 6f 6e 20 6f 72 20 61 20 6c 69 73 74 20 6f tion or a list o
7820: 66 0a 20 2a 09 61 6c 6c 20 6f 70 74 69 6f 6e 73 f. *.all options
7830: 20 61 6e 64 20 74 68 65 69 72 20 76 61 6c 75 65 and their value
7840: 73 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 6e s is returned in
7850: 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 44 53 the supplied DS
7860: 74 72 69 6e 67 2e 0a 20 2a 0a 20 2a 20 53 69 64 tring.. *. * Sid
7870: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f e effects:. *.No
7880: 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ne.. *. *-------
7890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
78a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
78b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
78c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
78d0: 0a 73 74 61 74 69 63 20 69 6e 74 0a 54 6c 73 47 .static int.TlsG
78e0: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 28 0a 20 20 etOptionProc(.
78f0: 20 20 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 ClientData ins
7900: 74 61 6e 63 65 44 61 74 61 2c 09 2f 2a 20 53 6f tanceData,./* So
7910: 63 6b 65 74 20 73 74 61 74 65 2e 20 2a 2f 0a 20 cket state. */.
7920: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 Tcl_Interp *i
7930: 6e 74 65 72 70 2c 09 09 2f 2a 20 46 6f 72 20 65 nterp,../* For e
7940: 72 72 6f 72 73 20 2d 20 63 61 6e 20 62 65 20 4e rrors - can be N
7950: 55 4c 4c 2e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 ULL. */. cons
7960: 74 20 63 68 61 72 20 2a 6f 70 74 69 6f 6e 4e 61 t char *optionNa
7970: 6d 65 2c 09 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 me,./* Name of t
7980: 68 65 20 6f 70 74 69 6f 6e 20 74 6f 20 72 65 74 he option to ret
7990: 72 69 65 76 65 20 74 68 65 20 76 61 6c 75 65 20 rieve the value
79a0: 66 6f 72 2c 0a 09 09 09 09 20 2a 20 6f 72 20 4e for,..... * or N
79b0: 55 4c 4c 20 74 6f 20 67 65 74 20 61 6c 6c 20 6f ULL to get all o
79c0: 70 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 69 72 ptions and their
79d0: 20 76 61 6c 75 65 73 2e 20 2a 2f 0a 20 20 20 20 values. */.
79e0: 54 63 6c 5f 44 53 74 72 69 6e 67 20 2a 6f 70 74 Tcl_DString *opt
79f0: 69 6f 6e 56 61 6c 75 65 29 09 2f 2a 20 57 68 65 ionValue)./* Whe
7a00: 72 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 re to store the
7a10: 63 6f 6d 70 75 74 65 64 20 76 61 6c 75 65 20 69 computed value i
7a20: 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20 63 61 nitialized by ca
7a30: 6c 6c 65 72 2e 20 2a 2f 0a 7b 0a 20 20 20 20 53 ller. */.{. S
7a40: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d tate *statePtr =
7a50: 20 28 53 74 61 74 65 20 2a 29 20 69 6e 73 74 61 (State *) insta
7a60: 6e 63 65 44 61 74 61 3b 0a 20 20 20 20 54 63 6c nceData;. Tcl
7a70: 5f 43 68 61 6e 6e 65 6c 20 70 61 72 65 6e 74 20 _Channel parent
7a80: 3d 20 54 6c 73 5f 47 65 74 50 61 72 65 6e 74 28 = Tls_GetParent(
7a90: 73 74 61 74 65 50 74 72 2c 20 54 4c 53 5f 54 43 statePtr, TLS_TC
7aa0: 4c 5f 46 41 53 54 50 41 54 48 29 3b 0a 20 20 20 L_FASTPATH);.
7ab0: 20 54 63 6c 5f 44 72 69 76 65 72 47 65 74 4f 70 Tcl_DriverGetOp
7ac0: 74 69 6f 6e 50 72 6f 63 20 2a 67 65 74 4f 70 74 tionProc *getOpt
7ad0: 69 6f 6e 50 72 6f 63 3b 0a 0a 20 20 20 20 64 70 ionProc;.. dp
7ae0: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b rintf("Called");
7af0: 0a 0a 20 20 20 20 2f 2a 20 50 61 73 73 20 74 6f .. /* Pass to
7b00: 20 70 61 72 65 6e 74 20 2a 2f 0a 20 20 20 20 67 parent */. g
7b10: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 3d 20 54 etOptionProc = T
7b20: 63 6c 5f 43 68 61 6e 6e 65 6c 47 65 74 4f 70 74 cl_ChannelGetOpt
7b30: 69 6f 6e 50 72 6f 63 28 54 63 6c 5f 47 65 74 43 ionProc(Tcl_GetC
7b40: 68 61 6e 6e 65 6c 54 79 70 65 28 70 61 72 65 6e hannelType(paren
7b50: 74 29 29 3b 0a 20 20 20 20 69 66 20 28 67 65 74 t));. if (get
7b60: 4f 70 74 69 6f 6e 50 72 6f 63 20 21 3d 20 4e 55 OptionProc != NU
7b70: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 28 2a LL) {..return (*
7b80: 67 65 74 4f 70 74 69 6f 6e 50 72 6f 63 29 28 54 getOptionProc)(T
7b90: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 cl_GetChannelIns
7ba0: 74 61 6e 63 65 44 61 74 61 28 70 61 72 65 6e 74 tanceData(parent
7bb0: 29 2c 20 69 6e 74 65 72 70 2c 0a 09 20 20 20 20 ), interp,..
7bc0: 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20 6f 70 74 69 optionName, opti
7bd0: 6f 6e 56 61 6c 75 65 29 3b 0a 20 20 20 20 7d 20 onValue);. }
7be0: 65 6c 73 65 20 69 66 20 28 6f 70 74 69 6f 6e 4e else if (optionN
7bf0: 61 6d 65 20 3d 3d 20 28 63 68 61 72 2a 29 20 4e ame == (char*) N
7c00: 55 4c 4c 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 52 ULL) {../*.. * R
7c10: 65 71 75 65 73 74 20 69 73 20 71 75 65 72 79 20 equest is query
7c20: 66 6f 72 20 61 6c 6c 20 6f 70 74 69 6f 6e 73 2c for all options,
7c30: 20 74 68 69 73 20 69 73 20 6f 6b 2e 0a 09 20 2a this is ok... *
7c40: 2f 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b /..return TCL_OK
7c50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 0a 20 ;. }. /*.
7c60: 20 20 20 20 2a 20 52 65 71 75 65 73 74 20 66 6f * Request fo
7c70: 72 20 61 20 73 70 65 63 69 66 69 63 20 6f 70 74 r a specific opt
7c80: 69 6f 6e 20 68 61 73 20 74 6f 20 66 61 69 6c 2c ion has to fail,
7c90: 20 77 65 20 64 6f 6e 27 74 20 68 61 76 65 20 61 we don't have a
7ca0: 6e 79 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 ny.. */.
7cb0: 72 65 74 75 72 6e 20 54 63 6c 5f 42 61 64 43 68 return Tcl_BadCh
7cc0: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 annelOption(inte
7cd0: 72 70 2c 20 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20 rp, optionName,
7ce0: 22 22 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d "");.}../*. *---
7cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
7d40: 20 54 6c 73 43 68 61 6e 6e 65 6c 48 61 6e 64 6c TlsChannelHandl
7d50: 65 72 54 69 6d 65 72 20 2d 2d 0a 20 2a 0a 20 2a erTimer --. *. *
7d60: 09 43 61 6c 6c 65 64 20 62 79 20 74 68 65 20 6e .Called by the n
7d70: 6f 74 69 66 69 65 72 20 76 69 61 20 61 20 74 69 otifier via a ti
7d80: 6d 65 72 2c 20 74 6f 20 66 6c 75 73 68 20 6f 75 mer, to flush ou
7d90: 74 20 64 61 74 61 20 77 61 69 74 69 6e 67 20 69 t data waiting i
7da0: 6e 0a 20 2a 09 63 68 61 6e 6e 65 6c 20 62 75 66 n. *.channel buf
7db0: 66 65 72 73 2e 20 63 61 6c 6c 65 64 20 62 79 20 fers. called by
7dc0: 74 68 65 20 67 65 6e 65 72 69 63 20 49 2f 4f 20 the generic I/O
7dd0: 6c 61 79 65 72 20 77 68 65 6e 65 76 65 72 20 74 layer whenever t
7de0: 68 65 0a 20 2a 09 54 63 6c 5f 47 65 74 43 68 61 he. *.Tcl_GetCha
7df0: 6e 6e 65 6c 48 61 6e 64 6c 65 28 29 20 66 75 6e nnelHandle() fun
7e00: 63 74 69 6f 6e 20 69 73 20 75 73 65 64 2e 0a 20 ction is used..
7e10: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
7e20: 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 .None.. *. * Sid
7e30: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 72 e effects:. *.Cr
7e40: 65 61 74 65 73 20 6e 6f 74 69 66 69 63 61 74 69 eates notificati
7e50: 6f 6e 20 65 76 65 6e 74 2e 0a 20 2a 0a 20 2a 2d on event.. *. *-
7e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
7eb0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 54 6c 73 .static void Tls
7ec0: 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 54 69 ChannelHandlerTi
7ed0: 6d 65 72 28 0a 20 20 20 20 43 6c 69 65 6e 74 44 mer(. ClientD
7ee0: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 29 09 ata clientData).
7ef0: 2f 2a 20 53 6f 63 6b 65 74 20 73 74 61 74 65 2e /* Socket state.
7f00: 20 2a 2f 0a 7b 0a 20 20 20 20 53 74 61 74 65 20 */.{. State
7f10: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 *statePtr = (Sta
7f20: 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 te *) clientData
7f30: 3b 0a 20 20 20 20 69 6e 74 20 6d 61 73 6b 20 3d ;. int mask =
7f40: 20 73 74 61 74 65 50 74 72 2d 3e 77 61 6e 74 3b statePtr->want;
7f50: 20 2f 2a 20 49 6e 69 74 20 74 6f 20 53 53 4c 5f /* Init to SSL_
7f60: 45 52 52 4f 52 5f 57 41 4e 54 5f 52 45 41 44 20 ERROR_WANT_READ
7f70: 61 6e 64 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 and SSL_ERROR_WA
7f80: 4e 54 5f 57 52 49 54 45 20 2a 2f 0a 0a 20 20 20 NT_WRITE */..
7f90: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
7fa0: 20 77 69 74 68 20 6d 61 73 6b 20 30 78 25 30 32 with mask 0x%02
7fb0: 78 22 2c 20 6d 61 73 6b 29 3b 0a 0a 20 20 20 20 x", mask);..
7fc0: 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 statePtr->timer
7fd0: 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 = (Tcl_TimerToke
7fe0: 6e 29 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a n) NULL;.. /*
7ff0: 20 43 68 65 63 6b 20 66 6f 72 20 61 6d 6f 75 6e Check for amoun
8000: 74 20 6f 66 20 64 61 74 61 20 70 65 6e 64 69 6e t of data pendin
8010: 67 20 69 6e 20 49 4f 20 6f 72 20 42 49 4f 20 77 g in IO or BIO w
8020: 72 69 74 65 20 62 75 66 66 65 72 20 2a 2f 0a 20 rite buffer */.
8030: 20 20 20 69 66 20 28 54 63 6c 5f 4f 75 74 70 75 if (Tcl_Outpu
8040: 74 42 75 66 66 65 72 65 64 28 73 74 61 74 65 50 tBuffered(stateP
8050: 74 72 2d 3e 73 65 6c 66 29 20 7c 7c 20 42 49 4f tr->self) || BIO
8060: 5f 77 70 65 6e 64 69 6e 67 28 73 74 61 74 65 50 _wpending(stateP
8070: 74 72 2d 3e 62 69 6f 29 29 20 7b 0a 09 64 70 72 tr->bio)) {..dpr
8080: 69 6e 74 66 28 22 5b 63 68 61 6e 3d 25 70 5d 20 intf("[chan=%p]
8090: 42 49 4f 20 77 72 69 74 61 62 6c 65 22 2c 20 73 BIO writable", s
80a0: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 3b 0a tatePtr->self);.
80b0: 0a 09 6d 61 73 6b 20 7c 3d 20 54 43 4c 5f 57 52 ..mask |= TCL_WR
80c0: 49 54 41 42 4c 45 3b 0a 20 20 20 20 7d 0a 0a 20 ITABLE;. }..
80d0: 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 /* Check for
80e0: 61 6d 6f 75 6e 74 20 6f 66 20 64 61 74 61 20 70 amount of data p
80f0: 65 6e 64 69 6e 67 20 69 6e 20 49 4f 20 6f 72 20 ending in IO or
8100: 42 49 4f 20 72 65 61 64 20 62 75 66 66 65 72 20 BIO read buffer
8110: 2a 2f 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 49 */. if (Tcl_I
8120: 6e 70 75 74 42 75 66 66 65 72 65 64 28 73 74 61 nputBuffered(sta
8130: 74 65 50 74 72 2d 3e 73 65 6c 66 29 20 7c 7c 20 tePtr->self) ||
8140: 42 49 4f 5f 70 65 6e 64 69 6e 67 28 73 74 61 74 BIO_pending(stat
8150: 65 50 74 72 2d 3e 62 69 6f 29 29 20 7b 0a 09 64 ePtr->bio)) {..d
8160: 70 72 69 6e 74 66 28 22 5b 63 68 61 6e 3d 25 70 printf("[chan=%p
8170: 5d 20 42 49 4f 20 72 65 61 64 61 62 6c 65 22 2c ] BIO readable",
8180: 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 statePtr->self)
8190: 3b 0a 0a 09 6d 61 73 6b 20 7c 3d 20 54 43 4c 5f ;...mask |= TCL_
81a0: 52 45 41 44 41 42 4c 45 3b 0a 20 20 20 20 7d 0a READABLE;. }.
81b0: 0a 20 20 20 20 2f 2a 20 4e 6f 74 69 66 79 20 74 . /* Notify t
81c0: 68 65 20 67 65 6e 65 72 69 63 20 49 4f 20 6c 61 he generic IO la
81d0: 79 65 72 20 74 68 61 74 20 6d 61 73 6b 20 65 76 yer that mask ev
81e0: 65 6e 74 73 20 68 61 76 65 20 6f 63 63 75 72 72 ents have occurr
81f0: 65 64 20 6f 6e 20 74 68 65 20 63 68 61 6e 6e 65 ed on the channe
8200: 6c 20 2a 2f 0a 20 20 20 20 64 70 72 69 6e 74 66 l */. dprintf
8210: 28 22 4e 6f 74 69 66 79 69 6e 67 20 6f 75 72 73 ("Notifying ours
8220: 65 6c 76 65 73 20 77 69 74 68 20 6d 61 73 6b 3d elves with mask=
8230: 25 64 22 2c 20 6d 61 73 6b 29 3b 0a 20 20 20 20 %d", mask);.
8240: 54 63 6c 5f 4e 6f 74 69 66 79 43 68 61 6e 6e 65 Tcl_NotifyChanne
8250: 6c 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 l(statePtr->self
8260: 2c 20 6d 61 73 6b 29 3b 0a 20 20 20 20 73 74 61 , mask);. sta
8270: 74 65 50 74 72 2d 3e 77 61 6e 74 20 3d 20 30 3b tePtr->want = 0;
8280: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a . return;.}..
8290: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
82a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
82b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
82c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
82d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
82e0: 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 57 61 74 63 --. *. * TlsWatc
82f0: 68 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 53 hProc --. *. *.S
8300: 65 74 20 75 70 20 74 68 65 20 65 76 65 6e 74 20 et up the event
8310: 6e 6f 74 69 66 69 65 72 20 74 6f 20 77 61 74 63 notifier to watc
8320: 68 20 66 6f 72 20 65 76 65 6e 74 73 20 6f 66 20 h for events of
8330: 69 6e 74 65 72 65 73 74 20 66 72 6f 6d 20 74 68 interest from th
8340: 69 73 0a 20 2a 09 63 68 61 6e 6e 65 6c 2e 20 43 is. *.channel. C
8350: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 67 65 6e alled by the gen
8360: 65 72 69 63 20 49 2f 4f 20 6c 61 79 65 72 20 77 eric I/O layer w
8370: 68 65 6e 65 76 65 72 20 74 68 65 20 75 73 65 72 henever the user
8380: 20 28 6f 72 20 74 68 65 0a 20 2a 09 73 79 73 74 (or the. *.syst
8390: 65 6d 29 20 61 6e 6e 6f 75 6e 63 65 73 20 69 74 em) announces it
83a0: 73 20 28 64 69 73 29 69 6e 74 65 72 65 73 74 20 s (dis)interest
83b0: 69 6e 20 65 76 65 6e 74 73 20 6f 6e 20 74 68 65 in events on the
83c0: 20 63 68 61 6e 6e 65 6c 2e 20 54 68 69 73 20 69 channel. This i
83d0: 73 0a 20 2a 09 63 61 6c 6c 65 64 20 72 65 70 65 s. *.called repe
83e0: 61 74 65 64 6c 79 2e 0a 20 2a 0a 20 2a 20 52 65 atedly.. *. * Re
83f0: 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a sults:. *.None..
8400: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
8410: 74 73 3a 0a 20 2a 09 53 65 74 73 20 75 70 20 74 ts:. *.Sets up t
8420: 68 65 20 74 69 6d 65 2d 62 61 73 65 64 20 6e 6f he time-based no
8430: 74 69 66 69 65 72 20 73 6f 20 74 68 61 74 20 66 tifier so that f
8440: 75 74 75 72 65 20 65 76 65 6e 74 73 20 6f 6e 20 uture events on
8450: 74 68 65 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 77 the channel. *.w
8460: 69 6c 6c 20 62 65 20 73 65 65 6e 20 62 79 20 54 ill be seen by T
8470: 43 4c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d CL.. *. *-------
8480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
84a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
84b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
84c0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 ------. */.stati
84d0: 63 20 76 6f 69 64 0a 54 6c 73 57 61 74 63 68 50 c void.TlsWatchP
84e0: 72 6f 63 28 0a 20 20 20 20 43 6c 69 65 6e 74 44 roc(. ClientD
84f0: 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 ata instanceData
8500: 2c 09 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 ,./* Connection
8510: 73 74 61 74 65 20 69 6e 66 6f 20 2a 2f 0a 20 20 state info */.
8520: 20 20 69 6e 74 20 6d 61 73 6b 29 09 09 09 2f 2a int mask).../*
8530: 20 45 76 65 6e 74 73 20 6f 66 20 69 6e 74 65 72 Events of inter
8540: 65 73 74 3b 20 61 6e 20 4f 52 2d 65 64 20 63 6f est; an OR-ed co
8550: 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 0a 09 09 09 mbination of....
8560: 09 20 2a 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 . * TCL_READABLE
8570: 2c 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 20 61 , TCL_WRITABLE a
8580: 6e 64 20 54 43 4c 5f 45 58 43 45 50 54 49 4f 4e nd TCL_EXCEPTION
8590: 2e 20 2a 2f 0a 7b 0a 20 20 20 20 54 63 6c 5f 43 . */.{. Tcl_C
85a0: 68 61 6e 6e 65 6c 20 70 61 72 65 6e 74 3b 0a 20 hannel parent;.
85b0: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 State *stateP
85c0: 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 20 69 tr = (State *) i
85d0: 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 20 20 20 nstanceData;.
85e0: 20 54 63 6c 5f 44 72 69 76 65 72 57 61 74 63 68 Tcl_DriverWatch
85f0: 50 72 6f 63 20 2a 77 61 74 63 68 50 72 6f 63 3b Proc *watchProc;
8600: 0a 20 20 20 20 69 6e 74 20 70 65 6e 64 69 6e 67 . int pending
8610: 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e = 0;.. dprin
8620: 74 66 28 22 43 61 6c 6c 65 64 20 77 69 74 68 20 tf("Called with
8630: 6d 61 73 6b 20 30 78 25 30 32 78 22 2c 20 6d 61 mask 0x%02x", ma
8640: 73 6b 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 46 sk);. dprintF
8650: 6c 61 67 73 28 73 74 61 74 65 50 74 72 29 3b 0a lags(statePtr);.
8660: 0a 20 20 20 20 2f 2a 20 41 62 6f 72 74 20 69 66 . /* Abort if
8670: 20 74 68 65 20 75 73 65 72 20 76 65 72 69 66 79 the user verify
8680: 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 73 74 69 callback is sti
8690: 6c 6c 20 72 75 6e 6e 69 6e 67 20 74 6f 20 61 76 ll running to av
86a0: 6f 69 64 20 74 72 69 67 67 65 72 69 6e 67 0a 20 oid triggering.
86b0: 20 20 20 20 2a 20 61 6e 6f 74 68 65 72 20 63 61 * another ca
86c0: 6c 6c 20 62 65 66 6f 72 65 20 74 68 65 20 63 75 ll before the cu
86d0: 72 72 65 6e 74 20 6f 6e 65 20 69 73 20 63 6f 6d rrent one is com
86e0: 70 6c 65 74 65 2e 20 2a 2f 0a 20 20 20 20 69 66 plete. */. if
86f0: 20 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 (statePtr->flag
8700: 73 20 26 20 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c s & TLS_TCL_CALL
8710: 42 41 43 4b 29 20 7b 0a 09 64 70 72 69 6e 74 66 BACK) {..dprintf
8720: 28 22 43 61 6c 6c 62 61 63 6b 20 69 73 20 6f 6e ("Callback is on
8730: 2d 67 6f 69 6e 67 2c 20 64 6f 69 6e 67 20 6e 6f -going, doing no
8740: 74 68 69 6e 67 22 29 3b 0a 09 72 65 74 75 72 6e thing");..return
8750: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 61 72 ;. }.. par
8760: 65 6e 74 20 3d 20 54 6c 73 5f 47 65 74 50 61 72 ent = Tls_GetPar
8770: 65 6e 74 28 73 74 61 74 65 50 74 72 2c 20 54 4c ent(statePtr, TL
8780: 53 5f 54 43 4c 5f 46 41 53 54 50 41 54 48 29 3b S_TCL_FASTPATH);
8790: 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 .. if (stateP
87a0: 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f tr->flags & TLS_
87b0: 54 43 4c 5f 48 41 4e 44 53 48 41 4b 45 5f 46 41 TCL_HANDSHAKE_FA
87c0: 49 4c 45 44 29 20 7b 0a 09 64 70 72 69 6e 74 66 ILED) {..dprintf
87d0: 28 22 41 73 6b 65 64 20 74 6f 20 77 61 74 63 68 ("Asked to watch
87e0: 20 61 20 73 6f 63 6b 65 74 20 77 69 74 68 20 61 a socket with a
87f0: 20 66 61 69 6c 65 64 20 68 61 6e 64 73 68 61 6b failed handshak
8800: 65 20 2d 2d 20 6e 6f 74 68 69 6e 67 20 63 61 6e e -- nothing can
8810: 20 68 61 70 70 65 6e 20 68 65 72 65 22 29 3b 0a happen here");.
8820: 09 64 70 72 69 6e 74 66 28 22 55 6e 72 65 67 69 .dprintf("Unregi
8830: 73 74 65 72 69 6e 67 20 69 6e 74 65 72 65 73 74 stering interest
8840: 20 69 6e 20 74 68 65 20 6c 6f 77 65 72 20 63 68 in the lower ch
8850: 61 6e 6e 65 6c 22 29 3b 0a 0a 09 77 61 74 63 68 annel");...watch
8860: 50 72 6f 63 20 3d 20 54 63 6c 5f 43 68 61 6e 6e Proc = Tcl_Chann
8870: 65 6c 57 61 74 63 68 50 72 6f 63 28 54 63 6c 5f elWatchProc(Tcl_
8880: 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 70 GetChannelType(p
8890: 61 72 65 6e 74 29 29 3b 0a 09 77 61 74 63 68 50 arent));..watchP
88a0: 72 6f 63 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e roc(Tcl_GetChann
88b0: 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 70 elInstanceData(p
88c0: 61 72 65 6e 74 29 2c 20 30 29 3b 0a 09 73 74 61 arent), 0);..sta
88d0: 74 65 50 74 72 2d 3e 77 61 74 63 68 4d 61 73 6b tePtr->watchMask
88e0: 20 3d 20 30 3b 0a 09 72 65 74 75 72 6e 3b 0a 20 = 0;..return;.
88f0: 20 20 20 7d 0a 0a 20 20 20 20 73 74 61 74 65 50 }.. stateP
8900: 74 72 2d 3e 77 61 74 63 68 4d 61 73 6b 20 3d 20 tr->watchMask =
8910: 6d 61 73 6b 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 mask;.. /*.
8920: 20 20 20 2a 20 4e 6f 20 63 68 61 6e 6e 65 6c 20 * No channel
8930: 68 61 6e 64 6c 65 72 73 20 61 6e 79 20 6d 6f 72 handlers any mor
8940: 65 2e 20 57 65 20 77 69 6c 6c 20 62 65 20 6e 6f e. We will be no
8950: 74 69 66 69 65 64 20 61 75 74 6f 6d 61 74 69 63 tified automatic
8960: 61 6c 6c 79 20 61 62 6f 75 74 0a 20 20 20 20 20 ally about.
8970: 2a 20 65 76 65 6e 74 73 20 6f 6e 20 74 68 65 20 * events on the
8980: 63 68 61 6e 6e 65 6c 20 62 65 6c 6f 77 20 76 69 channel below vi
8990: 61 20 61 20 63 61 6c 6c 20 74 6f 20 6f 75 72 20 a a call to our
89a0: 27 54 72 61 6e 73 66 6f 72 6d 4e 6f 74 69 66 79 'TransformNotify
89b0: 50 72 6f 63 27 2e 20 42 75 74 0a 20 20 20 20 20 Proc'. But.
89c0: 2a 20 77 65 20 68 61 76 65 20 74 6f 20 70 61 73 * we have to pas
89d0: 73 20 74 68 65 20 69 6e 74 65 72 65 73 74 20 64 s the interest d
89e0: 6f 77 6e 20 6e 6f 77 2e 20 57 65 20 61 72 65 20 own now. We are
89f0: 61 6c 6c 6f 77 65 64 20 74 6f 20 61 64 64 20 61 allowed to add a
8a00: 64 64 69 74 69 6f 6e 61 6c 0a 20 20 20 20 20 2a dditional. *
8a10: 20 27 69 6e 74 65 72 65 73 74 27 20 74 6f 20 74 'interest' to t
8a20: 68 65 20 6d 61 73 6b 20 69 66 20 77 65 20 77 61 he mask if we wa
8a30: 6e 74 20 74 6f 2c 20 62 75 74 20 74 68 69 73 20 nt to, but this
8a40: 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 68 transformation h
8a50: 61 73 20 6e 6f 0a 20 20 20 20 20 2a 20 73 75 63 as no. * suc
8a60: 68 20 69 6e 74 65 72 65 73 74 2e 20 49 74 20 6a h interest. It j
8a70: 75 73 74 20 70 61 73 73 65 73 20 74 68 65 20 72 ust passes the r
8a80: 65 71 75 65 73 74 20 64 6f 77 6e 2c 20 75 6e 63 equest down, unc
8a90: 68 61 6e 67 65 64 2e 0a 20 20 20 20 20 2a 2f 0a hanged.. */.
8aa0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 67 dprintf("Reg
8ab0: 69 73 74 65 72 69 6e 67 20 6f 75 72 20 69 6e 74 istering our int
8ac0: 65 72 65 73 74 20 69 6e 20 74 68 65 20 6c 6f 77 erest in the low
8ad0: 65 72 20 63 68 61 6e 6e 65 6c 20 28 63 68 61 6e er channel (chan
8ae0: 3d 25 70 29 22 2c 20 28 76 6f 69 64 20 2a 29 20 =%p)", (void *)
8af0: 70 61 72 65 6e 74 29 3b 0a 20 20 20 20 77 61 74 parent);. wat
8b00: 63 68 50 72 6f 63 20 3d 20 54 63 6c 5f 43 68 61 chProc = Tcl_Cha
8b10: 6e 6e 65 6c 57 61 74 63 68 50 72 6f 63 28 54 63 nnelWatchProc(Tc
8b20: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 l_GetChannelType
8b30: 28 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 77 (parent));. w
8b40: 61 74 63 68 50 72 6f 63 28 54 63 6c 5f 47 65 74 atchProc(Tcl_Get
8b50: 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 ChannelInstanceD
8b60: 61 74 61 28 70 61 72 65 6e 74 29 2c 20 6d 61 73 ata(parent), mas
8b70: 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 77 k);.. /* Do w
8b80: 65 20 68 61 76 65 20 61 6e 79 20 70 65 6e 64 69 e have any pendi
8b90: 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 20 20 70 ng data */. p
8ba0: 65 6e 64 69 6e 67 20 3d 20 28 73 74 61 74 65 50 ending = (stateP
8bb0: 74 72 2d 3e 77 61 6e 74 20 7c 7c 20 5c 0a 09 28 tr->want || \..(
8bc0: 28 6d 61 73 6b 20 26 20 54 43 4c 5f 52 45 41 44 (mask & TCL_READ
8bd0: 41 42 4c 45 29 20 26 26 20 28 28 54 63 6c 5f 49 ABLE) && ((Tcl_I
8be0: 6e 70 75 74 42 75 66 66 65 72 65 64 28 73 74 61 nputBuffered(sta
8bf0: 74 65 50 74 72 2d 3e 73 65 6c 66 29 20 3e 20 30 tePtr->self) > 0
8c00: 29 20 7c 7c 20 28 42 49 4f 5f 63 74 72 6c 5f 70 ) || (BIO_ctrl_p
8c10: 65 6e 64 69 6e 67 28 73 74 61 74 65 50 74 72 2d ending(statePtr-
8c20: 3e 62 69 6f 29 20 3e 20 30 29 29 29 20 7c 7c 0a >bio) > 0))) ||.
8c30: 09 28 28 6d 61 73 6b 20 26 20 54 43 4c 5f 57 52 .((mask & TCL_WR
8c40: 49 54 41 42 4c 45 29 20 26 26 20 28 28 54 63 6c ITABLE) && ((Tcl
8c50: 5f 4f 75 74 70 75 74 42 75 66 66 65 72 65 64 28 _OutputBuffered(
8c60: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 20 statePtr->self)
8c70: 3e 20 30 29 20 7c 7c 20 28 42 49 4f 5f 63 74 72 > 0) || (BIO_ctr
8c80: 6c 5f 77 70 65 6e 64 69 6e 67 28 73 74 61 74 65 l_wpending(state
8c90: 50 74 72 2d 3e 62 69 6f 29 20 3e 20 30 29 29 29 Ptr->bio) > 0)))
8ca0: 29 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 );.. dprintf(
8cb0: 22 49 4f 20 57 61 6e 74 3d 25 64 2c 20 69 6e 70 "IO Want=%d, inp
8cc0: 75 74 20 62 75 66 66 65 72 3d 25 64 2c 20 6f 75 ut buffer=%d, ou
8cd0: 74 70 75 74 20 62 75 66 66 65 72 3d 25 64 2c 20 tput buffer=%d,
8ce0: 42 49 4f 20 70 65 6e 64 69 6e 67 3d 25 7a 64 2c BIO pending=%zd,
8cf0: 20 42 49 4f 20 77 70 65 6e 64 69 6e 67 3d 25 7a BIO wpending=%z
8d00: 64 2c 20 70 65 6e 64 69 6e 67 3d 25 64 22 2c 20 d, pending=%d",
8d10: 5c 0a 09 73 74 61 74 65 50 74 72 2d 3e 77 61 6e \..statePtr->wan
8d20: 74 2c 20 54 63 6c 5f 49 6e 70 75 74 42 75 66 66 t, Tcl_InputBuff
8d30: 65 72 65 64 28 73 74 61 74 65 50 74 72 2d 3e 73 ered(statePtr->s
8d40: 65 6c 66 29 2c 20 54 63 6c 5f 4f 75 74 70 75 74 elf), Tcl_Output
8d50: 42 75 66 66 65 72 65 64 28 73 74 61 74 65 50 74 Buffered(statePt
8d60: 72 2d 3e 73 65 6c 66 29 2c 20 5c 0a 09 42 49 4f r->self), \..BIO
8d70: 5f 63 74 72 6c 5f 70 65 6e 64 69 6e 67 28 73 74 _ctrl_pending(st
8d80: 61 74 65 50 74 72 2d 3e 62 69 6f 29 2c 20 42 49 atePtr->bio), BI
8d90: 4f 5f 63 74 72 6c 5f 77 70 65 6e 64 69 6e 67 28 O_ctrl_wpending(
8da0: 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 2c 20 statePtr->bio),
8db0: 70 65 6e 64 69 6e 67 29 3b 0a 0a 20 20 20 20 2f pending);.. /
8dc0: 2a 20 53 63 68 65 64 75 6c 65 20 6e 65 78 74 20 * Schedule next
8dd0: 65 76 65 6e 74 20 69 66 20 64 61 74 61 20 69 73 event if data is
8de0: 20 70 65 6e 64 69 6e 67 2c 20 6f 74 68 65 72 77 pending, otherw
8df0: 69 73 65 20 63 65 61 73 65 20 65 76 65 6e 74 73 ise cease events
8e00: 20 66 6f 72 20 6e 6f 77 20 2a 2f 0a 20 20 20 20 for now */.
8e10: 69 66 20 28 21 28 6d 61 73 6b 20 26 20 54 43 4c if (!(mask & TCL
8e20: 5f 52 45 41 44 41 42 4c 45 29 20 7c 7c 20 70 65 _READABLE) || pe
8e30: 6e 64 69 6e 67 20 3d 3d 20 30 29 20 7b 0a 09 2f nding == 0) {../
8e40: 2a 20 52 65 6d 6f 76 65 20 74 69 6d 65 72 2c 20 * Remove timer,
8e50: 69 66 20 61 6e 79 20 2a 2f 0a 09 69 66 20 28 73 if any */..if (s
8e60: 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 21 tatePtr->timer !
8e70: 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 = (Tcl_TimerToke
8e80: 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 n) NULL) {..
8e90: 64 70 72 69 6e 74 66 28 22 41 20 74 69 6d 65 72 dprintf("A timer
8ea0: 20 77 61 73 20 66 6f 75 6e 64 2c 20 64 65 6c 65 was found, dele
8eb0: 74 69 6e 67 20 69 74 22 29 3b 0a 09 20 20 20 20 ting it");..
8ec0: 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 Tcl_DeleteTimerH
8ed0: 61 6e 64 6c 65 72 28 73 74 61 74 65 50 74 72 2d andler(statePtr-
8ee0: 3e 74 69 6d 65 72 29 3b 0a 09 20 20 20 20 73 74 >timer);.. st
8ef0: 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 atePtr->timer =
8f00: 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 (Tcl_TimerToken)
8f10: 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 20 20 20 20 7d NULL;..}.. }
8f20: 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 41 64 64 20 else {../* Add
8f30: 74 69 6d 65 72 2c 20 69 66 20 6e 6f 6e 65 20 2a timer, if none *
8f40: 2f 0a 09 69 66 20 28 73 74 61 74 65 50 74 72 2d /..if (statePtr-
8f50: 3e 74 69 6d 65 72 20 3d 3d 20 28 54 63 6c 5f 54 >timer == (Tcl_T
8f60: 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 imerToken) NULL)
8f70: 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 {.. dprintf(
8f80: 22 43 72 65 61 74 69 6e 67 20 61 20 6e 65 77 20 "Creating a new
8f90: 74 69 6d 65 72 20 73 69 6e 63 65 20 64 61 74 61 timer since data
8fa0: 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 77 appears to be w
8fb0: 61 69 74 69 6e 67 22 29 3b 0a 09 20 20 20 20 73 aiting");.. s
8fc0: 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d tatePtr->timer =
8fd0: 20 54 63 6c 5f 43 72 65 61 74 65 54 69 6d 65 72 Tcl_CreateTimer
8fe0: 48 61 6e 64 6c 65 72 28 54 4c 53 5f 54 43 4c 5f Handler(TLS_TCL_
8ff0: 44 45 4c 41 59 2c 20 54 6c 73 43 68 61 6e 6e 65 DELAY, TlsChanne
9000: 6c 48 61 6e 64 6c 65 72 54 69 6d 65 72 2c 20 28 lHandlerTimer, (
9010: 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 ClientData) stat
9020: 65 50 74 72 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a ePtr);..}. }.
9030: 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d }../*. *--------
9040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9080: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 47 -----. *. * TlsG
9090: 65 74 48 61 6e 64 6c 65 50 72 6f 63 20 2d 2d 0a etHandleProc --.
90a0: 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 *. *.This proce
90b0: 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 dure is invoked
90c0: 62 79 20 74 68 65 20 67 65 6e 65 72 69 63 20 49 by the generic I
90d0: 4f 20 6c 65 76 65 6c 20 74 6f 20 72 65 74 72 69 O level to retri
90e0: 65 76 65 20 61 6e 20 4f 53 0a 20 2a 09 73 70 65 eve an OS. *.spe
90f0: 63 69 66 69 63 20 68 61 6e 64 6c 65 20 61 73 73 cific handle ass
9100: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 ociated with the
9110: 20 63 68 61 6e 6e 65 6c 2e 20 4e 6f 74 20 75 73 channel. Not us
9120: 65 64 20 66 6f 72 20 74 72 61 6e 73 66 6f 72 6d ed for transform
9130: 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 s.. *. * Results
9140: 3a 0a 20 2a 09 54 68 65 20 61 70 70 72 6f 70 72 :. *.The appropr
9150: 69 61 74 65 20 54 63 6c 5f 46 69 6c 65 20 68 61 iate Tcl_File ha
9160: 6e 64 6c 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20 ndle or NULL if
9170: 6e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 none.. *. * Side
9180: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e effects:. *.Non
9190: 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d e.. *. *--------
91a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
91b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
91c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
91d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
91e0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 -----. */.static
91f0: 20 69 6e 74 20 54 6c 73 47 65 74 48 61 6e 64 6c int TlsGetHandl
9200: 65 50 72 6f 63 28 0a 20 20 20 20 43 6c 69 65 6e eProc(. Clien
9210: 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 tData instanceDa
9220: 74 61 2c 09 2f 2a 20 53 6f 63 6b 65 74 20 73 74 ta,./* Socket st
9230: 61 74 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 ate. */. int
9240: 64 69 72 65 63 74 69 6f 6e 2c 09 09 2f 2a 20 54 direction,../* T
9250: 43 4c 5f 52 45 41 44 41 42 4c 45 20 6f 72 20 54 CL_READABLE or T
9260: 43 4c 5f 57 52 49 54 41 42 4c 45 20 2a 2f 0a 20 CL_WRITABLE */.
9270: 20 20 20 43 6c 69 65 6e 74 44 61 74 61 20 2a 68 ClientData *h
9280: 61 6e 64 6c 65 50 74 72 29 09 2f 2a 20 48 61 6e andlePtr)./* Han
9290: 64 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 dle associated w
92a0: 69 74 68 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 ith the channel
92b0: 2a 2f 0a 7b 0a 20 20 20 20 53 74 61 74 65 20 2a */.{. State *
92c0: 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 statePtr = (Stat
92d0: 65 20 2a 29 20 69 6e 73 74 61 6e 63 65 44 61 74 e *) instanceDat
92e0: 61 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 a;.. return T
92f0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 48 61 6e cl_GetChannelHan
9300: 64 6c 65 28 54 6c 73 5f 47 65 74 50 61 72 65 6e dle(Tls_GetParen
9310: 74 28 73 74 61 74 65 50 74 72 2c 20 54 4c 53 5f t(statePtr, TLS_
9320: 54 43 4c 5f 46 41 53 54 50 41 54 48 29 2c 0a 09 TCL_FASTPATH),..
9330: 64 69 72 65 63 74 69 6f 6e 2c 20 68 61 6e 64 6c direction, handl
9340: 65 50 74 72 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d ePtr);.}../*. *-
9350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
93a0: 20 2a 20 54 6c 73 4e 6f 74 69 66 79 50 72 6f 63 * TlsNotifyProc
93b0: 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 --. *. *.This p
93c0: 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f rocedure is invo
93d0: 6b 65 64 20 62 79 20 74 68 65 20 67 65 6e 65 72 ked by the gener
93e0: 69 63 20 49 4f 20 6c 65 76 65 6c 20 74 6f 20 6e ic IO level to n
93f0: 6f 74 69 66 79 20 74 68 65 20 63 68 61 6e 6e 65 otify the channe
9400: 6c 0a 20 2a 09 74 68 61 74 20 61 6e 20 65 76 65 l. *.that an eve
9410: 6e 74 20 68 61 73 20 6f 63 63 75 72 72 65 64 20 nt has occurred
9420: 6f 6e 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e on the underlyin
9430: 67 20 63 68 61 6e 6e 65 6c 2e 20 49 74 20 69 73 g channel. It is
9440: 20 75 73 65 64 20 62 79 0a 20 2a 09 73 74 61 63 used by. *.stac
9450: 6b 65 64 20 63 68 61 6e 6e 65 6c 20 64 72 69 76 ked channel driv
9460: 65 72 73 20 74 68 61 74 20 77 69 73 68 20 74 6f ers that wish to
9470: 20 62 65 20 6e 6f 74 69 66 69 65 64 20 6f 66 20 be notified of
9480: 65 76 65 6e 74 73 20 74 68 61 74 20 6f 63 63 75 events that occu
9490: 72 0a 20 2a 09 6f 6e 20 74 68 65 20 75 6e 64 65 r. *.on the unde
94a0: 72 6c 79 69 6e 67 20 28 73 74 61 63 6b 65 64 29 rlying (stacked)
94b0: 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 channel.. *. *
94c0: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 54 79 70 65 Results:. *.Type
94d0: 20 6f 66 20 65 76 65 6e 74 20 6f 72 20 30 20 69 of event or 0 i
94e0: 66 20 66 61 69 6c 65 64 0a 20 2a 0a 20 2a 20 53 f failed. *. * S
94f0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
9500: 4d 61 79 20 70 72 6f 63 65 73 73 20 74 68 65 20 May process the
9510: 69 6e 63 6f 6d 69 6e 67 20 65 76 65 6e 74 20 62 incoming event b
9520: 79 20 69 74 73 65 6c 66 2e 0a 20 2a 0a 20 2a 2d y itself.. *. *-
9530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
9580: 0a 73 74 61 74 69 63 20 69 6e 74 20 54 6c 73 4e .static int TlsN
9590: 6f 74 69 66 79 50 72 6f 63 28 0a 20 20 20 20 43 otifyProc(. C
95a0: 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e lientData instan
95b0: 63 65 44 61 74 61 2c 09 2f 2a 20 53 6f 63 6b 65 ceData,./* Socke
95c0: 74 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 20 20 t state. */.
95d0: 69 6e 74 20 6d 61 73 6b 29 09 09 09 2f 2a 20 74 int mask).../* t
95e0: 79 70 65 20 6f 66 20 65 76 65 6e 74 20 74 68 61 ype of event tha
95f0: 74 20 6f 63 63 75 72 72 65 64 3a 20 4f 52 2d 65 t occurred: OR-e
9600: 64 0a 09 09 09 09 20 2a 20 63 6f 6d 62 69 6e 61 d..... * combina
9610: 74 69 6f 6e 20 6f 66 20 54 43 4c 5f 52 45 41 44 tion of TCL_READ
9620: 41 42 4c 45 20 6f 72 20 54 43 4c 5f 57 52 49 54 ABLE or TCL_WRIT
9630: 41 42 4c 45 20 2a 2f 0a 7b 0a 20 20 20 20 53 74 ABLE */.{. St
9640: 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 ate *statePtr =
9650: 28 53 74 61 74 65 20 2a 29 20 69 6e 73 74 61 6e (State *) instan
9660: 63 65 44 61 74 61 3b 0a 20 20 20 20 69 6e 74 20 ceData;. int
9670: 65 72 72 6f 72 43 6f 64 65 20 3d 20 30 3b 0a 0a errorCode = 0;..
9680: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
9690: 6c 65 64 20 77 69 74 68 20 6d 61 73 6b 20 30 78 led with mask 0x
96a0: 25 30 32 78 22 2c 20 6d 61 73 6b 29 3b 0a 0a 20 %02x", mask);..
96b0: 20 20 20 2f 2a 20 41 62 6f 72 74 20 69 66 20 74 /* Abort if t
96c0: 68 65 20 75 73 65 72 20 76 65 72 69 66 79 20 63 he user verify c
96d0: 61 6c 6c 62 61 63 6b 20 69 73 20 73 74 69 6c 6c allback is still
96e0: 20 72 75 6e 6e 69 6e 67 20 74 6f 20 61 76 6f 69 running to avoi
96f0: 64 20 74 72 69 67 67 65 72 69 6e 67 0a 20 20 20 d triggering.
9700: 20 20 2a 20 61 6e 6f 74 68 65 72 20 63 61 6c 6c * another call
9710: 20 62 65 66 6f 72 65 20 74 68 65 20 63 75 72 72 before the curr
9720: 65 6e 74 20 6f 6e 65 20 69 73 20 63 6f 6d 70 6c ent one is compl
9730: 65 74 65 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 ete. */. if (
9740: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 statePtr->flags
9750: 26 20 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 41 & TLS_TCL_CALLBA
9760: 43 4b 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 CK) {..dprintf("
9770: 43 61 6c 6c 62 61 63 6b 20 69 73 20 6f 6e 2d 67 Callback is on-g
9780: 6f 69 6e 67 2c 20 72 65 74 75 72 6e 69 6e 67 20 oing, returning
9790: 66 61 69 6c 65 64 22 29 3b 0a 09 72 65 74 75 72 failed");..retur
97a0: 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 n 0;. }..
97b0: 2f 2a 20 49 66 20 6e 6f 74 20 69 6e 69 74 69 61 /* If not initia
97c0: 6c 69 7a 65 64 2c 20 64 6f 20 63 6f 6e 6e 65 63 lized, do connec
97d0: 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 t */. if (sta
97e0: 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 tePtr->flags & T
97f0: 4c 53 5f 54 43 4c 5f 49 4e 49 54 29 20 7b 0a 09 LS_TCL_INIT) {..
9800: 69 6e 74 20 74 6c 73 43 6f 6e 6e 65 63 74 3b 0a int tlsConnect;.
9810: 0a 09 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 69 ..dprintf("Calli
9820: 6e 67 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f ng Tls_WaitForCo
9830: 6e 6e 65 63 74 22 29 3b 0a 0a 09 74 6c 73 43 6f nnect");...tlsCo
9840: 6e 6e 65 63 74 20 3d 20 54 6c 73 5f 57 61 69 74 nnect = Tls_Wait
9850: 46 6f 72 43 6f 6e 6e 65 63 74 28 73 74 61 74 65 ForConnect(state
9860: 50 74 72 2c 20 26 65 72 72 6f 72 43 6f 64 65 2c Ptr, &errorCode,
9870: 20 31 29 3b 0a 09 69 66 20 28 74 6c 73 43 6f 6e 1);..if (tlsCon
9880: 6e 65 63 74 20 3c 20 31 29 20 7b 0a 09 20 20 20 nect < 1) {..
9890: 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20 61 6e dprintf("Got an
98a0: 20 65 72 72 6f 72 20 77 61 69 74 69 6e 67 20 74 error waiting t
98b0: 6f 20 63 6f 6e 6e 65 63 74 20 28 74 6c 73 43 6f o connect (tlsCo
98c0: 6e 6e 65 63 74 20 3d 20 25 69 2c 20 2a 65 72 72 nnect = %i, *err
98d0: 6f 72 43 6f 64 65 50 74 72 20 3d 20 25 69 29 22 orCodePtr = %i)"
98e0: 2c 20 74 6c 73 43 6f 6e 6e 65 63 74 2c 20 65 72 , tlsConnect, er
98f0: 72 6f 72 43 6f 64 65 29 3b 0a 09 20 20 20 20 69 rorCode);.. i
9900: 66 20 28 65 72 72 6f 72 43 6f 64 65 20 3d 3d 20 f (errorCode ==
9910: 45 41 47 41 49 4e 29 20 7b 0a 09 09 64 70 72 69 EAGAIN) {...dpri
9920: 6e 74 66 28 22 41 73 79 6e 63 20 66 6c 61 67 20 ntf("Async flag
9930: 63 6f 75 6c 64 20 62 65 20 73 65 74 20 28 64 69 could be set (di
9940: 64 6e 27 74 20 63 68 65 63 6b 29 20 61 6e 64 20 dn't check) and
9950: 65 72 72 6f 72 43 6f 64 65 20 3d 3d 20 45 41 47 errorCode == EAG
9960: 41 49 4e 3a 20 20 52 65 74 75 72 6e 69 6e 67 20 AIN: Returning
9970: 66 61 69 6c 65 64 22 29 3b 0a 0a 09 09 72 65 74 failed");....ret
9980: 75 72 6e 20 30 3b 0a 09 20 20 20 20 7d 0a 0a 09 urn 0;.. }...
9990: 20 20 20 20 64 70 72 69 6e 74 66 28 22 54 6c 73 dprintf("Tls
99a0: 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 20 _WaitForConnect
99b0: 72 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f returned an erro
99c0: 72 22 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 r");..}. }..
99d0: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 44 65 6c /*. * Del
99e0: 65 74 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 ete an existing
99f0: 74 69 6d 65 72 2e 20 49 74 20 77 61 73 20 6e 6f timer. It was no
9a00: 74 20 66 69 72 65 64 2c 20 79 65 74 20 77 65 20 t fired, yet we
9a10: 61 72 65 20 68 65 72 65 2c 20 73 6f 20 74 68 65 are here, so the
9a20: 0a 20 20 20 20 20 2a 20 63 68 61 6e 6e 65 6c 20 . * channel
9a30: 62 65 6c 6f 77 20 67 65 6e 65 72 61 74 65 64 20 below generated
9a40: 73 75 63 68 20 61 6e 20 65 76 65 6e 74 20 61 6e such an event an
9a50: 64 20 77 65 20 64 6f 6e 27 74 20 68 61 76 65 20 d we don't have
9a60: 74 6f 2e 20 54 68 65 20 72 65 6e 65 77 61 6c 0a to. The renewal.
9a70: 20 20 20 20 20 2a 20 6f 66 20 74 68 65 20 69 6e * of the in
9a80: 74 65 72 65 73 74 20 61 66 74 65 72 20 74 68 65 terest after the
9a90: 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 63 68 execution of ch
9aa0: 61 6e 6e 65 6c 20 68 61 6e 64 6c 65 72 73 20 77 annel handlers w
9ab0: 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c 79 0a 20 ill eventually.
9ac0: 20 20 20 20 2a 20 63 61 75 73 65 20 75 73 20 74 * cause us t
9ad0: 6f 20 72 65 63 72 65 61 74 65 20 74 68 65 20 74 o recreate the t
9ae0: 69 6d 65 72 20 28 69 6e 20 54 6c 73 57 61 74 63 imer (in TlsWatc
9af0: 68 50 72 6f 63 29 2e 0a 20 20 20 20 20 2a 2f 0a hProc).. */.
9b00: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
9b10: 2d 3e 74 69 6d 65 72 20 21 3d 20 28 54 63 6c 5f ->timer != (Tcl_
9b20: 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c TimerToken) NULL
9b30: 29 20 7b 0a 09 54 63 6c 5f 44 65 6c 65 74 65 54 ) {..Tcl_DeleteT
9b40: 69 6d 65 72 48 61 6e 64 6c 65 72 28 73 74 61 74 imerHandler(stat
9b50: 65 50 74 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 73 ePtr->timer);..s
9b60: 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d tatePtr->timer =
9b70: 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e (Tcl_TimerToken
9b80: 29 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 ) NULL;. }..
9b90: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 41 6e 20 /*. * An
9ba0: 65 76 65 6e 74 20 6f 63 63 75 72 72 65 64 20 69 event occurred i
9bb0: 6e 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 n the underlying
9bc0: 20 63 68 61 6e 6e 65 6c 2e 20 54 68 69 73 20 74 channel. This t
9bd0: 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 64 6f ransformation do
9be0: 65 73 6e 27 74 0a 20 20 20 20 20 2a 20 70 72 6f esn't. * pro
9bf0: 63 65 73 73 20 73 75 63 68 20 65 76 65 6e 74 73 cess such events
9c00: 20 74 68 75 73 20 72 65 74 75 72 6e 73 20 74 68 thus returns th
9c10: 65 20 69 6e 63 6f 6d 69 6e 67 20 6d 61 73 6b 20 e incoming mask
9c20: 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 20 20 20 unchanged..
9c30: 2a 2f 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 */. dprintf("
9c40: 52 65 74 75 72 6e 69 6e 67 20 25 69 22 2c 20 6d Returning %i", m
9c50: 61 73 6b 29 3b 0a 20 20 20 20 72 65 74 75 72 6e ask);. return
9c60: 20 6d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d mask;.}../*. *-
9c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
9cc0: 20 2a 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 * Tls_ChannelTy
9cd0: 70 65 20 2d 2d 0a 20 2a 0a 20 2a 09 44 65 66 69 pe --. *. *.Defi
9ce0: 6e 65 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 nes the correct
9cf0: 54 4c 53 20 63 68 61 6e 6e 65 6c 20 64 72 69 76 TLS channel driv
9d00: 65 72 20 68 61 6e 64 6c 65 72 73 20 66 6f 72 20 er handlers for
9d10: 74 68 69 73 20 63 68 61 6e 6e 65 6c 20 74 79 70 this channel typ
9d20: 65 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 e.. *. * Results
9d30: 3a 0a 20 2a 09 54 63 6c 5f 43 68 61 6e 6e 65 6c :. *.Tcl_Channel
9d40: 54 79 70 65 20 73 74 72 75 63 74 75 72 65 2e 0a Type structure..
9d50: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
9d60: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a ts:. *.None.. *.
9d70: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
9d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
9dc0: 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 */.static const
9dd0: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 54 79 70 65 Tcl_ChannelType
9de0: 20 74 6c 73 43 68 61 6e 6e 65 6c 54 79 70 65 20 tlsChannelType
9df0: 3d 20 7b 0a 20 20 20 20 22 74 6c 73 22 2c 09 09 = {. "tls",..
9e00: 09 2f 2a 20 54 79 70 65 20 6e 61 6d 65 20 2a 2f ./* Type name */
9e10: 0a 20 20 20 20 54 43 4c 5f 43 48 41 4e 4e 45 4c . TCL_CHANNEL
9e20: 5f 56 45 52 53 49 4f 4e 5f 35 2c 09 2f 2a 20 76 _VERSION_5,./* v
9e30: 35 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 5 channel */.
9e40: 20 54 6c 73 43 6c 6f 73 65 50 72 6f 63 2c 09 09 TlsCloseProc,..
9e50: 2f 2a 20 43 6c 6f 73 65 20 70 72 6f 63 20 2a 2f /* Close proc */
9e60: 0a 20 20 20 20 54 6c 73 49 6e 70 75 74 50 72 6f . TlsInputPro
9e70: 63 2c 09 09 2f 2a 20 49 6e 70 75 74 20 70 72 6f c,../* Input pro
9e80: 63 20 2a 2f 0a 20 20 20 20 54 6c 73 4f 75 74 70 c */. TlsOutp
9e90: 75 74 50 72 6f 63 2c 09 09 2f 2a 20 4f 75 74 70 utProc,../* Outp
9ea0: 75 74 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20 4e ut proc */. N
9eb0: 55 4c 4c 2c 09 09 09 2f 2a 20 53 65 65 6b 20 70 ULL,.../* Seek p
9ec0: 72 6f 63 20 2a 2f 0a 20 20 20 20 54 6c 73 53 65 roc */. TlsSe
9ed0: 74 4f 70 74 69 6f 6e 50 72 6f 63 2c 09 09 2f 2a tOptionProc,../*
9ee0: 20 53 65 74 20 6f 70 74 69 6f 6e 20 70 72 6f 63 Set option proc
9ef0: 20 2a 2f 0a 20 20 20 20 54 6c 73 47 65 74 4f 70 */. TlsGetOp
9f00: 74 69 6f 6e 50 72 6f 63 2c 09 09 2f 2a 20 47 65 tionProc,../* Ge
9f10: 74 20 6f 70 74 69 6f 6e 20 70 72 6f 63 20 2a 2f t option proc */
9f20: 0a 20 20 20 20 54 6c 73 57 61 74 63 68 50 72 6f . TlsWatchPro
9f30: 63 2c 09 09 2f 2a 20 49 6e 69 74 69 61 6c 69 7a c,../* Initializ
9f40: 65 20 6e 6f 74 69 66 69 65 72 20 2a 2f 0a 20 20 e notifier */.
9f50: 20 20 54 6c 73 47 65 74 48 61 6e 64 6c 65 50 72 TlsGetHandlePr
9f60: 6f 63 2c 09 09 2f 2a 20 47 65 74 20 4f 53 20 68 oc,../* Get OS h
9f70: 61 6e 64 6c 65 73 20 6f 75 74 20 6f 66 20 63 68 andles out of ch
9f80: 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 54 6c 73 annel */. Tls
9f90: 43 6c 6f 73 65 32 50 72 6f 63 2c 09 09 2f 2a 20 Close2Proc,../*
9fa0: 63 6c 6f 73 65 32 70 72 6f 63 20 2a 2f 0a 20 20 close2proc */.
9fb0: 20 20 54 6c 73 42 6c 6f 63 6b 4d 6f 64 65 50 72 TlsBlockModePr
9fc0: 6f 63 2c 09 09 2f 2a 20 53 65 74 20 62 6c 6f 63 oc,../* Set bloc
9fd0: 6b 69 6e 67 2f 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 king/nonblocking
9fe0: 20 6d 6f 64 65 2a 2f 0a 20 20 20 20 4e 55 4c 4c mode*/. NULL
9ff0: 2c 09 09 09 2f 2a 20 46 6c 75 73 68 20 70 72 6f ,.../* Flush pro
a000: 63 20 2a 2f 0a 20 20 20 20 54 6c 73 4e 6f 74 69 c */. TlsNoti
a010: 66 79 50 72 6f 63 2c 09 09 2f 2a 20 48 61 6e 64 fyProc,../* Hand
a020: 6c 69 6e 67 20 6f 66 20 65 76 65 6e 74 73 20 62 ling of events b
a030: 75 62 62 6c 69 6e 67 20 75 70 20 2a 2f 0a 20 20 ubbling up */.
a040: 20 20 4e 55 4c 4c 2c 09 09 09 2f 2a 20 57 69 64 NULL,.../* Wid
a050: 65 20 73 65 65 6b 20 70 72 6f 63 20 2a 2f 0a 20 e seek proc */.
a060: 20 20 20 4e 55 4c 4c 2c 09 09 09 2f 2a 20 54 68 NULL,.../* Th
a070: 72 65 61 64 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 read action */.
a080: 20 20 20 4e 55 4c 4c 09 09 09 2f 2a 20 54 72 75 NULL.../* Tru
a090: 6e 63 61 74 65 20 2a 2f 0a 7d 3b 0a 0a 63 6f 6e ncate */.};..con
a0a0: 73 74 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 54 79 st Tcl_ChannelTy
a0b0: 70 65 20 2a 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 pe *Tls_ChannelT
a0c0: 79 70 65 28 76 6f 69 64 29 20 7b 0a 20 20 20 20 ype(void) {.
a0d0: 72 65 74 75 72 6e 20 26 74 6c 73 43 68 61 6e 6e return &tlsChann
a0e0: 65 6c 54 79 70 65 3b 0a 7d 0a elType;.}.