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 09 09 09 09 4e 6f 72 6d 61 6c 0a 09 ./*.....Normal..
0280: 09 74 6c 73 42 49 4f 2e 63 09 09 09 09 74 6c 73 .tlsBIO.c....tls
0290: 49 4f 2e 63 0a 20 2b 2d 2d 2d 2d 2d 2d 2b 20 20 IO.c. +------+
02a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
02b0: 20 20 20 20 20 20 2b 2d 2d 2d 2b 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 20 20 2b 2d 2d 2d +---
02e0: 2b 0a 20 7c 20 20 20 20 20 20 7c 54 63 6c 5f 57 +. | |Tcl_W
02f0: 72 69 74 65 52 61 77 3c 2d 2d 42 69 6f 4f 75 74 riteRaw<--BioOut
0300: 70 75 74 7c 53 53 4c 7c 42 49 4f 5f 77 72 69 74 put|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 42 49 4f 7c 20 20 20 20 20 20 20 20 20 20 20 |BIO|
0360: 20 3c 75 6e 65 6e 63 72 79 70 74 65 64 3e 20 20 <unencrypted>
0370: 20 20 20 20 20 20 7c 41 70 70 7c 0a 20 7c 20 20 |App|. |
0380: 20 20 20 20 7c 54 63 6c 5f 52 65 61 64 52 61 77 |Tcl_ReadRaw
0390: 20 2d 2d 3e 20 42 69 6f 49 6e 70 75 74 7c 20 20 --> BioInput|
03a0: 20 7c 42 49 4f 5f 52 65 61 64 20 2d 2d 3e 54 6c |BIO_Read -->Tl
03b0: 73 49 6e 70 75 74 50 72 6f 63 20 2d 2d 3e 20 52 sInputProc --> R
03c0: 65 61 64 7c 20 20 20 7c 0a 20 2b 2d 2d 2d 2d 2d ead| |. +-----
03d0: 2d 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 -+
03e0: 20 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d 2b 20 +---+
03f0: 20 20 20 20 20 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: 2b 2d 2d 2d 2b 0a 0a 0a 09 09 09 09 46 61 73 74 +---+.......Fast
0420: 20 50 61 74 68 0a 09 09 09 09 09 74 6c 73 49 4f Path......tlsIO
0430: 2e 63 0a 20 20 2b 2d 2d 2d 2d 2d 2d 2b 20 20 20 .c. +------+
0440: 20 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d 2d 2d +-----
0450: 2b 20 20 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 2b 2d 2d 2d 2d 2d 2b 0a 20 20 +-----+.
0480: 7c 20 20 20 20 20 20 7c 3c 2d 2d 20 77 72 69 74 | |<-- writ
0490: 65 20 3c 2d 2d 7c 20 53 53 4c 20 7c 42 49 4f 5f e <--| SSL |BIO_
04a0: 77 72 69 74 65 20 3c 2d 2d 20 54 6c 73 4f 75 74 write <-- TlsOut
04b0: 70 75 74 50 72 6f 63 20 3c 2d 2d 20 57 72 69 74 putProc <-- Writ
04c0: 65 7c 20 20 20 20 20 7c 0a 20 20 7c 73 6f 63 6b e| |. |sock
04d0: 65 74 7c 20 3c 65 6e 63 72 79 70 74 65 64 3e 20 et| <encrypted>
04e0: 7c 20 42 49 4f 20 7c 20 20 20 20 20 20 20 20 20 | BIO |
04f0: 20 20 20 3c 75 6e 65 6e 63 72 79 70 74 65 64 3e <unencrypted>
0500: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 41 70 | Ap
0510: 70 20 7c 0a 20 20 7c 20 20 20 20 20 20 7c 3c 2d p |. | |<-
0520: 2d 20 20 72 65 61 64 20 3c 2d 2d 7c 20 20 20 20 - read <--|
0530: 20 7c 42 49 4f 5f 52 65 61 64 20 20 2d 2d 3e 20 |BIO_Read -->
0540: 54 6c 73 49 6e 70 75 74 50 72 6f 63 20 20 2d 2d TlsInputProc --
0550: 3e 20 20 52 65 61 64 7c 20 20 20 20 20 7c 0a 20 > Read| |.
0560: 20 2b 2d 2d 2d 2d 2d 2d 2b 20 20 20 20 20 20 20 +------+
0570: 20 20 20 20 20 20 2b 2d 2d 2d 2d 2d 2b 20 20 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 2b 2d 2d 2d 2d 2d 2b 0a 2a 2f 0a 0a 23 69 +-----+.*/..#i
05b0: 6e 63 6c 75 64 65 20 22 74 6c 73 49 6e 74 2e 68 nclude "tlsInt.h
05c0: 22 0a 23 69 6e 63 6c 75 64 65 20 3c 65 72 72 6e ".#include <errn
05d0: 6f 2e 68 3e 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d o.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 0a 20 2a 0a 20 2a 20 54 --------. *. * T
0630: 6c 73 42 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 20 lsBlockModeProc
0640: 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 --. *. *.This pr
0650: 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b ocedure is invok
0660: 65 64 20 62 79 20 74 68 65 20 67 65 6e 65 72 69 ed by the generi
0670: 63 20 49 4f 20 6c 65 76 65 6c 20 74 6f 20 73 65 c IO level to se
0680: 74 20 63 68 61 6e 6e 65 6c 20 74 6f 0a 20 2a 09 t channel to. *.
0690: 62 6c 6f 63 6b 69 6e 67 20 6f 72 20 6e 6f 6e 62 blocking or nonb
06a0: 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e 20 43 61 locking mode. Ca
06b0: 6c 6c 65 64 20 62 79 20 74 68 65 20 67 65 6e 65 lled by the gene
06c0: 72 69 63 20 49 2f 4f 20 6c 61 79 65 72 20 77 68 ric I/O layer wh
06d0: 65 6e 65 76 65 72 0a 20 2a 09 74 68 65 20 54 63 enever. *.the Tc
06e0: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 l_SetChannelOpti
06f0: 6f 6e 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 on() function is
0700: 20 75 73 65 64 20 77 69 74 68 20 6f 70 74 69 6f used with optio
0710: 6e 20 2d 62 6c 6f 63 6b 69 6e 67 2e 0a 20 2a 0a n -blocking.. *.
0720: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 30 * Results:. *.0
0730: 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 6f if successful o
0740: 72 20 50 4f 53 49 58 20 65 72 72 6f 72 20 63 6f r POSIX error co
0750: 64 65 20 69 66 20 66 61 69 6c 65 64 2e 0a 20 2a de if failed.. *
0760: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
0770: 3a 0a 20 2a 09 53 65 74 73 20 74 68 65 20 64 65 :. *.Sets the de
0780: 76 69 63 65 20 69 6e 74 6f 20 62 6c 6f 63 6b 69 vice into blocki
0790: 6e 67 20 6f 72 20 6e 6f 6e 62 6c 6f 63 6b 69 6e ng or nonblockin
07a0: 67 20 6d 6f 64 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d g 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 0a 20 2a 2f 0a 73 ----------. */.s
0800: 74 61 74 69 63 20 69 6e 74 20 54 6c 73 42 6c 6f tatic int TlsBlo
0810: 63 6b 4d 6f 64 65 50 72 6f 63 28 0a 20 20 20 20 ckModeProc(.
0820: 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 ClientData insta
0830: 6e 63 65 44 61 74 61 2c 09 2f 2a 20 43 6f 6e 6e nceData,./* Conn
0840: 65 63 74 69 6f 6e 20 73 74 61 74 65 20 69 6e 66 ection state inf
0850: 6f 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 6f 64 o */. int mod
0860: 65 29 09 09 09 2f 2a 20 42 6c 6f 63 6b 69 6e 67 e).../* Blocking
0870: 20 6f 72 20 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e 67 or non-blocking
0880: 20 6d 6f 64 65 20 2a 2f 0a 7b 0a 20 20 20 20 53 mode */.{. S
0890: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d tate *statePtr =
08a0: 20 28 53 74 61 74 65 20 2a 29 20 69 6e 73 74 61 (State *) insta
08b0: 6e 63 65 44 61 74 61 3b 0a 0a 20 20 20 20 69 66 nceData;.. if
08c0: 20 28 6d 6f 64 65 20 3d 3d 20 54 43 4c 5f 4d 4f (mode == TCL_MO
08d0: 44 45 5f 4e 4f 4e 42 4c 4f 43 4b 49 4e 47 29 20 DE_NONBLOCKING)
08e0: 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 {..statePtr->fla
08f0: 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 41 53 gs |= TLS_TCL_AS
0900: 59 4e 43 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 YNC;. } else
0910: 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 {..statePtr->fla
0920: 67 73 20 26 3d 20 7e 28 54 4c 53 5f 54 43 4c 5f gs &= ~(TLS_TCL_
0930: 41 53 59 4e 43 29 3b 0a 20 20 20 20 7d 0a 20 20 ASYNC);. }.
0940: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f return 0;.}../
0950: 2a 0a 20 2a 2d 2d 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 0a 20 2a 0a 20 2a 20 54 6c 73 43 6c 6f 73 65 -. *. * TlsClose
09b0: 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 Proc --. *. *.Th
09c0: 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 is procedure is
09d0: 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20 67 invoked by the g
09e0: 65 6e 65 72 69 63 20 49 4f 20 6c 65 76 65 6c 20 eneric IO level
09f0: 74 6f 20 70 65 72 66 6f 72 6d 20 63 68 61 6e 6e to perform chann
0a00: 65 6c 0a 20 2a 09 74 79 70 65 20 73 70 65 63 69 el. *.type speci
0a10: 66 69 63 20 63 6c 65 61 6e 75 70 20 77 68 65 6e fic cleanup when
0a20: 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 a SSL socket ba
0a30: 73 65 64 20 63 68 61 6e 6e 65 6c 20 69 73 20 63 sed channel is c
0a40: 6c 6f 73 65 64 2e 20 43 61 6c 6c 65 64 0a 20 2a losed. Called. *
0a50: 09 62 79 20 74 68 65 20 67 65 6e 65 72 69 63 20 .by the generic
0a60: 49 2f 4f 20 6c 61 79 65 72 20 77 68 65 6e 65 76 I/O layer whenev
0a70: 65 72 20 74 68 65 20 54 63 6c 5f 43 6c 6f 73 65 er the Tcl_Close
0a80: 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 () function is u
0a90: 73 65 64 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c sed.. *. * Resul
0aa0: 74 73 3a 0a 20 2a 09 30 20 69 66 20 73 75 63 63 ts:. *.0 if succ
0ab0: 65 73 73 66 75 6c 20 6f 72 20 50 4f 53 49 58 20 essful or POSIX
0ac0: 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 66 61 error code if fa
0ad0: 69 6c 65 64 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 iled.. *. * Side
0ae0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 6c 6f effects:. *.Clo
0af0: 73 65 73 20 74 68 65 20 73 6f 63 6b 65 74 20 6f ses the socket o
0b00: 66 20 74 68 65 20 63 68 61 6e 6e 65 6c 2e 0a 20 f the channel..
0b10: 2a 0a 20 2a 2d 2d 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 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 -. */.static int
0b70: 20 54 6c 73 43 6c 6f 73 65 50 72 6f 63 28 0a 20 TlsCloseProc(.
0b80: 20 20 20 43 6c 69 65 6e 74 44 61 74 61 20 69 6e ClientData in
0b90: 73 74 61 6e 63 65 44 61 74 61 2c 09 2f 2a 20 43 stanceData,./* C
0ba0: 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 61 74 65 20 onnection state
0bb0: 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 54 63 6c 5f info */. Tcl_
0bc0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 09 Interp *interp).
0bd0: 09 2f 2a 20 54 63 6c 20 69 6e 74 65 72 70 72 65 ./* Tcl interpre
0be0: 74 65 72 20 74 6f 20 72 65 70 6f 72 74 20 65 72 ter to report er
0bf0: 72 6f 72 73 20 74 6f 20 2a 2f 0a 7b 0a 20 20 20 rors to */.{.
0c00: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 State *statePtr
0c10: 20 3d 20 28 53 74 61 74 65 20 2a 29 20 69 6e 73 = (State *) ins
0c20: 74 61 6e 63 65 44 61 74 61 3b 0a 0a 20 20 20 20 tanceData;..
0c30: 64 70 72 69 6e 74 66 28 22 54 6c 73 43 6c 6f 73 dprintf("TlsClos
0c40: 65 50 72 6f 63 28 25 70 29 22 2c 20 28 76 6f 69 eProc(%p)", (voi
0c50: 64 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a d *) statePtr);.
0c60: 0a 20 20 20 20 2f 2a 20 53 65 6e 64 20 73 68 75 . /* Send shu
0c70: 74 64 6f 77 6e 20 6e 6f 74 69 66 69 63 61 74 69 tdown notificati
0c80: 6f 6e 2e 20 57 69 6c 6c 20 72 65 74 75 72 6e 20 on. Will return
0c90: 30 20 77 68 69 6c 65 20 69 6e 20 70 72 6f 63 65 0 while in proce
0ca0: 73 73 2c 20 74 68 65 6e 20 31 20 77 68 65 6e 0a ss, then 1 when.
0cb0: 20 20 20 20 20 20 20 63 6f 6d 70 6c 65 74 65 2e complete.
0cc0: 20 4f 6e 6c 79 20 63 6c 6f 73 65 73 20 74 68 65 Only closes the
0cd0: 20 77 72 69 74 65 20 64 69 72 65 63 74 69 6f 6e write direction
0ce0: 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 of the connecti
0cf0: 6f 6e 3b 20 74 68 65 20 72 65 61 64 0a 20 20 20 on; the read.
0d00: 20 20 20 20 64 69 72 65 63 74 69 6f 6e 20 69 73 direction is
0d10: 20 63 6c 6f 73 65 64 20 62 79 20 74 68 65 20 70 closed by the p
0d20: 65 65 72 2e 20 44 6f 65 73 20 6e 6f 74 20 61 66 eer. Does not af
0d30: 66 65 63 74 20 73 6f 63 6b 65 74 20 73 74 61 74 fect socket stat
0d40: 65 2e 20 44 6f 6e 27 74 0a 20 20 20 20 20 20 20 e. Don't.
0d50: 63 61 6c 6c 20 61 66 74 65 72 20 66 61 74 61 6c call after fatal
0d60: 20 65 72 72 6f 72 2e 20 2a 2f 0a 20 20 20 20 69 error. */. i
0d70: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c f (statePtr->ssl
0d80: 20 21 3d 20 4e 55 4c 4c 20 26 26 20 21 28 73 74 != NULL && !(st
0d90: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 atePtr->flags &
0da0: 54 4c 53 5f 54 43 4c 5f 48 41 4e 44 53 48 41 4b TLS_TCL_HANDSHAK
0db0: 45 5f 46 41 49 4c 45 44 29 29 20 7b 0a 09 42 49 E_FAILED)) {..BI
0dc0: 4f 5f 66 6c 75 73 68 28 73 74 61 74 65 50 74 72 O_flush(statePtr
0dd0: 2d 3e 62 69 6f 29 3b 0a 09 53 53 4c 5f 73 68 75 ->bio);..SSL_shu
0de0: 74 64 6f 77 6e 28 73 74 61 74 65 50 74 72 2d 3e tdown(statePtr->
0df0: 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 ssl);. }..
0e00: 20 2f 2a 20 54 6c 73 5f 46 72 65 65 20 63 61 6c /* Tls_Free cal
0e10: 6c 73 20 54 6c 73 5f 43 6c 65 61 6e 20 2a 2f 0a ls Tls_Clean */.
0e20: 20 20 20 20 54 63 6c 5f 45 76 65 6e 74 75 61 6c Tcl_Eventual
0e30: 6c 79 46 72 65 65 28 28 43 6c 69 65 6e 74 44 61 lyFree((ClientDa
0e40: 74 61 29 73 74 61 74 65 50 74 72 2c 20 54 6c 73 ta)statePtr, Tls
0e50: 5f 46 72 65 65 29 3b 0a 20 20 20 20 72 65 74 75 _Free);. retu
0e60: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d rn 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 0a 20 2a 0a 20 -----------. *.
0ec0: 2a 20 54 6c 73 43 6c 6f 73 65 32 50 72 6f 63 20 * TlsClose2Proc
0ed0: 2d 2d 0a 20 2a 0a 20 2a 09 53 69 6d 69 6c 61 72 --. *. *.Similar
0ee0: 20 74 6f 20 54 6c 73 43 6c 6f 73 65 50 72 6f 63 to TlsCloseProc
0ef0: 2c 20 62 75 74 20 61 6c 6c 6f 77 73 20 66 6f 72 , but allows for
0f00: 20 73 65 70 61 72 61 74 65 20 63 6c 6f 73 65 20 separate close
0f10: 72 65 61 64 20 61 6e 64 20 77 72 69 74 65 0a 20 read and write.
0f20: 2a 09 73 69 64 65 20 6f 66 20 63 68 61 6e 6e 65 *.side of channe
0f30: 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d l.. *. *--------
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 0a 20 2a 2f 0a 73 74 61 74 69 63 -----. */.static
0f90: 20 69 6e 74 20 54 6c 73 43 6c 6f 73 65 32 50 72 int TlsClose2Pr
0fa0: 6f 63 28 0a 20 20 20 20 43 6c 69 65 6e 74 44 61 oc(. ClientDa
0fb0: 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c ta instanceData,
0fc0: 09 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 73 ./* Connection s
0fd0: 74 61 74 65 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 tate info */.
0fe0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
0ff0: 65 72 70 2c 09 09 2f 2a 20 54 63 6c 20 69 6e 74 erp,../* Tcl int
1000: 65 72 70 72 65 74 65 72 20 74 6f 20 72 65 70 6f erpreter to repo
1010: 72 74 20 65 72 72 6f 72 73 20 74 6f 20 2a 2f 0a rt errors to */.
1020: 20 20 20 20 69 6e 74 20 66 6c 61 67 73 29 09 09 int flags)..
1030: 09 2f 2a 20 46 6c 61 67 73 20 74 6f 20 63 6c 6f ./* Flags to clo
1040: 73 65 20 72 65 61 64 2f 77 72 69 74 65 20 73 69 se read/write si
1050: 64 65 20 6f 66 20 63 68 61 6e 6e 65 6c 20 2a 2f de of channel */
1060: 0a 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 .{. State *st
1070: 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 atePtr = (State
1080: 2a 29 20 69 6e 73 74 61 6e 63 65 44 61 74 61 3b *) instanceData;
1090: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 54 .. dprintf("T
10a0: 6c 73 43 6c 6f 73 65 32 50 72 6f 63 28 25 70 29 lsClose2Proc(%p)
10b0: 22 2c 20 28 76 6f 69 64 20 2a 29 20 73 74 61 74 ", (void *) stat
10c0: 65 50 74 72 29 3b 0a 0a 20 20 20 20 69 66 20 28 ePtr);.. if (
10d0: 28 66 6c 61 67 73 20 26 20 28 54 43 4c 5f 43 4c (flags & (TCL_CL
10e0: 4f 53 45 5f 52 45 41 44 7c 54 43 4c 5f 43 4c 4f OSE_READ|TCL_CLO
10f0: 53 45 5f 57 52 49 54 45 29 29 20 3d 3d 20 30 29 SE_WRITE)) == 0)
1100: 20 7b 0a 09 72 65 74 75 72 6e 20 54 6c 73 43 6c {..return TlsCl
1110: 6f 73 65 50 72 6f 63 28 69 6e 73 74 61 6e 63 65 oseProc(instance
1120: 44 61 74 61 2c 20 69 6e 74 65 72 70 29 3b 0a 20 Data, interp);.
1130: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 }. return
1140: 45 49 4e 56 41 4c 3b 0a 7d 0a 0a 2f 2a 0a 20 2a EINVAL;.}../*. *
1150: 2d 2d 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 0a 20 2a -------------. *
11a0: 0a 20 2a 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 . * Tls_WaitForC
11b0: 6f 6e 6e 65 63 74 20 2d 2d 0a 20 2a 0a 20 2a 09 onnect --. *. *.
11c0: 50 65 72 66 6f 72 6d 20 63 6f 6e 6e 65 63 74 20 Perform connect
11d0: 28 63 6c 69 65 6e 74 29 20 6f 72 20 61 63 63 65 (client) or acce
11e0: 70 74 20 28 73 65 72 76 65 72 29 20 66 75 6e 63 pt (server) func
11f0: 74 69 6f 6e 2e 20 41 6c 73 6f 20 70 65 72 66 6f tion. Also perfo
1200: 72 6d 73 0a 20 2a 09 65 71 75 69 76 61 6c 65 6e rms. *.equivalen
1210: 74 20 6f 66 20 68 61 6e 64 73 68 61 6b 65 20 66 t of handshake f
1220: 75 6e 63 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 unction.. *. * R
1230: 65 73 75 6c 74 3a 0a 20 2a 20 20 20 20 31 20 69 esult:. * 1 i
1240: 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 30 20 f successful, 0
1250: 69 66 20 77 61 69 74 20 66 6f 72 20 63 6f 6e 6e if wait for conn
1260: 65 63 74 2c 20 61 6e 64 20 2d 31 20 69 66 20 66 ect, and -1 if f
1270: 61 69 6c 65 64 2e 0a 20 2a 0a 20 2a 20 53 69 64 ailed.. *. * Sid
1280: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 49 73 e effects:. *.Is
1290: 73 75 65 73 20 53 53 4c 5f 61 63 63 65 70 74 20 sues SSL_accept
12a0: 6f 72 20 53 53 4c 5f 63 6f 6e 6e 65 63 74 0a 20 or SSL_connect.
12b0: 2a 0a 20 2a 2d 2d 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 0a 20 2a 2f 0a 69 6e 74 20 54 6c 73 5f 57 61 -. */.int Tls_Wa
1310: 69 74 46 6f 72 43 6f 6e 6e 65 63 74 28 0a 20 20 itForConnect(.
1320: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 State *statePt
1330: 72 2c 09 09 09 2f 2a 20 43 6f 6e 6e 65 63 74 69 r,.../* Connecti
1340: 6f 6e 20 73 74 61 74 65 20 69 6e 66 6f 20 2a 2f on state info */
1350: 0a 20 20 20 20 69 6e 74 20 2a 65 72 72 6f 72 43 . int *errorC
1360: 6f 64 65 50 74 72 2c 09 09 09 2f 2a 20 53 74 6f odePtr,.../* Sto
1370: 72 61 67 65 20 66 6f 72 20 65 72 72 6f 72 20 63 rage for error c
1380: 6f 64 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f ode to return */
1390: 0a 20 20 20 20 69 6e 74 20 68 61 6e 64 73 68 61 . int handsha
13a0: 6b 65 46 61 69 6c 75 72 65 49 73 50 65 72 6d 61 keFailureIsPerma
13b0: 6e 65 6e 74 29 09 2f 2a 20 49 73 20 74 68 65 20 nent)./* Is the
13c0: 63 6f 6e 6e 65 63 74 20 66 61 69 6c 75 72 65 20 connect failure
13d0: 70 65 72 6d 61 6e 65 6e 74 20 2a 2f 0a 7b 0a 20 permanent */.{.
13e0: 20 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 unsigned long
13f0: 20 62 61 63 6b 69 6e 67 45 72 72 6f 72 3b 0a 20 backingError;.
1400: 20 20 20 69 6e 74 20 65 72 72 2c 20 72 63 20 3d int err, rc =
1410: 20 30 3b 0a 20 20 20 20 69 6e 74 20 62 69 6f 53 0;. int bioS
1420: 68 6f 75 6c 64 52 65 74 72 79 3b 0a 20 20 20 20 houldRetry;.
1430: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 *errorCodePtr =
1440: 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 0;.. dprintf(
1450: 22 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 28 "WaitForConnect(
1460: 25 70 29 22 2c 20 28 76 6f 69 64 20 2a 29 20 73 %p)", (void *) s
1470: 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 64 70 tatePtr);. dp
1480: 72 69 6e 74 46 6c 61 67 73 28 73 74 61 74 65 50 rintFlags(stateP
1490: 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 61 6e tr);.. /* Can
14a0: 20 61 6c 73 6f 20 63 68 65 63 6b 20 53 53 4c 5f also check SSL_
14b0: 69 73 5f 69 6e 69 74 5f 66 69 6e 69 73 68 65 64 is_init_finished
14c0: 28 73 73 6c 29 20 2a 2f 0a 20 20 20 20 69 66 20 (ssl) */. if
14d0: 28 21 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 (!(statePtr->fla
14e0: 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f 49 4e 49 gs & TLS_TCL_INI
14f0: 54 29 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 T)) {..dprintf("
1500: 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 Tls_WaitForConne
1510: 63 74 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6c 72 ct called on alr
1520: 65 61 64 79 20 69 6e 69 74 69 61 6c 69 7a 65 64 eady initialized
1530: 20 63 68 61 6e 6e 65 6c 20 2d 2d 20 72 65 74 75 channel -- retu
1540: 72 6e 69 6e 67 20 77 69 74 68 20 69 6d 6d 65 64 rning with immed
1550: 69 61 74 65 20 73 75 63 63 65 73 73 22 29 3b 0a iate success");.
1560: 09 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d .return 1;. }
1570: 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 .. if (stateP
1580: 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f tr->flags & TLS_
1590: 54 43 4c 5f 48 41 4e 44 53 48 41 4b 45 5f 46 41 TCL_HANDSHAKE_FA
15a0: 49 4c 45 44 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 ILED) {../*.. *
15b0: 44 69 66 66 65 72 65 6e 74 20 74 79 70 65 73 20 Different types
15c0: 6f 66 20 6f 70 65 72 61 74 69 6f 6e 73 20 68 61 of operations ha
15d0: 76 65 20 64 69 66 66 65 72 65 6e 74 20 72 65 71 ve different req
15e0: 75 69 72 65 6d 65 6e 74 73 0a 09 20 2a 20 53 53 uirements.. * SS
15f0: 4c 20 62 65 69 6e 67 20 65 73 74 61 62 6c 69 73 L being establis
1600: 68 65 64 0a 09 20 2a 2f 0a 09 69 66 20 28 68 61 hed.. */..if (ha
1610: 6e 64 73 68 61 6b 65 46 61 69 6c 75 72 65 49 73 ndshakeFailureIs
1620: 50 65 72 6d 61 6e 65 6e 74 29 20 7b 0a 09 20 20 Permanent) {..
1630: 20 20 64 70 72 69 6e 74 66 28 22 41 73 6b 65 64 dprintf("Asked
1640: 20 74 6f 20 77 61 69 74 20 66 6f 72 20 61 20 54 to wait for a T
1650: 4c 53 20 68 61 6e 64 73 68 61 6b 65 20 74 68 61 LS handshake tha
1660: 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 66 61 t has already fa
1670: 69 6c 65 64 2e 20 20 52 65 74 75 72 6e 69 6e 67 iled. Returning
1680: 20 66 61 74 61 6c 20 65 72 72 6f 72 22 29 3b 0a fatal error");.
1690: 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 . *errorCodeP
16a0: 74 72 20 3d 20 45 43 4f 4e 4e 41 42 4f 52 54 45 tr = ECONNABORTE
16b0: 44 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 D;..} else {..
16c0: 20 20 64 70 72 69 6e 74 66 28 22 41 73 6b 65 64 dprintf("Asked
16d0: 20 74 6f 20 77 61 69 74 20 66 6f 72 20 61 20 54 to wait for a T
16e0: 4c 53 20 68 61 6e 64 73 68 61 6b 65 20 74 68 61 LS handshake tha
16f0: 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 66 61 t has already fa
1700: 69 6c 65 64 2e 20 20 52 65 74 75 72 6e 69 6e 67 iled. Returning
1710: 20 73 6f 66 74 20 65 72 72 6f 72 22 29 3b 0a 09 soft error");..
1720: 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 *errorCodePt
1730: 72 20 3d 20 45 43 4f 4e 4e 52 45 53 45 54 3b 0a r = ECONNRESET;.
1740: 09 7d 0a 09 72 65 74 75 72 6e 20 2d 31 3b 0a 20 .}..return -1;.
1750: 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 20 28 3b }.. for (;
1760: 3b 29 20 7b 0a 09 45 52 52 5f 63 6c 65 61 72 5f ;) {..ERR_clear_
1770: 65 72 72 6f 72 28 29 3b 0a 09 42 49 4f 5f 63 6c error();..BIO_cl
1780: 65 61 72 5f 72 65 74 72 79 5f 66 6c 61 67 73 28 ear_retry_flags(
1790: 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a statePtr->bio);.
17a0: 0a 09 2f 2a 20 4e 6f 74 20 69 6e 69 74 69 61 6c ../* Not initial
17b0: 69 7a 65 64 20 79 65 74 21 20 41 6c 73 6f 20 63 ized yet! Also c
17c0: 61 6c 6c 73 20 53 53 4c 5f 64 6f 5f 68 61 6e 64 alls SSL_do_hand
17d0: 73 68 61 6b 65 28 29 2e 20 2a 2f 0a 09 69 66 20 shake(). */..if
17e0: 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 (statePtr->flags
17f0: 20 26 20 54 4c 53 5f 54 43 4c 5f 53 45 52 56 45 & TLS_TCL_SERVE
1800: 52 29 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 R) {.. dprint
1810: 66 28 22 43 61 6c 6c 69 6e 67 20 53 53 4c 5f 61 f("Calling SSL_a
1820: 63 63 65 70 74 28 29 22 29 3b 0a 09 20 20 20 20 ccept()");..
1830: 65 72 72 20 3d 20 53 53 4c 5f 61 63 63 65 70 74 err = SSL_accept
1840: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b (statePtr->ssl);
1850: 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 ...} else {..
1860: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 69 6e dprintf("Callin
1870: 67 20 53 53 4c 5f 63 6f 6e 6e 65 63 74 28 29 22 g SSL_connect()"
1880: 29 3b 0a 09 20 20 20 20 65 72 72 20 3d 20 53 53 );.. err = SS
1890: 4c 5f 63 6f 6e 6e 65 63 74 28 73 74 61 74 65 50 L_connect(stateP
18a0: 74 72 2d 3e 73 73 6c 29 3b 0a 09 7d 0a 0a 09 2f tr->ssl);..}.../
18b0: 2a 20 31 3d 73 75 63 63 65 73 73 66 75 6c 2c 20 * 1=successful,
18c0: 30 3d 6e 6f 74 20 73 75 63 63 65 73 73 66 75 6c 0=not successful
18d0: 20 61 6e 64 20 73 68 75 74 20 64 6f 77 6e 2c 20 and shut down,
18e0: 3c 30 3d 66 61 74 61 6c 20 65 72 72 6f 72 20 2a <0=fatal error *
18f0: 2f 0a 09 69 66 20 28 65 72 72 20 3e 20 30 29 20 /..if (err > 0)
1900: 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 {.. dprintf("
1910: 41 63 63 65 70 74 20 6f 72 20 63 6f 6e 6e 65 63 Accept or connec
1920: 74 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c t was successful
1930: 22 29 3b 0a 0a 09 20 20 20 20 65 72 72 20 3d 20 ");... err =
1940: 42 49 4f 5f 66 6c 75 73 68 28 73 74 61 74 65 50 BIO_flush(stateP
1950: 74 72 2d 3e 62 69 6f 29 3b 0a 09 20 20 20 20 69 tr->bio);.. i
1960: 66 20 28 65 72 72 20 3c 3d 20 30 29 20 7b 0a 09 f (err <= 0) {..
1970: 09 64 70 72 69 6e 74 66 28 22 46 6c 75 73 68 69 .dprintf("Flushi
1980: 6e 67 20 74 68 65 20 6c 6f 77 65 72 20 6c 61 79 ng the lower lay
1990: 65 72 73 20 66 61 69 6c 65 64 2c 20 74 68 69 73 ers failed, this
19a0: 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20 74 will probably t
19b0: 65 72 6d 69 6e 61 74 65 20 74 68 69 73 20 73 65 erminate this se
19c0: 73 73 69 6f 6e 22 29 3b 0a 09 20 20 20 20 7d 0a ssion");.. }.
19d0: 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 64 .} else {.. d
19e0: 70 72 69 6e 74 66 28 22 41 63 63 65 70 74 20 6f printf("Accept o
19f0: 72 20 63 6f 6e 6e 65 63 74 20 66 61 69 6c 65 64 r connect failed
1a00: 22 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 61 6d 65 ");..}.../* Same
1a10: 20 61 73 20 53 53 4c 5f 77 61 6e 74 2c 20 62 75 as SSL_want, bu
1a20: 74 20 61 6c 73 6f 20 63 68 65 63 6b 73 20 74 68 t also checks th
1a30: 65 20 65 72 72 6f 72 20 71 75 65 75 65 20 2a 2f e error queue */
1a40: 0a 09 72 63 20 3d 20 53 53 4c 5f 67 65 74 5f 65 ..rc = SSL_get_e
1a50: 72 72 6f 72 28 73 74 61 74 65 50 74 72 2d 3e 73 rror(statePtr->s
1a60: 73 6c 2c 20 65 72 72 29 3b 0a 09 62 61 63 6b 69 sl, err);..backi
1a70: 6e 67 45 72 72 6f 72 20 3d 20 45 52 52 5f 67 65 ngError = ERR_ge
1a80: 74 5f 65 72 72 6f 72 28 29 3b 0a 09 69 66 20 28 t_error();..if (
1a90: 72 63 20 21 3d 20 53 53 4c 5f 45 52 52 4f 52 5f rc != SSL_ERROR_
1aa0: 4e 4f 4e 45 29 20 7b 0a 09 20 20 20 20 64 70 72 NONE) {.. dpr
1ab0: 69 6e 74 66 28 22 47 6f 74 20 65 72 72 6f 72 3a intf("Got error:
1ac0: 20 25 69 20 28 72 63 20 3d 20 25 69 29 22 2c 20 %i (rc = %i)",
1ad0: 65 72 72 2c 20 72 63 29 3b 0a 09 20 20 20 20 64 err, rc);.. d
1ae0: 70 72 69 6e 74 66 28 22 47 6f 74 20 65 72 72 6f printf("Got erro
1af0: 72 3a 20 25 73 22 2c 20 45 52 52 5f 72 65 61 73 r: %s", ERR_reas
1b00: 6f 6e 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 on_error_string(
1b10: 62 61 63 6b 69 6e 67 45 72 72 6f 72 29 29 3b 0a backingError));.
1b20: 09 7d 0a 0a 09 2f 2a 20 54 68 65 20 72 65 74 72 .}.../* The retr
1b30: 79 20 66 6c 61 67 20 69 73 20 73 65 74 20 62 79 y flag is set by
1b40: 20 74 68 65 20 42 49 4f 5f 73 65 74 5f 72 65 74 the BIO_set_ret
1b50: 72 79 5f 2a 20 66 75 6e 63 74 69 6f 6e 73 20 2a ry_* functions *
1b60: 2f 0a 09 62 69 6f 53 68 6f 75 6c 64 52 65 74 72 /..bioShouldRetr
1b70: 79 20 3d 20 42 49 4f 5f 73 68 6f 75 6c 64 5f 72 y = BIO_should_r
1b80: 65 74 72 79 28 73 74 61 74 65 50 74 72 2d 3e 62 etry(statePtr->b
1b90: 69 6f 29 3b 0a 09 64 70 72 69 6e 74 66 28 22 62 io);..dprintf("b
1ba0: 69 6f 53 68 6f 75 6c 64 52 65 74 72 79 20 3d 20 ioShouldRetry =
1bb0: 25 64 22 2c 20 62 69 6f 53 68 6f 75 6c 64 52 65 %d", bioShouldRe
1bc0: 74 72 79 29 3b 0a 0a 09 69 66 20 28 65 72 72 20 try);...if (err
1bd0: 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 69 66 20 <= 0) {.. if
1be0: 28 72 63 20 3d 3d 20 53 53 4c 5f 45 52 52 4f 52 (rc == SSL_ERROR
1bf0: 5f 57 41 4e 54 5f 43 4f 4e 4e 45 43 54 20 7c 7c _WANT_CONNECT ||
1c00: 20 72 63 20 3d 3d 20 53 53 4c 5f 45 52 52 4f 52 rc == SSL_ERROR
1c10: 5f 57 41 4e 54 5f 41 43 43 45 50 54 29 20 7b 0a _WANT_ACCEPT) {.
1c20: 09 09 62 69 6f 53 68 6f 75 6c 64 52 65 74 72 79 ..bioShouldRetry
1c30: 20 3d 20 31 3b 0a 09 20 20 20 20 7d 20 65 6c 73 = 1;.. } els
1c40: 65 20 69 66 20 28 72 63 20 3d 3d 20 53 53 4c 5f e if (rc == SSL_
1c50: 45 52 52 4f 52 5f 57 41 4e 54 5f 52 45 41 44 29 ERROR_WANT_READ)
1c60: 20 7b 0a 09 09 62 69 6f 53 68 6f 75 6c 64 52 65 {...bioShouldRe
1c70: 74 72 79 20 3d 20 31 3b 0a 09 09 73 74 61 74 65 try = 1;...state
1c80: 50 74 72 2d 3e 77 61 6e 74 20 7c 3d 20 54 43 4c Ptr->want |= TCL
1c90: 5f 52 45 41 44 41 42 4c 45 3b 0a 09 20 20 20 20 _READABLE;..
1ca0: 7d 20 65 6c 73 65 20 69 66 20 28 72 63 20 3d 3d } else if (rc ==
1cb0: 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f SSL_ERROR_WANT_
1cc0: 57 52 49 54 45 29 20 7b 0a 09 09 62 69 6f 53 68 WRITE) {...bioSh
1cd0: 6f 75 6c 64 52 65 74 72 79 20 3d 20 31 3b 0a 09 ouldRetry = 1;..
1ce0: 09 73 74 61 74 65 50 74 72 2d 3e 77 61 6e 74 20 .statePtr->want
1cf0: 7c 3d 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 3b |= TCL_WRITABLE;
1d00: 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 69 66 20 .. }..}...if
1d10: 28 62 69 6f 53 68 6f 75 6c 64 52 65 74 72 79 29 (bioShouldRetry)
1d20: 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 {.. dprintf(
1d30: 22 54 68 65 20 49 2f 4f 20 64 69 64 20 6e 6f 74 "The I/O did not
1d40: 20 63 6f 6d 70 6c 65 74 65 20 2d 2d 20 62 75 74 complete -- but
1d50: 20 77 65 20 73 68 6f 75 6c 64 20 74 72 79 20 69 we should try i
1d60: 74 20 61 67 61 69 6e 22 29 3b 0a 0a 09 20 20 20 t again");...
1d70: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 66 if (statePtr->f
1d80: 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f 41 lags & TLS_TCL_A
1d90: 53 59 4e 43 29 20 7b 0a 09 09 64 70 72 69 6e 74 SYNC) {...dprint
1da0: 66 28 22 52 65 74 75 72 6e 69 6e 67 20 45 41 47 f("Returning EAG
1db0: 41 49 4e 20 73 6f 20 74 68 61 74 20 69 74 20 63 AIN so that it c
1dc0: 61 6e 20 62 65 20 72 65 74 72 69 65 64 20 6c 61 an be retried la
1dd0: 74 65 72 22 29 3b 0a 09 09 2a 65 72 72 6f 72 43 ter");...*errorC
1de0: 6f 64 65 50 74 72 20 3d 20 45 41 47 41 49 4e 3b odePtr = EAGAIN;
1df0: 0a 09 09 72 65 74 75 72 6e 20 30 3b 0a 09 20 20 ...return 0;..
1e00: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 64 70 72 } else {...dpr
1e10: 69 6e 74 66 28 22 44 6f 69 6e 67 20 73 6f 20 6e intf("Doing so n
1e20: 6f 77 22 29 3b 0a 09 09 63 6f 6e 74 69 6e 75 65 ow");...continue
1e30: 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 64 70 ;.. }..}...dp
1e40: 72 69 6e 74 66 28 22 57 65 20 68 61 76 65 20 65 rintf("We have e
1e50: 69 74 68 65 72 20 63 6f 6d 70 6c 65 74 65 6c 79 ither completely
1e60: 20 65 73 74 61 62 6c 69 73 68 65 64 20 74 68 65 established the
1e70: 20 73 65 73 73 69 6f 6e 20 6f 72 20 63 6f 6d 70 session or comp
1e80: 6c 65 74 65 6c 79 20 66 61 69 6c 65 64 20 69 74 letely failed it
1e90: 20 2d 2d 20 74 68 65 72 65 20 69 73 20 6e 6f 20 -- there is no
1ea0: 6d 6f 72 65 20 6e 65 65 64 20 74 6f 20 65 76 65 more need to eve
1eb0: 72 20 72 65 74 72 79 20 69 74 20 74 68 6f 75 67 r retry it thoug
1ec0: 68 22 29 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 h");..break;.
1ed0: 20 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28 }.. switch (
1ee0: 72 63 29 20 7b 0a 09 63 61 73 65 20 53 53 4c 5f rc) {..case SSL_
1ef0: 45 52 52 4f 52 5f 4e 4f 4e 45 3a 0a 09 20 20 20 ERROR_NONE:..
1f00: 20 2f 2a 20 54 68 65 20 54 4c 53 2f 53 53 4c 20 /* The TLS/SSL
1f10: 49 2f 4f 20 6f 70 65 72 61 74 69 6f 6e 20 63 6f I/O operation co
1f20: 6d 70 6c 65 74 65 64 20 73 75 63 63 65 73 73 66 mpleted successf
1f30: 75 6c 6c 79 20 2a 2f 0a 09 20 20 20 20 64 70 72 ully */.. dpr
1f40: 69 6e 74 66 28 22 53 53 4c 5f 45 52 52 4f 52 5f intf("SSL_ERROR_
1f50: 4e 4f 4e 45 22 29 3b 0a 09 20 20 20 20 2a 65 72 NONE");.. *er
1f60: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a rorCodePtr = 0;.
1f70: 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 63 61 . break;...ca
1f80: 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 53 53 4c se SSL_ERROR_SSL
1f90: 3a 0a 09 20 20 20 20 2f 2a 20 41 20 6e 6f 6e 2d :.. /* A non-
1fa0: 72 65 63 6f 76 65 72 61 62 6c 65 2c 20 66 61 74 recoverable, fat
1fb0: 61 6c 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20 al error in the
1fc0: 53 53 4c 20 6c 69 62 72 61 72 79 20 6f 63 63 75 SSL library occu
1fd0: 72 72 65 64 2c 0a 09 20 20 20 20 20 20 20 75 73 rred,.. us
1fe0: 75 61 6c 6c 79 20 61 20 70 72 6f 74 6f 63 6f 6c ually a protocol
1ff0: 20 65 72 72 6f 72 2e 20 54 68 69 73 20 69 6e 63 error. This inc
2000: 6c 75 64 65 73 20 63 65 72 74 69 66 69 63 61 74 ludes certificat
2010: 65 20 76 61 6c 69 64 61 74 69 6f 6e 0a 09 20 20 e validation..
2020: 20 20 20 20 20 65 72 72 6f 72 73 2e 20 2a 2f 0a errors. */.
2030: 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 53 53 . dprintf("SS
2040: 4c 5f 45 52 52 4f 52 5f 53 53 4c 3a 20 46 61 74 L_ERROR_SSL: Fat
2050: 61 6c 20 53 53 4c 20 70 72 6f 74 6f 63 6f 6c 20 al SSL protocol
2060: 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 22 29 error occurred")
2070: 3b 0a 09 20 20 20 20 69 66 20 28 53 53 4c 5f 67 ;.. if (SSL_g
2080: 65 74 5f 76 65 72 69 66 79 5f 72 65 73 75 6c 74 et_verify_result
2090: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 (statePtr->ssl)
20a0: 21 3d 20 58 35 30 39 5f 56 5f 4f 4b 29 20 7b 0a != X509_V_OK) {.
20b0: 09 09 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 ..Tls_Error(stat
20c0: 65 50 74 72 2c 0a 09 09 20 20 20 20 58 35 30 39 ePtr,... X509
20d0: 5f 76 65 72 69 66 79 5f 63 65 72 74 5f 65 72 72 _verify_cert_err
20e0: 6f 72 5f 73 74 72 69 6e 67 28 53 53 4c 5f 67 65 or_string(SSL_ge
20f0: 74 5f 76 65 72 69 66 79 5f 72 65 73 75 6c 74 28 t_verify_result(
2100: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 29 29 statePtr->ssl)))
2110: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 69 66 ;.. }.. if
2120: 20 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 20 21 (backingError !
2130: 3d 20 30 29 20 7b 0a 09 09 54 6c 73 5f 45 72 72 = 0) {...Tls_Err
2140: 6f 72 28 73 74 61 74 65 50 74 72 2c 20 45 52 52 or(statePtr, ERR
2150: 5f 72 65 61 73 6f 6e 5f 65 72 72 6f 72 5f 73 74 _reason_error_st
2160: 72 69 6e 67 28 62 61 63 6b 69 6e 67 45 72 72 6f ring(backingErro
2170: 72 29 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 r));.. }..
2180: 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 statePtr->flags
2190: 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 48 41 4e 44 |= TLS_TCL_HAND
21a0: 53 48 41 4b 45 5f 46 41 49 4c 45 44 3b 0a 09 20 SHAKE_FAILED;..
21b0: 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 *errorCodePtr
21c0: 20 3d 20 45 43 4f 4e 4e 41 42 4f 52 54 45 44 3b = ECONNABORTED;
21d0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b .. return -1;
21e0: 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f ...case SSL_ERRO
21f0: 52 5f 57 41 4e 54 5f 52 45 41 44 3a 0a 09 20 20 R_WANT_READ:..
2200: 20 20 2f 2a 20 4d 6f 72 65 20 64 61 74 61 20 6d /* More data m
2210: 75 73 74 20 62 65 20 72 65 61 64 20 66 72 6f 6d ust be read from
2220: 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 the underlying
2230: 42 49 4f 20 6c 61 79 65 72 20 69 6e 20 6f 72 64 BIO layer in ord
2240: 65 72 20 74 6f 0a 09 20 20 20 20 20 20 20 63 6f er to.. co
2250: 6d 70 6c 65 74 65 20 74 68 65 20 61 63 74 75 61 mplete the actua
2260: 6c 20 53 53 4c 5f 2a 28 29 20 6f 70 65 72 61 74 l SSL_*() operat
2270: 69 6f 6e 2e 20 20 2a 2f 0a 09 20 20 20 20 64 70 ion. */.. dp
2280: 72 69 6e 74 66 28 22 53 53 4c 5f 45 52 52 4f 52 rintf("SSL_ERROR
2290: 5f 57 41 4e 54 5f 52 45 41 44 22 29 3b 0a 09 20 _WANT_READ");..
22a0: 20 20 20 42 49 4f 5f 73 65 74 5f 72 65 74 72 79 BIO_set_retry
22b0: 5f 72 65 61 64 28 73 74 61 74 65 50 74 72 2d 3e _read(statePtr->
22c0: 62 69 6f 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f bio);.. *erro
22d0: 72 43 6f 64 65 50 74 72 20 3d 20 45 41 47 41 49 rCodePtr = EAGAI
22e0: 4e 3b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 N;.. dprintf(
22f0: 22 45 52 52 28 53 53 4c 5f 45 52 52 4f 52 5f 57 "ERR(SSL_ERROR_W
2300: 41 4e 54 5f 52 45 41 44 2c 20 45 41 47 41 49 4e ANT_READ, EAGAIN
2310: 29 22 29 3b 0a 09 20 20 20 20 73 74 61 74 65 50 )");.. stateP
2320: 74 72 2d 3e 77 61 6e 74 20 7c 3d 20 54 43 4c 5f tr->want |= TCL_
2330: 52 45 41 44 41 42 4c 45 3b 0a 09 20 20 20 20 72 READABLE;.. r
2340: 65 74 75 72 6e 20 30 3b 0a 0a 09 63 61 73 65 20 eturn 0;...case
2350: 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 57 SSL_ERROR_WANT_W
2360: 52 49 54 45 3a 0a 09 20 20 20 20 2f 2a 20 54 68 RITE:.. /* Th
2370: 65 72 65 20 69 73 20 64 61 74 61 20 69 6e 20 74 ere is data in t
2380: 68 65 20 53 53 4c 20 62 75 66 66 65 72 20 74 68 he SSL buffer th
2390: 61 74 20 6d 75 73 74 20 62 65 20 77 72 69 74 74 at must be writt
23a0: 65 6e 20 74 6f 20 74 68 65 0a 09 20 20 20 20 20 en to the..
23b0: 20 20 75 6e 64 65 72 6c 79 69 6e 67 20 42 49 4f underlying BIO
23c0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6d in order to com
23d0: 70 6c 65 74 65 20 74 68 65 20 53 53 4c 5f 2a 28 plete the SSL_*(
23e0: 29 20 6f 70 65 72 61 74 69 6f 6e 2e 20 2a 2f 0a ) operation. */.
23f0: 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 53 53 . dprintf("SS
2400: 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 57 52 49 L_ERROR_WANT_WRI
2410: 54 45 22 29 3b 0a 09 20 20 20 20 42 49 4f 5f 73 TE");.. BIO_s
2420: 65 74 5f 72 65 74 72 79 5f 77 72 69 74 65 28 73 et_retry_write(s
2430: 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 tatePtr->bio);..
2440: 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 *errorCodePt
2450: 72 20 3d 20 45 41 47 41 49 4e 3b 0a 09 20 20 20 r = EAGAIN;..
2460: 20 64 70 72 69 6e 74 66 28 22 45 52 52 28 53 53 dprintf("ERR(SS
2470: 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 57 52 49 L_ERROR_WANT_WRI
2480: 54 45 2c 20 45 41 47 41 49 4e 29 22 29 3b 0a 09 TE, EAGAIN)");..
2490: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 77 61 statePtr->wa
24a0: 6e 74 20 7c 3d 20 54 43 4c 5f 57 52 49 54 41 42 nt |= TCL_WRITAB
24b0: 4c 45 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 LE;.. return
24c0: 30 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 0;...case SSL_ER
24d0: 52 4f 52 5f 57 41 4e 54 5f 58 35 30 39 5f 4c 4f ROR_WANT_X509_LO
24e0: 4f 4b 55 50 3a 0a 09 20 20 20 20 2f 2a 20 54 68 OKUP:.. /* Th
24f0: 65 20 6f 70 65 72 61 74 69 6f 6e 20 64 69 64 20 e operation did
2500: 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 63 not complete bec
2510: 61 75 73 65 20 61 6e 20 61 70 70 6c 69 63 61 74 ause an applicat
2520: 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 0a 09 20 20 ion callback..
2530: 20 20 20 20 20 73 65 74 20 62 79 20 53 53 4c 5f set by SSL_
2540: 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 63 CTX_set_client_c
2550: 65 72 74 5f 63 62 28 29 20 68 61 73 20 61 73 6b ert_cb() has ask
2560: 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 ed to be called
2570: 61 67 61 69 6e 2e 20 2a 2f 0a 09 20 20 20 20 64 again. */.. d
2580: 70 72 69 6e 74 66 28 22 53 53 4c 5f 45 52 52 4f printf("SSL_ERRO
2590: 52 5f 57 41 4e 54 5f 58 35 30 39 5f 4c 4f 4f 4b R_WANT_X509_LOOK
25a0: 55 50 22 29 3b 0a 09 20 20 20 20 42 49 4f 5f 73 UP");.. BIO_s
25b0: 65 74 5f 72 65 74 72 79 5f 73 70 65 63 69 61 6c et_retry_special
25c0: 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b (statePtr->bio);
25d0: 0a 09 20 20 20 20 42 49 4f 5f 73 65 74 5f 72 65 .. BIO_set_re
25e0: 74 72 79 5f 72 65 61 73 6f 6e 28 73 74 61 74 65 try_reason(state
25f0: 50 74 72 2d 3e 62 69 6f 2c 20 42 49 4f 5f 52 52 Ptr->bio, BIO_RR
2600: 5f 53 53 4c 5f 58 35 30 39 5f 4c 4f 4f 4b 55 50 _SSL_X509_LOOKUP
2610: 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f );.. *errorCo
2620: 64 65 50 74 72 20 3d 20 45 41 47 41 49 4e 3b 0a dePtr = EAGAIN;.
2630: 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 45 52 . dprintf("ER
2640: 52 28 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 R(SSL_ERROR_WANT
2650: 5f 58 35 30 39 5f 4c 4f 4f 4b 55 50 2c 20 45 41 _X509_LOOKUP, EA
2660: 47 41 49 4e 29 22 29 3b 0a 09 20 20 20 20 72 65 GAIN)");.. re
2670: 74 75 72 6e 20 30 3b 0a 0a 09 63 61 73 65 20 53 turn 0;...case S
2680: 53 4c 5f 45 52 52 4f 52 5f 53 59 53 43 41 4c 4c SL_ERROR_SYSCALL
2690: 3a 0a 09 20 20 20 20 2f 2a 20 53 6f 6d 65 20 6e :.. /* Some n
26a0: 6f 6e 2d 72 65 63 6f 76 65 72 61 62 6c 65 2c 20 on-recoverable,
26b0: 66 61 74 61 6c 20 49 2f 4f 20 65 72 72 6f 72 20 fatal I/O error
26c0: 6f 63 63 75 72 72 65 64 20 2a 2f 0a 09 20 20 20 occurred */..
26d0: 20 64 70 72 69 6e 74 66 28 22 53 53 4c 5f 45 52 dprintf("SSL_ER
26e0: 52 4f 52 5f 53 59 53 43 41 4c 4c 3a 20 46 61 74 ROR_SYSCALL: Fat
26f0: 61 6c 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 al I/O error occ
2700: 75 72 72 65 64 22 29 3b 0a 0a 09 20 20 20 20 69 urred");... i
2710: 66 20 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 20 f (backingError
2720: 3d 3d 20 30 20 26 26 20 65 72 72 20 3d 3d 20 30 == 0 && err == 0
2730: 29 20 7b 0a 09 09 64 70 72 69 6e 74 66 28 22 45 ) {...dprintf("E
2740: 4f 46 20 72 65 61 63 68 65 64 22 29 0a 09 09 2a OF reached")...*
2750: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 errorCodePtr = E
2760: 43 4f 4e 4e 52 45 53 45 54 3b 0a 09 09 54 6c 73 CONNRESET;...Tls
2770: 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c _Error(statePtr,
2780: 20 22 28 75 6e 65 78 70 65 63 74 65 64 29 20 45 "(unexpected) E
2790: 4f 46 20 72 65 61 63 68 65 64 22 29 3b 0a 0a 09 OF reached");...
27a0: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 62 } else if (b
27b0: 61 63 6b 69 6e 67 45 72 72 6f 72 20 3d 3d 20 30 ackingError == 0
27c0: 20 26 26 20 65 72 72 20 3d 3d 20 2d 31 29 20 7b && err == -1) {
27d0: 0a 09 09 64 70 72 69 6e 74 66 28 22 49 2f 4f 20 ...dprintf("I/O
27e0: 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 28 error occurred (
27f0: 65 72 72 6e 6f 20 3d 20 25 6c 75 29 22 2c 20 28 errno = %lu)", (
2800: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 54 unsigned long) T
2810: 63 6c 5f 47 65 74 45 72 72 6e 6f 28 29 29 3b 0a cl_GetErrno());.
2820: 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 ..*errorCodePtr
2830: 3d 20 54 63 6c 5f 47 65 74 45 72 72 6e 6f 28 29 = Tcl_GetErrno()
2840: 3b 0a 09 09 69 66 20 28 2a 65 72 72 6f 72 43 6f ;...if (*errorCo
2850: 64 65 50 74 72 20 3d 3d 20 45 43 4f 4e 4e 52 45 dePtr == ECONNRE
2860: 53 45 54 29 20 7b 0a 09 09 20 20 20 20 2a 65 72 SET) {... *er
2870: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 43 4f rorCodePtr = ECO
2880: 4e 4e 41 42 4f 52 54 45 44 3b 0a 09 09 7d 0a 09 NNABORTED;...}..
2890: 09 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 .Tls_Error(state
28a0: 50 74 72 2c 20 54 63 6c 5f 45 72 72 6e 6f 4d 73 Ptr, Tcl_ErrnoMs
28b0: 67 28 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29 g(*errorCodePtr)
28c0: 29 3b 0a 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 );... } else
28d0: 7b 0a 09 09 64 70 72 69 6e 74 66 28 22 49 2f 4f {...dprintf("I/O
28e0: 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 error occurred
28f0: 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 20 3d 20 (backingError =
2900: 25 6c 75 29 22 2c 20 62 61 63 6b 69 6e 67 45 72 %lu)", backingEr
2910: 72 6f 72 29 3b 0a 09 09 2a 65 72 72 6f 72 43 6f ror);...*errorCo
2920: 64 65 50 74 72 20 3d 20 54 63 6c 5f 47 65 74 45 dePtr = Tcl_GetE
2930: 72 72 6e 6f 28 29 3b 0a 09 09 69 66 20 28 2a 65 rrno();...if (*e
2940: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 3d 20 45 rrorCodePtr == E
2950: 43 4f 4e 4e 52 45 53 45 54 29 20 7b 0a 09 09 20 CONNRESET) {...
2960: 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 *errorCodePtr
2970: 20 3d 20 45 43 4f 4e 4e 41 42 4f 52 54 45 44 3b = ECONNABORTED;
2980: 0a 09 09 7d 0a 09 09 54 6c 73 5f 45 72 72 6f 72 ...}...Tls_Error
2990: 28 73 74 61 74 65 50 74 72 2c 20 45 52 52 5f 72 (statePtr, ERR_r
29a0: 65 61 73 6f 6e 5f 65 72 72 6f 72 5f 73 74 72 69 eason_error_stri
29b0: 6e 67 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 29 ng(backingError)
29c0: 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 );.. }...
29d0: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 statePtr->flags
29e0: 7c 3d 20 54 4c 53 5f 54 43 4c 5f 48 41 4e 44 53 |= TLS_TCL_HANDS
29f0: 48 41 4b 45 5f 46 41 49 4c 45 44 3b 0a 09 20 20 HAKE_FAILED;..
2a00: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 0a 09 63 return -1;...c
2a10: 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 5a 45 ase SSL_ERROR_ZE
2a20: 52 4f 5f 52 45 54 55 52 4e 3a 0a 09 20 20 20 20 RO_RETURN:..
2a30: 2f 2a 20 50 65 65 72 20 68 61 73 20 63 6c 65 61 /* Peer has clea
2a40: 6e 6c 79 20 63 6c 6f 73 65 64 20 74 68 65 20 63 nly closed the c
2a50: 6f 6e 6e 65 63 74 69 6f 6e 20 62 79 20 73 65 6e onnection by sen
2a60: 64 69 6e 67 20 74 68 65 20 63 6c 6f 73 65 5f 6e ding the close_n
2a70: 6f 74 69 66 79 0a 09 20 20 20 20 20 20 20 61 6c otify.. al
2a80: 65 72 74 2e 20 43 61 6e 27 74 20 72 65 61 64 2c ert. Can't read,
2a90: 20 62 75 74 20 63 61 6e 20 77 72 69 74 65 2e 20 but can write.
2aa0: 4e 65 65 64 20 74 6f 20 72 65 74 75 72 6e 20 61 Need to return a
2ab0: 6e 20 45 4f 46 2c 20 73 6f 20 74 68 65 0a 09 20 n EOF, so the..
2ac0: 20 20 20 20 20 20 63 68 61 6e 6e 65 6c 20 69 73 channel is
2ad0: 20 63 6c 6f 73 65 64 20 77 68 69 63 68 20 77 69 closed which wi
2ae0: 6c 6c 20 73 65 6e 64 20 61 6e 20 53 53 4c 5f 73 ll send an SSL_s
2af0: 68 75 74 64 6f 77 6e 28 29 2e 20 2a 2f 0a 09 20 hutdown(). */..
2b00: 20 20 20 64 70 72 69 6e 74 66 28 22 53 53 4c 5f dprintf("SSL_
2b10: 45 52 52 4f 52 5f 5a 45 52 4f 5f 52 45 54 55 52 ERROR_ZERO_RETUR
2b20: 4e 3a 20 50 65 65 72 20 68 61 73 20 63 6c 6f 73 N: Peer has clos
2b30: 65 64 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f ed the connectio
2b40: 6e 22 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 n");.. *error
2b50: 43 6f 64 65 50 74 72 20 3d 20 45 43 4f 4e 4e 52 CodePtr = ECONNR
2b60: 45 53 45 54 3b 0a 09 20 20 20 20 54 6c 73 5f 45 ESET;.. Tls_E
2b70: 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20 22 rror(statePtr, "
2b80: 50 65 65 72 20 68 61 73 20 63 6c 6f 73 65 64 20 Peer has closed
2b90: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 the connection f
2ba0: 6f 72 20 77 72 69 74 69 6e 67 20 62 79 20 73 65 or writing by se
2bb0: 6e 64 69 6e 67 20 74 68 65 20 63 6c 6f 73 65 5f nding the close_
2bc0: 6e 6f 74 69 66 79 20 61 6c 65 72 74 22 29 3b 0a notify alert");.
2bd0: 09 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a . return -1;.
2be0: 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 ..case SSL_ERROR
2bf0: 5f 57 41 4e 54 5f 43 4f 4e 4e 45 43 54 3a 0a 09 _WANT_CONNECT:..
2c00: 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 65 72 61 /* The opera
2c10: 74 69 6f 6e 20 64 69 64 20 6e 6f 74 20 63 6f 6d tion did not com
2c20: 70 6c 65 74 65 20 61 6e 64 20 63 6f 6e 6e 65 63 plete and connec
2c30: 74 20 77 6f 75 6c 64 20 68 61 76 65 20 62 6c 6f t would have blo
2c40: 63 6b 65 64 2e 0a 09 20 20 20 20 20 20 20 52 65 cked... Re
2c50: 74 72 79 20 61 67 61 69 6e 20 61 66 74 65 72 20 try again after
2c60: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 65 73 connection is es
2c70: 74 61 62 6c 69 73 68 65 64 2e 20 2a 2f 0a 09 20 tablished. */..
2c80: 20 20 20 64 70 72 69 6e 74 66 28 22 53 53 4c 5f dprintf("SSL_
2c90: 45 52 52 4f 52 5f 57 41 4e 54 5f 43 4f 4e 4e 45 ERROR_WANT_CONNE
2ca0: 43 54 22 29 3b 0a 09 20 20 20 20 42 49 4f 5f 73 CT");.. BIO_s
2cb0: 65 74 5f 72 65 74 72 79 5f 73 70 65 63 69 61 6c et_retry_special
2cc0: 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b (statePtr->bio);
2cd0: 0a 09 20 20 20 20 42 49 4f 5f 73 65 74 5f 72 65 .. BIO_set_re
2ce0: 74 72 79 5f 72 65 61 73 6f 6e 28 73 74 61 74 65 try_reason(state
2cf0: 50 74 72 2d 3e 62 69 6f 2c 20 42 49 4f 5f 52 52 Ptr->bio, BIO_RR
2d00: 5f 43 4f 4e 4e 45 43 54 29 3b 0a 09 20 20 20 20 _CONNECT);..
2d10: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 *errorCodePtr =
2d20: 45 41 47 41 49 4e 3b 0a 09 20 20 20 20 64 70 72 EAGAIN;.. dpr
2d30: 69 6e 74 66 28 22 45 52 52 28 53 53 4c 5f 45 52 intf("ERR(SSL_ER
2d40: 52 4f 52 5f 57 41 4e 54 5f 43 4f 4e 4e 45 43 54 ROR_WANT_CONNECT
2d50: 2c 20 45 41 47 41 49 4e 29 22 29 3b 0a 09 20 20 , EAGAIN)");..
2d60: 20 20 72 65 74 75 72 6e 20 30 3b 0a 0a 09 63 61 return 0;...ca
2d70: 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e se SSL_ERROR_WAN
2d80: 54 5f 41 43 43 45 50 54 3a 0a 09 20 20 20 20 2f T_ACCEPT:.. /
2d90: 2a 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 * The operation
2da0: 64 69 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 did not complete
2db0: 20 61 6e 64 20 61 63 63 65 70 74 20 77 6f 75 6c and accept woul
2dc0: 64 20 68 61 76 65 20 62 6c 6f 63 6b 65 64 2e 0a d have blocked..
2dd0: 09 20 20 20 20 20 20 20 52 65 74 72 79 20 61 67 . Retry ag
2de0: 61 69 6e 20 61 66 74 65 72 20 63 6f 6e 6e 65 63 ain after connec
2df0: 74 69 6f 6e 20 69 73 20 65 73 74 61 62 6c 69 73 tion is establis
2e00: 68 65 64 2e 20 2a 2f 0a 09 20 20 20 20 64 70 72 hed. */.. dpr
2e10: 69 6e 74 66 28 22 53 53 4c 5f 45 52 52 4f 52 5f intf("SSL_ERROR_
2e20: 57 41 4e 54 5f 41 43 43 45 50 54 22 29 3b 0a 09 WANT_ACCEPT");..
2e30: 20 20 20 20 42 49 4f 5f 73 65 74 5f 72 65 74 72 BIO_set_retr
2e40: 79 5f 73 70 65 63 69 61 6c 28 73 74 61 74 65 50 y_special(stateP
2e50: 74 72 2d 3e 62 69 6f 29 3b 0a 09 20 20 20 20 42 tr->bio);.. B
2e60: 49 4f 5f 73 65 74 5f 72 65 74 72 79 5f 72 65 61 IO_set_retry_rea
2e70: 73 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e 62 69 son(statePtr->bi
2e80: 6f 2c 20 42 49 4f 5f 52 52 5f 41 43 43 45 50 54 o, BIO_RR_ACCEPT
2e90: 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f );.. *errorCo
2ea0: 64 65 50 74 72 20 3d 20 45 41 47 41 49 4e 3b 0a dePtr = EAGAIN;.
2eb0: 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 45 52 . dprintf("ER
2ec0: 52 28 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 R(SSL_ERROR_WANT
2ed0: 5f 41 43 43 45 50 54 2c 20 45 41 47 41 49 4e 29 _ACCEPT, EAGAIN)
2ee0: 22 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 ");.. return
2ef0: 30 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 0;...case SSL_ER
2f00: 52 4f 52 5f 57 41 4e 54 5f 41 53 59 4e 43 3a 0a ROR_WANT_ASYNC:.
2f10: 09 20 20 20 20 2f 2a 20 55 73 65 64 20 77 69 74 . /* Used wit
2f20: 68 20 66 6c 61 67 20 53 53 4c 5f 4d 4f 44 45 5f h flag SSL_MODE_
2f30: 41 53 59 4e 43 2c 20 6f 70 20 64 69 64 6e 27 74 ASYNC, op didn't
2f40: 20 63 6f 6d 70 6c 65 74 65 20 62 65 63 61 75 73 complete becaus
2f50: 65 20 61 6e 0a 09 20 20 20 20 20 20 20 61 73 79 e an.. asy
2f60: 6e 63 20 65 6e 67 69 6e 65 20 69 73 20 73 74 69 nc engine is sti
2f70: 6c 6c 20 70 72 6f 63 65 73 73 69 6e 67 20 64 61 ll processing da
2f80: 74 61 20 2a 2f 0a 09 63 61 73 65 20 53 53 4c 5f ta */..case SSL_
2f90: 45 52 52 4f 52 5f 57 41 4e 54 5f 41 53 59 4e 43 ERROR_WANT_ASYNC
2fa0: 5f 4a 4f 42 3a 0a 09 20 20 20 20 2f 2a 20 54 68 _JOB:.. /* Th
2fb0: 65 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6a e asynchronous j
2fc0: 6f 62 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 ob could not be
2fd0: 73 74 61 72 74 65 64 20 62 65 63 61 75 73 65 20 started because
2fe0: 74 68 65 72 65 20 77 65 72 65 20 6e 6f 0a 09 20 there were no..
2ff0: 20 20 20 20 20 20 61 73 79 6e 63 20 6a 6f 62 73 async jobs
3000: 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 68 available in th
3010: 65 20 70 6f 6f 6c 2e 20 2a 2f 0a 09 63 61 73 65 e pool. */..case
3020: 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f SSL_ERROR_WANT_
3030: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 43 42 3a CLIENT_HELLO_CB:
3040: 0a 09 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 65 .. /* The ope
3050: 72 61 74 69 6f 6e 20 64 69 64 20 6e 6f 74 20 63 ration did not c
3060: 6f 6d 70 6c 65 74 65 20 62 65 63 61 75 73 65 20 omplete because
3070: 61 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 63 an application c
3080: 61 6c 6c 62 61 63 6b 0a 09 20 20 20 20 20 20 20 allback..
3090: 73 65 74 20 62 79 20 53 53 4c 5f 43 54 58 5f 73 set by SSL_CTX_s
30a0: 65 74 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c 6f 5f et_client_hello_
30b0: 63 62 28 29 20 68 61 73 20 61 73 6b 65 64 20 74 cb() has asked t
30c0: 6f 20 62 65 20 63 61 6c 6c 65 64 20 61 67 61 69 o be called agai
30d0: 6e 2e 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53 n. */.#if OPENSS
30e0: 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 L_VERSION_NUMBER
30f0: 20 3e 3d 20 30 78 33 30 30 30 30 30 30 30 4c 0a >= 0x30000000L.
3100: 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f .case SSL_ERROR_
3110: 57 41 4e 54 5f 52 45 54 52 59 5f 56 45 52 49 46 WANT_RETRY_VERIF
3120: 59 3a 0a 09 20 20 20 20 2f 2a 20 54 68 65 20 6f Y:.. /* The o
3130: 70 65 72 61 74 69 6f 6e 20 64 69 64 20 6e 6f 74 peration did not
3140: 20 63 6f 6d 70 6c 65 74 65 20 62 65 63 61 75 73 complete becaus
3150: 65 20 61 20 63 65 72 74 69 66 69 63 61 74 65 20 e a certificate
3160: 76 65 72 69 66 69 63 61 74 69 6f 6e 0a 09 20 20 verification..
3170: 20 20 20 20 20 63 61 6c 6c 62 61 63 6b 20 68 61 callback ha
3180: 73 20 61 73 6b 65 64 20 74 6f 20 62 65 20 63 61 s asked to be ca
3190: 6c 6c 65 64 20 61 67 61 69 6e 20 76 69 61 20 53 lled again via S
31a0: 53 4c 5f 73 65 74 5f 72 65 74 72 79 5f 76 65 72 SL_set_retry_ver
31b0: 69 66 79 28 33 29 2e 20 2a 2f 0a 23 65 6e 64 69 ify(3). */.#endi
31c0: 66 0a 09 64 65 66 61 75 6c 74 3a 0a 09 20 20 20 f..default:..
31d0: 20 2f 2a 20 54 68 65 20 6f 70 65 72 61 74 69 6f /* The operatio
31e0: 6e 20 64 69 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 n did not comple
31f0: 74 65 20 61 6e 64 20 73 68 6f 75 6c 64 20 62 65 te and should be
3200: 20 72 65 74 72 69 65 64 20 6c 61 74 65 72 2e 20 retried later.
3210: 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 */.. dprintf(
3220: 22 4f 70 65 72 61 74 69 6f 6e 20 64 69 64 20 6e "Operation did n
3230: 6f 74 20 63 6f 6d 70 6c 65 74 65 2c 20 63 61 6c ot complete, cal
3240: 6c 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e l function again
3250: 20 6c 61 74 65 72 22 29 3b 0a 09 20 20 20 20 2a later");.. *
3260: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 errorCodePtr = E
3270: 41 47 41 49 4e 3b 0a 09 20 20 20 20 64 70 72 69 AGAIN;.. dpri
3280: 6e 74 66 28 22 45 52 52 28 4f 74 68 65 72 2c 20 ntf("ERR(Other,
3290: 45 41 47 41 49 4e 29 22 29 3b 0a 09 20 20 20 20 EAGAIN)");..
32a0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a return 0;. }.
32b0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 . dprintf("Re
32c0: 6d 6f 76 69 6e 67 20 74 68 65 20 5c 22 54 4c 53 moving the \"TLS
32d0: 5f 54 43 4c 5f 49 4e 49 54 5c 22 20 66 6c 61 67 _TCL_INIT\" flag
32e0: 20 73 69 6e 63 65 20 77 65 20 68 61 76 65 20 63 since we have c
32f0: 6f 6d 70 6c 65 74 65 64 20 74 68 65 20 68 61 6e ompleted the han
3300: 64 73 68 61 6b 65 22 29 3b 0a 20 20 20 20 73 74 dshake");. st
3310: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 3d atePtr->flags &=
3320: 20 7e 54 4c 53 5f 54 43 4c 5f 49 4e 49 54 3b 0a ~TLS_TCL_INIT;.
3330: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 . dprintf("Re
3340: 74 75 72 6e 69 6e 67 20 73 75 63 63 65 73 73 22 turning success"
3350: 29 3b 0a 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 );. *errorCod
3360: 65 50 74 72 20 3d 20 30 3b 0a 20 20 20 20 72 65 ePtr = 0;. re
3370: 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 20 2a turn 1;.}../*. *
3380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
33a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
33b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
33c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
33d0: 0a 20 2a 20 54 6c 73 49 6e 70 75 74 50 72 6f 63 . * TlsInputProc
33e0: 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 --. *. *.This p
33f0: 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f rocedure is invo
3400: 6b 65 64 20 62 79 20 74 68 65 20 67 65 6e 65 72 ked by the gener
3410: 69 63 20 49 2f 4f 20 6c 61 79 65 72 20 74 6f 20 ic I/O layer to
3420: 72 65 61 64 20 64 61 74 61 20 66 72 6f 6d 0a 20 read data from.
3430: 2a 09 74 68 65 20 42 49 4f 20 77 68 65 6e 65 76 *.the BIO whenev
3440: 65 72 20 74 68 65 20 54 63 6c 5f 52 65 61 64 28 er the Tcl_Read(
3450: 29 2c 20 54 63 6c 5f 52 65 61 64 43 68 61 72 73 ), Tcl_ReadChars
3460: 2c 20 54 63 6c 5f 47 65 74 73 2c 20 61 6e 64 0a , Tcl_Gets, and.
3470: 20 2a 09 54 63 6c 5f 47 65 74 73 4f 62 6a 20 66 *.Tcl_GetsObj f
3480: 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 75 73 65 unctions are use
3490: 64 2e 20 45 71 75 69 76 61 6c 65 6e 74 20 74 6f d. Equivalent to
34a0: 20 53 53 4c 5f 72 65 61 64 5f 65 78 20 61 6e 64 SSL_read_ex and
34b0: 20 53 53 4c 5f 72 65 61 64 2e 0a 20 2a 0a 20 2a SSL_read.. *. *
34c0: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 52 65 74 Results:. *.Ret
34d0: 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 urns the number
34e0: 6f 66 20 62 79 74 65 73 20 72 65 61 64 20 6f 72 of bytes read or
34f0: 20 2d 31 20 6f 6e 20 65 72 72 6f 72 2e 20 53 65 -1 on error. Se
3500: 74 73 20 65 72 72 6f 72 43 6f 64 65 50 74 72 20 ts errorCodePtr
3510: 74 6f 0a 20 2a 09 61 20 50 4f 53 49 58 20 65 72 to. *.a POSIX er
3520: 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20 65 ror code if an e
3530: 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 6f rror occurred, o
3540: 72 20 30 20 69 66 20 6e 6f 6e 65 2e 0a 20 2a 0a r 0 if none.. *.
3550: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
3560: 0a 20 2a 09 52 65 61 64 73 20 69 6e 70 75 74 20 . *.Reads input
3570: 66 72 6f 6d 20 74 68 65 20 69 6e 70 75 74 20 64 from the input d
3580: 65 76 69 63 65 20 6f 66 20 74 68 65 20 63 68 61 evice of the cha
3590: 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 44 61 74 61 nnel.. *. * Data
35a0: 20 69 73 20 72 65 63 65 69 76 65 64 20 69 6e 20 is received in
35b0: 77 68 6f 6c 65 20 62 6c 6f 63 6b 73 20 6b 6e 6f whole blocks kno
35c0: 77 6e 20 61 73 20 72 65 63 6f 72 64 73 20 66 72 wn as records fr
35d0: 6f 6d 20 74 68 65 20 70 65 65 72 2e 20 41 20 77 om the peer. A w
35e0: 68 6f 6c 65 0a 20 2a 20 72 65 63 6f 72 64 20 69 hole. * record i
35f0: 73 20 70 72 6f 63 65 73 73 65 64 20 28 65 2e 67 s processed (e.g
3600: 2e 20 64 65 63 72 79 70 74 65 64 29 20 69 6e 20 . decrypted) in
3610: 6f 6e 65 20 67 6f 20 61 6e 64 20 69 73 20 62 75 one go and is bu
3620: 66 66 65 72 65 64 20 62 79 20 4f 70 65 6e 53 53 ffered by OpenSS
3630: 4c 0a 20 2a 20 75 6e 74 69 6c 20 69 74 20 69 73 L. * until it is
3640: 20 72 65 61 64 20 62 79 20 74 68 65 20 61 70 70 read by the app
3650: 6c 69 63 61 74 69 6f 6e 20 76 69 61 20 61 20 63 lication via a c
3660: 61 6c 6c 20 74 6f 20 53 53 4c 5f 72 65 61 64 2e all to SSL_read.
3670: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
3680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
36a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
36b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
36c0: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 ---. */.static i
36d0: 6e 74 20 54 6c 73 49 6e 70 75 74 50 72 6f 63 28 nt TlsInputProc(
36e0: 0a 20 20 20 20 43 6c 69 65 6e 74 44 61 74 61 20 . ClientData
36f0: 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 09 2f 2a instanceData,./*
3700: 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 61 74 Connection stat
3710: 65 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 63 68 e info */. ch
3720: 61 72 20 2a 62 75 66 2c 09 09 09 2f 2a 20 42 75 ar *buf,.../* Bu
3730: 66 66 65 72 20 74 6f 20 73 74 6f 72 65 20 64 61 ffer to store da
3740: 74 61 20 72 65 61 64 20 66 72 6f 6d 20 42 49 4f ta read from BIO
3750: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 75 66 53 */. int bufS
3760: 69 7a 65 2c 09 09 2f 2a 20 42 75 66 66 65 72 20 ize,../* Buffer
3770: 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 2a 2f size in bytes */
3780: 0a 20 20 20 20 69 6e 74 20 2a 65 72 72 6f 72 43 . int *errorC
3790: 6f 64 65 50 74 72 29 09 09 2f 2a 20 53 74 6f 72 odePtr)../* Stor
37a0: 61 67 65 20 66 6f 72 20 65 72 72 6f 72 20 63 6f age for error co
37b0: 64 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a de to return */.
37c0: 7b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 6c {. unsigned l
37d0: 6f 6e 67 20 62 61 63 6b 69 6e 67 45 72 72 6f 72 ong backingError
37e0: 3b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 ;. State *sta
37f0: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a tePtr = (State *
3800: 29 20 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a ) instanceData;.
3810: 20 20 20 20 69 6e 74 20 62 79 74 65 73 52 65 61 int bytesRea
3820: 64 2c 20 65 72 72 3b 0a 20 20 20 20 2a 65 72 72 d, err;. *err
3830: 6f 72 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a 0a orCodePtr = 0;..
3840: 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 61 dprintf("Rea
3850: 64 28 25 64 29 22 2c 20 62 75 66 53 69 7a 65 29 d(%d)", bufSize)
3860: 3b 0a 0a 20 20 20 20 2f 2a 20 41 62 6f 72 74 20 ;.. /* Abort
3870: 69 66 20 74 68 65 20 75 73 65 72 20 76 65 72 69 if the user veri
3880: 66 79 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 73 fy callback is s
3890: 74 69 6c 6c 20 72 75 6e 6e 69 6e 67 20 74 6f 20 till running to
38a0: 61 76 6f 69 64 20 74 72 69 67 67 65 72 69 6e 67 avoid triggering
38b0: 0a 20 20 20 20 20 2a 20 61 6e 6f 74 68 65 72 20 . * another
38c0: 63 61 6c 6c 20 62 65 66 6f 72 65 20 74 68 65 20 call before the
38d0: 63 75 72 72 65 6e 74 20 6f 6e 65 20 69 73 20 63 current one is c
38e0: 6f 6d 70 6c 65 74 65 2e 20 2a 2f 0a 20 20 20 20 omplete. */.
38f0: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 66 6c if (statePtr->fl
3900: 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f 43 41 ags & TLS_TCL_CA
3910: 4c 4c 42 41 43 4b 29 20 7b 0a 09 64 70 72 69 6e LLBACK) {..dprin
3920: 74 66 28 22 43 61 6c 6c 62 61 63 6b 20 69 73 20 tf("Callback is
3930: 72 75 6e 6e 69 6e 67 2c 20 72 65 61 64 69 6e 67 running, reading
3940: 20 30 20 62 79 74 65 73 22 29 3b 0a 09 72 65 74 0 bytes");..ret
3950: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 urn 0;. }..
3960: 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e 69 74 /* If not init
3970: 69 61 6c 69 7a 65 64 2c 20 64 6f 20 63 6f 6e 6e ialized, do conn
3980: 65 63 74 20 2a 2f 0a 20 20 20 20 2f 2a 20 43 61 ect */. /* Ca
3990: 6e 20 61 6c 73 6f 20 63 68 65 63 6b 20 53 53 4c n also check SSL
39a0: 5f 69 73 5f 69 6e 69 74 5f 66 69 6e 69 73 68 65 _is_init_finishe
39b0: 64 28 73 73 6c 29 20 2a 2f 0a 20 20 20 20 69 66 d(ssl) */. if
39c0: 20 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 (statePtr->flag
39d0: 73 20 26 20 54 4c 53 5f 54 43 4c 5f 49 4e 49 54 s & TLS_TCL_INIT
39e0: 29 20 7b 0a 09 69 6e 74 20 74 6c 73 43 6f 6e 6e ) {..int tlsConn
39f0: 65 63 74 3b 0a 0a 09 64 70 72 69 6e 74 66 28 22 ect;...dprintf("
3a00: 43 61 6c 6c 69 6e 67 20 54 6c 73 5f 57 61 69 74 Calling Tls_Wait
3a10: 46 6f 72 43 6f 6e 6e 65 63 74 22 29 3b 0a 0a 09 ForConnect");...
3a20: 74 6c 73 43 6f 6e 6e 65 63 74 20 3d 20 54 6c 73 tlsConnect = Tls
3a30: 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 28 _WaitForConnect(
3a40: 73 74 61 74 65 50 74 72 2c 20 65 72 72 6f 72 43 statePtr, errorC
3a50: 6f 64 65 50 74 72 2c 20 30 29 3b 0a 09 69 66 20 odePtr, 0);..if
3a60: 28 74 6c 73 43 6f 6e 6e 65 63 74 20 3c 20 30 29 (tlsConnect < 0)
3a70: 20 7b 0a 09 20 20 20 20 2f 2a 20 46 61 69 6c 75 {.. /* Failu
3a80: 72 65 2c 20 73 6f 20 61 62 6f 72 74 20 2a 2f 0a re, so abort */.
3a90: 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 47 6f . dprintf("Go
3aa0: 74 20 61 6e 20 65 72 72 6f 72 20 77 61 69 74 69 t an error waiti
3ab0: 6e 67 20 74 6f 20 63 6f 6e 6e 65 63 74 20 28 74 ng to connect (t
3ac0: 6c 73 43 6f 6e 6e 65 63 74 20 3d 20 25 69 2c 20 lsConnect = %i,
3ad0: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 *errorCodePtr =
3ae0: 25 69 29 22 2c 20 74 6c 73 43 6f 6e 6e 65 63 74 %i)", tlsConnect
3af0: 2c 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29 , *errorCodePtr)
3b00: 3b 0a 0a 09 20 20 20 20 62 79 74 65 73 52 65 61 ;... bytesRea
3b10: 64 20 3d 20 2d 31 3b 0a 09 20 20 20 20 69 66 20 d = -1;.. if
3b20: 28 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d (*errorCodePtr =
3b30: 3d 20 45 43 4f 4e 4e 52 45 53 45 54 29 20 7b 0a = ECONNRESET) {.
3b40: 09 09 64 70 72 69 6e 74 66 28 22 47 6f 74 20 63 ..dprintf("Got c
3b50: 6f 6e 6e 65 63 74 69 6f 6e 20 72 65 73 65 74 22 onnection reset"
3b60: 29 3b 0a 09 09 2f 2a 20 53 6f 66 74 20 45 4f 46 );.../* Soft EOF
3b70: 20 2a 2f 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65 */...*errorCode
3b80: 50 74 72 20 3d 20 30 3b 0a 09 09 62 79 74 65 73 Ptr = 0;...bytes
3b90: 52 65 61 64 20 3d 20 30 3b 0a 09 20 20 20 20 7d Read = 0;.. }
3ba0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 62 79 74 .. return byt
3bb0: 65 73 52 65 61 64 3b 0a 09 7d 20 65 6c 73 65 20 esRead;..} else
3bc0: 69 66 20 28 74 6c 73 43 6f 6e 6e 65 63 74 20 3d if (tlsConnect =
3bd0: 3d 20 30 29 20 7b 0a 09 20 20 20 20 2f 2a 20 54 = 0) {.. /* T
3be0: 72 79 20 61 67 61 69 6e 20 2a 2f 0a 09 20 20 20 ry again */..
3bf0: 20 62 79 74 65 73 52 65 61 64 20 3d 20 2d 31 3b bytesRead = -1;
3c00: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 62 79 74 .. return byt
3c10: 65 73 52 65 61 64 3b 0a 09 7d 0a 20 20 20 20 7d esRead;..}. }
3c20: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 .. /*. *
3c30: 57 65 20 6e 65 65 64 20 74 6f 20 63 6c 65 61 72 We need to clear
3c40: 20 74 68 65 20 53 53 4c 20 65 72 72 6f 72 20 73 the SSL error s
3c50: 74 61 63 6b 20 6e 6f 77 20 62 65 63 61 75 73 65 tack now because
3c60: 20 77 65 20 73 6f 6d 65 74 69 6d 65 73 20 72 65 we sometimes re
3c70: 61 63 68 0a 20 20 20 20 20 2a 20 74 68 69 73 20 ach. * this
3c80: 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 6c 65 function with le
3c90: 66 74 6f 76 65 72 20 65 72 72 6f 72 73 20 69 6e ftover errors in
3ca0: 20 74 68 65 20 73 74 61 63 6b 2e 20 20 49 66 20 the stack. If
3cb0: 42 49 4f 5f 72 65 61 64 0a 20 20 20 20 20 2a 20 BIO_read. *
3cc0: 72 65 74 75 72 6e 73 20 2d 31 20 61 6e 64 20 69 returns -1 and i
3cd0: 6e 74 65 6e 64 73 20 45 41 47 41 49 4e 2c 20 74 ntends EAGAIN, t
3ce0: 68 65 72 65 20 69 73 20 61 20 6c 65 66 74 6f 76 here is a leftov
3cf0: 65 72 20 65 72 72 6f 72 2c 20 69 74 20 77 69 6c er error, it wil
3d00: 6c 20 62 65 0a 20 20 20 20 20 2a 20 6d 69 73 63 l be. * misc
3d10: 6f 6e 73 74 72 75 65 64 20 61 73 20 61 6e 20 65 onstrued as an e
3d20: 72 72 6f 72 2c 20 6e 6f 74 20 45 41 47 41 49 4e rror, not EAGAIN
3d30: 2e 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 .. *. *
3d40: 41 6c 74 65 72 6e 61 74 69 76 65 6c 79 2c 20 77 Alternatively, w
3d50: 65 20 6d 61 79 20 77 61 6e 74 20 74 6f 20 68 61 e may want to ha
3d60: 6e 64 6c 65 20 74 68 65 20 3c 30 20 72 65 74 75 ndle the <0 retu
3d70: 72 6e 20 63 6f 64 65 73 20 66 72 6f 6d 0a 20 20 rn codes from.
3d80: 20 20 20 2a 20 42 49 4f 5f 72 65 61 64 20 73 70 * BIO_read sp
3d90: 65 63 69 61 6c 6c 79 20 28 61 73 20 61 64 76 69 ecially (as advi
3da0: 73 65 64 20 69 6e 20 74 68 65 20 52 53 41 20 64 sed in the RSA d
3db0: 6f 63 73 29 2e 20 20 54 4c 53 27 73 20 6c 6f 77 ocs). TLS's low
3dc0: 65 72 20 6c 65 76 65 6c 20 42 49 4f 0a 20 20 20 er level BIO.
3dd0: 20 20 2a 20 66 75 6e 63 74 69 6f 6e 73 20 70 6c * functions pl
3de0: 61 79 20 77 69 74 68 20 74 68 65 20 72 65 74 72 ay with the retr
3df0: 79 20 66 6c 61 67 73 20 74 68 6f 75 67 68 2c 20 y flags though,
3e00: 61 6e 64 20 74 68 69 73 20 73 65 65 6d 73 20 74 and this seems t
3e10: 6f 20 77 6f 72 6b 0a 20 20 20 20 20 2a 20 63 6f o work. * co
3e20: 72 72 65 63 74 6c 79 2e 20 20 53 69 6d 69 6c 61 rrectly. Simila
3e30: 72 20 66 69 78 20 69 6e 20 54 6c 73 4f 75 74 70 r fix in TlsOutp
3e40: 75 74 50 72 6f 63 2e 20 2d 20 68 6f 62 62 73 0a utProc. - hobbs.
3e50: 20 20 20 20 20 2a 2f 0a 20 20 20 20 45 52 52 5f */. ERR_
3e60: 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 20 clear_error();.
3e70: 20 20 20 42 49 4f 5f 63 6c 65 61 72 5f 72 65 74 BIO_clear_ret
3e80: 72 79 5f 66 6c 61 67 73 28 73 74 61 74 65 50 74 ry_flags(statePt
3e90: 72 2d 3e 62 69 6f 29 3b 0a 20 20 20 20 62 79 74 r->bio);. byt
3ea0: 65 73 52 65 61 64 20 3d 20 42 49 4f 5f 72 65 61 esRead = BIO_rea
3eb0: 64 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 2c d(statePtr->bio,
3ec0: 20 62 75 66 2c 20 62 75 66 53 69 7a 65 29 3b 0a buf, bufSize);.
3ed0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 42 49 4f dprintf("BIO
3ee0: 5f 72 65 61 64 20 2d 3e 20 25 64 22 2c 20 62 79 _read -> %d", by
3ef0: 74 65 73 52 65 61 64 29 3b 0a 0a 20 20 20 20 2f tesRead);.. /
3f00: 2a 20 53 61 6d 65 20 61 73 20 53 53 4c 5f 77 61 * Same as SSL_wa
3f10: 6e 74 2c 20 62 75 74 20 61 6c 73 6f 20 63 68 65 nt, but also che
3f20: 63 6b 73 20 74 68 65 20 65 72 72 6f 72 20 71 75 cks the error qu
3f30: 65 75 65 20 2a 2f 0a 20 20 20 20 65 72 72 20 3d eue */. err =
3f40: 20 53 53 4c 5f 67 65 74 5f 65 72 72 6f 72 28 73 SSL_get_error(s
3f50: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 62 79 tatePtr->ssl, by
3f60: 74 65 73 52 65 61 64 29 3b 0a 20 20 20 20 62 61 tesRead);. ba
3f70: 63 6b 69 6e 67 45 72 72 6f 72 20 3d 20 45 52 52 ckingError = ERR
3f80: 5f 67 65 74 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 _get_error();..
3f90: 20 20 20 69 66 20 28 62 79 74 65 73 52 65 61 64 if (bytesRead
3fa0: 20 3c 3d 20 30 29 20 7b 0a 09 2f 2a 20 54 68 65 <= 0) {../* The
3fb0: 20 72 65 74 72 79 20 66 6c 61 67 20 69 73 20 73 retry flag is s
3fc0: 65 74 20 62 79 20 74 68 65 20 42 49 4f 5f 73 65 et by the BIO_se
3fd0: 74 5f 72 65 74 72 79 5f 2a 20 66 75 6e 63 74 69 t_retry_* functi
3fe0: 6f 6e 73 20 2a 2f 0a 09 69 66 20 28 42 49 4f 5f ons */..if (BIO_
3ff0: 73 68 6f 75 6c 64 5f 72 65 74 72 79 28 73 74 61 should_retry(sta
4000: 74 65 50 74 72 2d 3e 62 69 6f 29 29 20 7b 0a 09 tePtr->bio)) {..
4010: 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 61 dprintf("Rea
4020: 64 20 66 61 69 6c 65 64 20 77 69 74 68 20 63 6f d failed with co
4030: 64 65 3d 25 64 2c 20 62 79 74 65 73 20 72 65 61 de=%d, bytes rea
4040: 64 3d 25 64 3a 20 73 68 6f 75 6c 64 20 72 65 74 d=%d: should ret
4050: 72 79 22 2c 20 65 72 72 2c 20 62 79 74 65 73 52 ry", err, bytesR
4060: 65 61 64 29 3b 0a 09 20 20 20 20 2f 2a 20 53 6f ead);.. /* So
4070: 6d 65 20 64 6f 63 73 20 69 6d 70 6c 79 20 77 65 me docs imply we
4080: 20 73 68 6f 75 6c 64 20 72 65 64 6f 20 74 68 65 should redo the
4090: 20 42 49 4f 5f 72 65 61 64 20 6e 6f 77 20 2a 2f BIO_read now */
40a0: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 ..} else {..
40b0: 64 70 72 69 6e 74 66 28 22 52 65 61 64 20 66 61 dprintf("Read fa
40c0: 69 6c 65 64 20 77 69 74 68 20 63 6f 64 65 3d 25 iled with code=%
40d0: 64 2c 20 62 79 74 65 73 20 72 65 61 64 3d 25 64 d, bytes read=%d
40e0: 3a 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f : error conditio
40f0: 6e 22 2c 20 65 72 72 2c 20 62 79 74 65 73 52 65 n", err, bytesRe
4100: 61 64 29 3b 0a 09 7d 0a 0a 09 64 70 72 69 6e 74 ad);..}...dprint
4110: 66 28 22 42 49 4f 20 69 73 20 45 4f 46 20 25 64 f("BIO is EOF %d
4120: 22 2c 20 42 49 4f 5f 65 6f 66 28 73 74 61 74 65 ", BIO_eof(state
4130: 50 74 72 2d 3e 62 69 6f 29 29 3b 0a 0a 09 2f 2a Ptr->bio));.../*
4140: 20 54 68 65 73 65 20 61 72 65 20 74 68 65 20 73 These are the s
4150: 61 6d 65 20 61 73 20 42 49 4f 5f 72 65 74 72 79 ame as BIO_retry
4160: 5f 74 79 70 65 20 2a 2f 0a 09 69 66 20 28 42 49 _type */..if (BI
4170: 4f 5f 73 68 6f 75 6c 64 5f 72 65 61 64 28 73 74 O_should_read(st
4180: 61 74 65 50 74 72 2d 3e 62 69 6f 29 29 20 7b 0a atePtr->bio)) {.
4190: 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 42 49 . dprintf("BI
41a0: 4f 20 68 61 73 20 69 6e 73 75 66 66 69 63 69 65 O has insufficie
41b0: 6e 74 20 64 61 74 61 20 74 6f 20 72 65 61 64 20 nt data to read
41c0: 61 6e 64 20 72 65 74 75 72 6e 22 29 3b 0a 09 20 and return");..
41d0: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 77 61 6e statePtr->wan
41e0: 74 20 7c 3d 20 54 43 4c 5f 52 45 41 44 41 42 4c t |= TCL_READABL
41f0: 45 3b 0a 09 7d 0a 09 69 66 20 28 42 49 4f 5f 73 E;..}..if (BIO_s
4200: 68 6f 75 6c 64 5f 77 72 69 74 65 28 73 74 61 74 hould_write(stat
4210: 65 50 74 72 2d 3e 62 69 6f 29 29 20 7b 0a 09 20 ePtr->bio)) {..
4220: 20 20 20 64 70 72 69 6e 74 66 28 22 42 49 4f 20 dprintf("BIO
4230: 68 61 73 20 70 65 6e 64 69 6e 67 20 64 61 74 61 has pending data
4240: 20 74 6f 20 77 72 69 74 65 22 29 3b 0a 09 20 20 to write");..
4250: 20 20 73 74 61 74 65 50 74 72 2d 3e 77 61 6e 74 statePtr->want
4260: 20 7c 3d 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 |= TCL_WRITABLE
4270: 3b 0a 09 7d 0a 09 69 66 20 28 42 49 4f 5f 73 68 ;..}..if (BIO_sh
4280: 6f 75 6c 64 5f 69 6f 5f 73 70 65 63 69 61 6c 28 ould_io_special(
4290: 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 29 20 statePtr->bio))
42a0: 7b 0a 09 20 20 20 20 69 6e 74 20 72 65 61 73 6f {.. int reaso
42b0: 6e 20 3d 20 42 49 4f 5f 67 65 74 5f 72 65 74 72 n = BIO_get_retr
42c0: 79 5f 72 65 61 73 6f 6e 28 73 74 61 74 65 50 74 y_reason(statePt
42d0: 72 2d 3e 62 69 6f 29 3b 0a 09 20 20 20 20 64 70 r->bio);.. dp
42e0: 72 69 6e 74 66 28 22 42 49 4f 20 68 61 73 20 73 rintf("BIO has s
42f0: 6f 6d 65 20 73 70 65 63 69 61 6c 20 63 6f 6e 64 ome special cond
4300: 69 74 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e ition other than
4310: 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 3a 20 read or write:
4320: 63 6f 64 65 3d 25 64 22 2c 20 72 65 61 73 6f 6e code=%d", reason
4330: 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 );..}. }..
4340: 20 73 77 69 74 63 68 20 28 65 72 72 29 20 7b 0a switch (err) {.
4350: 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f .case SSL_ERROR_
4360: 4e 4f 4e 45 3a 0a 09 20 20 20 20 2f 2a 20 49 2f NONE:.. /* I/
4370: 4f 20 6f 70 65 72 61 74 69 6f 6e 20 63 6f 6d 70 O operation comp
4380: 6c 65 74 65 64 20 2a 2f 0a 09 20 20 20 20 64 70 leted */.. dp
4390: 72 69 6e 74 66 28 22 53 53 4c 5f 45 52 52 4f 52 rintf("SSL_ERROR
43a0: 5f 4e 4f 4e 45 22 29 3b 0a 09 20 20 20 20 64 70 _NONE");.. dp
43b0: 72 69 6e 74 42 75 66 66 65 72 28 62 75 66 2c 20 rintBuffer(buf,
43c0: 62 79 74 65 73 52 65 61 64 29 3b 0a 09 20 20 20 bytesRead);..
43d0: 20 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20 53 break;...case S
43e0: 53 4c 5f 45 52 52 4f 52 5f 53 53 4c 3a 0a 09 20 SL_ERROR_SSL:..
43f0: 20 20 20 2f 2a 20 41 20 6e 6f 6e 2d 72 65 63 6f /* A non-reco
4400: 76 65 72 61 62 6c 65 2c 20 66 61 74 61 6c 20 65 verable, fatal e
4410: 72 72 6f 72 20 69 6e 20 74 68 65 20 53 53 4c 20 rror in the SSL
4420: 6c 69 62 72 61 72 79 20 6f 63 63 75 72 72 65 64 library occurred
4430: 2c 0a 09 20 20 20 20 20 20 20 75 73 75 61 6c 6c ,.. usuall
4440: 79 20 61 20 70 72 6f 74 6f 63 6f 6c 20 65 72 72 y a protocol err
4450: 6f 72 2e 20 2a 2f 0a 09 20 20 20 20 64 70 72 69 or. */.. dpri
4460: 6e 74 66 28 22 53 53 4c 5f 45 52 52 4f 52 5f 53 ntf("SSL_ERROR_S
4470: 53 4c 3a 20 46 61 74 61 6c 20 53 53 4c 20 70 72 SL: Fatal SSL pr
4480: 6f 74 6f 63 6f 6c 20 65 72 72 6f 72 20 6f 63 63 otocol error occ
4490: 75 72 72 65 64 22 29 3b 0a 09 20 20 20 20 69 66 urred");.. if
44a0: 20 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 20 21 (backingError !
44b0: 3d 20 30 29 20 7b 0a 09 09 54 6c 73 5f 45 72 72 = 0) {...Tls_Err
44c0: 6f 72 28 73 74 61 74 65 50 74 72 2c 20 45 52 52 or(statePtr, ERR
44d0: 5f 72 65 61 73 6f 6e 5f 65 72 72 6f 72 5f 73 74 _reason_error_st
44e0: 72 69 6e 67 28 62 61 63 6b 69 6e 67 45 72 72 6f ring(backingErro
44f0: 72 29 29 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 r));.. } else
4500: 20 69 66 20 28 53 53 4c 5f 67 65 74 5f 76 65 72 if (SSL_get_ver
4510: 69 66 79 5f 72 65 73 75 6c 74 28 73 74 61 74 65 ify_result(state
4520: 50 74 72 2d 3e 73 73 6c 29 20 21 3d 20 58 35 30 Ptr->ssl) != X50
4530: 39 5f 56 5f 4f 4b 29 20 7b 0a 09 09 54 6c 73 5f 9_V_OK) {...Tls_
4540: 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c 0a Error(statePtr,.
4550: 09 09 20 20 20 20 58 35 30 39 5f 76 65 72 69 66 .. X509_verif
4560: 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 y_cert_error_str
4570: 69 6e 67 28 53 53 4c 5f 67 65 74 5f 76 65 72 69 ing(SSL_get_veri
4580: 66 79 5f 72 65 73 75 6c 74 28 73 74 61 74 65 50 fy_result(stateP
4590: 74 72 2d 3e 73 73 6c 29 29 29 3b 0a 09 20 20 20 tr->ssl)));..
45a0: 20 7d 20 65 6c 73 65 20 7b 0a 09 09 54 6c 73 5f } else {...Tls_
45b0: 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20 Error(statePtr,
45c0: 22 55 6e 6b 6e 6f 77 6e 20 53 53 4c 20 65 72 72 "Unknown SSL err
45d0: 6f 72 22 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 or");.. }..
45e0: 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 *errorCodePtr
45f0: 3d 20 45 43 4f 4e 4e 41 42 4f 52 54 45 44 3b 0a = ECONNABORTED;.
4600: 09 20 20 20 20 62 79 74 65 73 52 65 61 64 20 3d . bytesRead =
4610: 20 2d 31 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 53 -1;..#if OPENSS
4620: 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 L_VERSION_NUMBER
4630: 20 3e 3d 20 30 78 33 30 30 30 30 30 30 30 4c 0a >= 0x30000000L.
4640: 09 20 20 20 20 2f 2a 20 55 6e 65 78 70 65 63 74 . /* Unexpect
4650: 65 64 20 45 4f 46 20 66 72 6f 6d 20 74 68 65 20 ed EOF from the
4660: 70 65 65 72 20 66 6f 72 20 4f 70 65 6e 53 53 4c peer for OpenSSL
4670: 20 33 2e 30 2b 20 2a 2f 0a 09 20 20 20 20 69 66 3.0+ */.. if
4680: 20 28 45 52 52 5f 47 45 54 5f 52 45 41 53 4f 4e (ERR_GET_REASON
4690: 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 29 20 3d (backingError) =
46a0: 3d 20 53 53 4c 5f 52 5f 55 4e 45 58 50 45 43 54 = SSL_R_UNEXPECT
46b0: 45 44 5f 45 4f 46 5f 57 48 49 4c 45 5f 52 45 41 ED_EOF_WHILE_REA
46c0: 44 49 4e 47 29 20 7b 0a 09 09 64 70 72 69 6e 74 DING) {...dprint
46d0: 66 28 22 28 55 6e 65 78 70 65 63 74 65 64 29 20 f("(Unexpected)
46e0: 45 4f 46 20 72 65 61 63 68 65 64 22 29 0a 09 09 EOF reached")...
46f0: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 *errorCodePtr =
4700: 30 3b 0a 09 09 62 79 74 65 73 52 65 61 64 20 3d 0;...bytesRead =
4710: 20 30 3b 0a 09 09 54 6c 73 5f 45 72 72 6f 72 28 0;...Tls_Error(
4720: 73 74 61 74 65 50 74 72 2c 20 22 45 4f 46 20 72 statePtr, "EOF r
4730: 65 61 63 68 65 64 22 29 3b 0a 09 20 20 20 20 7d eached");.. }
4740: 0a 23 65 6e 64 69 66 0a 09 20 20 20 20 62 72 65 .#endif.. bre
4750: 61 6b 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45 ak;...case SSL_E
4760: 52 52 4f 52 5f 57 41 4e 54 5f 52 45 41 44 3a 0a RROR_WANT_READ:.
4770: 09 20 20 20 20 2f 2a 20 4f 70 65 72 61 74 69 6f . /* Operatio
4780: 6e 20 64 69 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 n did not comple
4790: 74 65 20 64 75 65 20 74 6f 20 6e 6f 74 20 65 6e te due to not en
47a0: 6f 75 67 68 20 64 61 74 61 20 77 61 73 20 61 76 ough data was av
47b0: 61 69 6c 61 62 6c 65 2e 0a 09 20 20 20 20 20 20 ailable...
47c0: 20 52 65 74 72 79 20 61 67 61 69 6e 20 6c 61 74 Retry again lat
47d0: 65 72 2e 20 2a 2f 0a 09 20 20 20 20 64 70 72 69 er. */.. dpri
47e0: 6e 74 66 28 22 47 6f 74 20 53 53 4c 5f 45 52 52 ntf("Got SSL_ERR
47f0: 4f 52 5f 57 41 4e 54 5f 52 45 41 44 2c 20 6d 61 OR_WANT_READ, ma
4800: 70 70 69 6e 67 20 74 68 69 73 20 74 6f 20 45 41 pping this to EA
4810: 47 41 49 4e 22 29 3b 0a 09 20 20 20 20 2a 65 72 GAIN");.. *er
4820: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 41 47 rorCodePtr = EAG
4830: 41 49 4e 3b 0a 09 20 20 20 20 62 79 74 65 73 52 AIN;.. bytesR
4840: 65 61 64 20 3d 20 2d 31 3b 0a 09 20 20 20 20 73 ead = -1;.. s
4850: 74 61 74 65 50 74 72 2d 3e 77 61 6e 74 20 7c 3d tatePtr->want |=
4860: 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 3b 0a 09 TCL_READABLE;..
4870: 20 20 20 20 42 49 4f 5f 73 65 74 5f 72 65 74 72 BIO_set_retr
4880: 79 5f 72 65 61 64 28 73 74 61 74 65 50 74 72 2d y_read(statePtr-
4890: 3e 62 69 6f 29 3b 0a 09 20 20 20 20 62 72 65 61 >bio);.. brea
48a0: 6b 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 k;...case SSL_ER
48b0: 52 4f 52 5f 57 41 4e 54 5f 57 52 49 54 45 3a 0a ROR_WANT_WRITE:.
48c0: 09 20 20 20 20 2f 2a 20 4f 70 65 72 61 74 69 6f . /* Operatio
48d0: 6e 20 64 69 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 n did not comple
48e0: 74 65 20 64 75 65 20 74 6f 20 75 6e 61 62 6c 65 te due to unable
48f0: 20 74 6f 20 73 65 6e 64 20 61 6c 6c 20 64 61 74 to send all dat
4900: 61 20 74 6f 20 74 68 65 0a 09 20 20 20 20 20 20 a to the..
4910: 20 42 49 4f 2e 20 52 65 74 72 79 20 61 67 61 69 BIO. Retry agai
4920: 6e 20 6c 61 74 65 72 2e 20 2a 2f 0a 09 20 20 20 n later. */..
4930: 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20 53 53 dprintf("Got SS
4940: 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 57 52 49 L_ERROR_WANT_WRI
4950: 54 45 2c 20 6d 61 70 70 69 6e 67 20 74 68 69 73 TE, mapping this
4960: 20 74 6f 20 45 41 47 41 49 4e 22 29 3b 0a 09 20 to EAGAIN");..
4970: 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 *errorCodePtr
4980: 20 3d 20 45 41 47 41 49 4e 3b 0a 09 20 20 20 20 = EAGAIN;..
4990: 62 79 74 65 73 52 65 61 64 20 3d 20 2d 31 3b 0a bytesRead = -1;.
49a0: 09 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 77 . statePtr->w
49b0: 61 6e 74 20 7c 3d 20 54 43 4c 5f 57 52 49 54 41 ant |= TCL_WRITA
49c0: 42 4c 45 3b 0a 09 20 20 20 20 42 49 4f 5f 73 65 BLE;.. BIO_se
49d0: 74 5f 72 65 74 72 79 5f 77 72 69 74 65 28 73 74 t_retry_write(st
49e0: 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 20 atePtr->bio);..
49f0: 20 20 20 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 break;...case
4a00: 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f SSL_ERROR_WANT_
4a10: 58 35 30 39 5f 4c 4f 4f 4b 55 50 3a 0a 09 20 20 X509_LOOKUP:..
4a20: 20 20 2f 2a 20 54 68 65 20 6f 70 65 72 61 74 69 /* The operati
4a30: 6f 6e 20 64 69 64 20 6e 6f 74 20 63 6f 6d 70 6c on did not compl
4a40: 65 74 65 20 62 65 63 61 75 73 65 20 61 6e 20 61 ete because an a
4a50: 70 70 6c 69 63 61 74 69 6f 6e 20 63 61 6c 6c 62 pplication callb
4a60: 61 63 6b 0a 09 20 20 20 20 20 20 20 73 65 74 20 ack.. set
4a70: 62 79 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 by SSL_CTX_set_c
4a80: 6c 69 65 6e 74 5f 63 65 72 74 5f 63 62 28 29 20 lient_cert_cb()
4a90: 68 61 73 20 61 73 6b 65 64 20 74 6f 20 62 65 20 has asked to be
4aa0: 63 61 6c 6c 65 64 20 61 67 61 69 6e 2e 20 2a 2f called again. */
4ab0: 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 47 .. dprintf("G
4ac0: 6f 74 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e ot SSL_ERROR_WAN
4ad0: 54 5f 58 35 30 39 5f 4c 4f 4f 4b 55 50 2c 20 6d T_X509_LOOKUP, m
4ae0: 61 70 70 69 6e 67 20 69 74 20 74 6f 20 45 41 47 apping it to EAG
4af0: 41 49 4e 22 29 3b 0a 09 20 20 20 20 2a 65 72 72 AIN");.. *err
4b00: 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 41 47 41 orCodePtr = EAGA
4b10: 49 4e 3b 0a 09 20 20 20 20 62 79 74 65 73 52 65 IN;.. bytesRe
4b20: 61 64 20 3d 20 2d 31 3b 0a 09 20 20 20 20 62 72 ad = -1;.. br
4b30: 65 61 6b 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f eak;...case SSL_
4b40: 45 52 52 4f 52 5f 53 59 53 43 41 4c 4c 3a 0a 09 ERROR_SYSCALL:..
4b50: 20 20 20 20 2f 2a 20 53 6f 6d 65 20 6e 6f 6e 2d /* Some non-
4b60: 72 65 63 6f 76 65 72 61 62 6c 65 2c 20 66 61 74 recoverable, fat
4b70: 61 6c 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 al I/O error occ
4b80: 75 72 72 65 64 20 2a 2f 0a 09 20 20 20 20 64 70 urred */.. dp
4b90: 72 69 6e 74 66 28 22 53 53 4c 5f 45 52 52 4f 52 rintf("SSL_ERROR
4ba0: 5f 53 59 53 43 41 4c 4c 3a 20 46 61 74 61 6c 20 _SYSCALL: Fatal
4bb0: 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 72 I/O error occurr
4bc0: 65 64 22 29 3b 0a 0a 09 20 20 20 20 69 66 20 28 ed");... if (
4bd0: 62 61 63 6b 69 6e 67 45 72 72 6f 72 20 3d 3d 20 backingError ==
4be0: 30 20 26 26 20 62 79 74 65 73 52 65 61 64 20 3d 0 && bytesRead =
4bf0: 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 55 6e 65 78 = 0) {.../* Unex
4c00: 70 65 63 74 65 64 20 45 4f 46 20 66 72 6f 6d 20 pected EOF from
4c10: 74 68 65 20 70 65 65 72 20 66 6f 72 20 4f 70 65 the peer for Ope
4c20: 6e 53 53 4c 20 31 2e 31 20 2a 2f 0a 09 09 64 70 nSSL 1.1 */...dp
4c30: 72 69 6e 74 66 28 22 28 55 6e 65 78 70 65 63 74 rintf("(Unexpect
4c40: 65 64 29 20 45 4f 46 20 72 65 61 63 68 65 64 22 ed) EOF reached"
4c50: 29 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 )...*errorCodePt
4c60: 72 20 3d 20 30 3b 0a 09 09 62 79 74 65 73 52 65 r = 0;...bytesRe
4c70: 61 64 20 3d 20 30 3b 0a 09 09 54 6c 73 5f 45 72 ad = 0;...Tls_Er
4c80: 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20 22 45 ror(statePtr, "E
4c90: 4f 46 20 72 65 61 63 68 65 64 22 29 3b 0a 0a 09 OF reached");...
4ca0: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 62 } else if (b
4cb0: 61 63 6b 69 6e 67 45 72 72 6f 72 20 3d 3d 20 30 ackingError == 0
4cc0: 20 26 26 20 62 79 74 65 73 52 65 61 64 20 3d 3d && bytesRead ==
4cd0: 20 2d 31 29 20 7b 0a 09 09 64 70 72 69 6e 74 66 -1) {...dprintf
4ce0: 28 22 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 ("I/O error occu
4cf0: 72 72 65 64 20 28 65 72 72 6e 6f 20 3d 20 25 6c rred (errno = %l
4d00: 75 29 22 2c 0a 09 09 20 20 20 20 28 75 6e 73 69 u)",... (unsi
4d10: 67 6e 65 64 20 6c 6f 6e 67 29 20 54 63 6c 5f 47 gned long) Tcl_G
4d20: 65 74 45 72 72 6e 6f 28 29 29 3b 0a 09 09 2a 65 etErrno());...*e
4d30: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 54 63 rrorCodePtr = Tc
4d40: 6c 5f 47 65 74 45 72 72 6e 6f 28 29 3b 0a 09 09 l_GetErrno();...
4d50: 62 79 74 65 73 52 65 61 64 20 3d 20 2d 31 3b 0a bytesRead = -1;.
4d60: 09 09 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 ..Tls_Error(stat
4d70: 65 50 74 72 2c 20 54 63 6c 5f 45 72 72 6e 6f 4d ePtr, Tcl_ErrnoM
4d80: 73 67 28 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 sg(*errorCodePtr
4d90: 29 29 3b 0a 0a 09 20 20 20 20 7d 20 65 6c 73 65 ));... } else
4da0: 20 7b 0a 09 09 64 70 72 69 6e 74 66 28 22 49 2f {...dprintf("I/
4db0: 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 O error occurred
4dc0: 20 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 20 3d (backingError =
4dd0: 20 25 6c 75 29 22 2c 20 62 61 63 6b 69 6e 67 45 %lu)", backingE
4de0: 72 72 6f 72 29 3b 0a 09 09 2a 65 72 72 6f 72 43 rror);...*errorC
4df0: 6f 64 65 50 74 72 20 3d 20 54 63 6c 5f 47 65 74 odePtr = Tcl_Get
4e00: 45 72 72 6e 6f 28 29 3b 0a 09 09 62 79 74 65 73 Errno();...bytes
4e10: 52 65 61 64 20 3d 20 2d 31 3b 0a 09 09 54 6c 73 Read = -1;...Tls
4e20: 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c _Error(statePtr,
4e30: 20 45 52 52 5f 72 65 61 73 6f 6e 5f 65 72 72 6f ERR_reason_erro
4e40: 72 5f 73 74 72 69 6e 67 28 62 61 63 6b 69 6e 67 r_string(backing
4e50: 45 72 72 6f 72 29 29 3b 0a 09 20 20 20 20 7d 0a Error));.. }.
4e60: 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 63 61 . break;...ca
4e70: 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 5a 45 52 se SSL_ERROR_ZER
4e80: 4f 5f 52 45 54 55 52 4e 3a 0a 09 20 20 20 20 2f O_RETURN:.. /
4e90: 2a 20 50 65 65 72 20 68 61 73 20 63 6c 65 61 6e * Peer has clean
4ea0: 6c 79 20 63 6c 6f 73 65 64 20 74 68 65 20 63 6f ly closed the co
4eb0: 6e 6e 65 63 74 69 6f 6e 20 62 79 20 73 65 6e 64 nnection by send
4ec0: 69 6e 67 20 74 68 65 20 63 6c 6f 73 65 5f 6e 6f ing the close_no
4ed0: 74 69 66 79 0a 09 20 20 20 20 20 20 20 61 6c 65 tify.. ale
4ee0: 72 74 2e 20 43 61 6e 27 74 20 72 65 61 64 2c 20 rt. Can't read,
4ef0: 62 75 74 20 63 61 6e 20 77 72 69 74 65 2e 20 4e but can write. N
4f00: 65 65 64 20 74 6f 20 72 65 74 75 72 6e 20 61 6e eed to return an
4f10: 20 45 4f 46 2c 20 73 6f 20 74 68 65 0a 09 20 20 EOF, so the..
4f20: 20 20 20 20 20 63 68 61 6e 6e 65 6c 20 69 73 20 channel is
4f30: 63 6c 6f 73 65 64 20 77 68 69 63 68 20 77 69 6c closed which wil
4f40: 6c 20 73 65 6e 64 20 61 6e 20 53 53 4c 5f 73 68 l send an SSL_sh
4f50: 75 74 64 6f 77 6e 28 29 2e 20 2a 2f 0a 09 20 20 utdown(). */..
4f60: 20 20 64 70 72 69 6e 74 66 28 22 53 53 4c 5f 45 dprintf("SSL_E
4f70: 52 52 4f 52 5f 5a 45 52 4f 5f 52 45 54 55 52 4e RROR_ZERO_RETURN
4f80: 3a 20 50 65 65 72 20 68 61 73 20 63 6c 6f 73 65 : Peer has close
4f90: 64 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e d the connection
4fa0: 22 29 3b 0a 09 20 20 20 20 62 79 74 65 73 52 65 ");.. bytesRe
4fb0: 61 64 20 3d 20 30 3b 0a 09 20 20 20 20 2a 65 72 ad = 0;.. *er
4fc0: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a rorCodePtr = 0;.
4fd0: 09 20 20 20 20 54 6c 73 5f 45 72 72 6f 72 28 73 . Tls_Error(s
4fe0: 74 61 74 65 50 74 72 2c 20 22 50 65 65 72 20 68 tatePtr, "Peer h
4ff0: 61 73 20 63 6c 6f 73 65 64 20 74 68 65 20 63 6f as closed the co
5000: 6e 6e 65 63 74 69 6f 6e 20 66 6f 72 20 77 72 69 nnection for wri
5010: 74 69 6e 67 20 62 79 20 73 65 6e 64 69 6e 67 20 ting by sending
5020: 74 68 65 20 63 6c 6f 73 65 5f 6e 6f 74 69 66 79 the close_notify
5030: 20 61 6c 65 72 74 22 29 3b 0a 09 20 20 20 20 62 alert");.. b
5040: 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20 53 53 4c reak;...case SSL
5050: 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 41 53 59 4e _ERROR_WANT_ASYN
5060: 43 3a 0a 09 20 20 20 20 2f 2a 20 55 73 65 64 20 C:.. /* Used
5070: 77 69 74 68 20 66 6c 61 67 20 53 53 4c 5f 4d 4f with flag SSL_MO
5080: 44 45 5f 41 53 59 4e 43 2c 20 6f 70 65 72 61 74 DE_ASYNC, operat
5090: 69 6f 6e 20 64 69 64 6e 27 74 20 63 6f 6d 70 6c ion didn't compl
50a0: 65 74 65 20 62 65 63 61 75 73 65 0a 09 20 20 20 ete because..
50b0: 20 20 20 20 61 6e 20 61 73 79 6e 63 20 65 6e 67 an async eng
50c0: 69 6e 65 20 69 73 20 73 74 69 6c 6c 20 70 72 6f ine is still pro
50d0: 63 65 73 73 69 6e 67 20 64 61 74 61 2e 20 2a 2f cessing data. */
50e0: 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 47 .. dprintf("G
50f0: 6f 74 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e ot SSL_ERROR_WAN
5100: 54 5f 41 53 59 4e 43 2c 20 6d 61 70 70 69 6e 67 T_ASYNC, mapping
5110: 20 74 68 69 73 20 74 6f 20 45 41 47 41 49 4e 22 this to EAGAIN"
5120: 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f );.. *errorCo
5130: 64 65 50 74 72 20 3d 20 45 41 47 41 49 4e 3b 0a dePtr = EAGAIN;.
5140: 09 20 20 20 20 62 79 74 65 73 52 65 61 64 20 3d . bytesRead =
5150: 20 30 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0;.. break;.
5160: 0a 09 64 65 66 61 75 6c 74 3a 0a 09 20 20 20 20 ..default:..
5170: 64 70 72 69 6e 74 66 28 22 55 6e 6b 6e 6f 77 6e dprintf("Unknown
5180: 20 65 72 72 6f 72 20 28 65 72 72 20 3d 20 25 69 error (err = %i
5190: 29 2c 20 6d 61 70 70 69 6e 67 20 74 6f 20 45 4f ), mapping to EO
51a0: 46 22 2c 20 65 72 72 29 3b 0a 09 20 20 20 20 2a F", err);.. *
51b0: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 30 errorCodePtr = 0
51c0: 3b 0a 09 20 20 20 20 62 79 74 65 73 52 65 61 64 ;.. bytesRead
51d0: 20 3d 20 30 3b 0a 09 20 20 20 20 54 6c 73 5f 45 = 0;.. Tls_E
51e0: 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20 22 rror(statePtr, "
51f0: 55 6e 6b 6e 6f 77 6e 20 65 72 72 6f 72 22 29 3b Unknown error");
5200: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 .. break;.
5210: 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 }.. dprintf(
5220: 22 49 6e 70 75 74 28 25 64 29 20 2d 3e 20 25 64 "Input(%d) -> %d
5230: 20 5b 25 64 5d 22 2c 20 62 75 66 53 69 7a 65 2c [%d]", bufSize,
5240: 20 62 79 74 65 73 52 65 61 64 2c 20 2a 65 72 72 bytesRead, *err
5250: 6f 72 43 6f 64 65 50 74 72 29 3b 0a 20 20 20 20 orCodePtr);.
5260: 72 65 74 75 72 6e 20 62 79 74 65 73 52 65 61 64 return bytesRead
5270: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d ;.}../*. *------
5280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
52a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
52b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
52c0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c -------. *. * Tl
52d0: 73 4f 75 74 70 75 74 50 72 6f 63 20 2d 2d 0a 20 sOutputProc --.
52e0: 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 *. *.This proced
52f0: 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 62 ure is invoked b
5300: 79 20 74 68 65 20 67 65 6e 65 72 69 63 20 49 2f y the generic I/
5310: 4f 20 6c 61 79 65 72 20 74 6f 20 77 72 69 74 65 O layer to write
5320: 20 64 61 74 61 20 74 6f 20 74 68 65 0a 20 2a 09 data to the. *.
5330: 42 49 4f 20 77 68 65 6e 65 76 65 72 20 74 68 65 BIO whenever the
5340: 20 74 68 65 20 54 63 6c 5f 57 72 69 74 65 28 29 the Tcl_Write()
5350: 2c 20 54 63 6c 5f 57 72 69 74 65 43 68 61 72 73 , Tcl_WriteChars
5360: 2c 20 61 6e 64 20 54 63 6c 5f 57 72 69 74 65 4f , and Tcl_WriteO
5370: 62 6a 0a 20 2a 09 66 75 6e 63 74 69 6f 6e 73 20 bj. *.functions
5380: 61 72 65 20 75 73 65 64 2e 20 45 71 75 69 76 61 are used. Equiva
5390: 6c 65 6e 74 20 74 6f 20 53 53 4c 5f 77 72 69 74 lent to SSL_writ
53a0: 65 5f 65 78 20 61 6e 64 20 53 53 4c 5f 77 72 69 e_ex and SSL_wri
53b0: 74 65 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 te.. *. * Result
53c0: 73 3a 0a 20 2a 09 52 65 74 75 72 6e 73 20 74 68 s:. *.Returns th
53d0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 e number of byte
53e0: 73 20 77 72 69 74 74 65 6e 20 6f 72 20 2d 31 20 s written or -1
53f0: 6f 6e 20 65 72 72 6f 72 2e 20 53 65 74 73 20 65 on error. Sets e
5400: 72 72 6f 72 43 6f 64 65 50 74 72 0a 20 2a 09 74 rrorCodePtr. *.t
5410: 6f 20 61 20 50 4f 53 49 58 20 65 72 72 6f 72 20 o a POSIX error
5420: 63 6f 64 65 20 69 66 20 61 6e 20 65 72 72 6f 72 code if an error
5430: 20 6f 63 63 75 72 72 65 64 2c 20 6f 72 20 30 20 occurred, or 0
5440: 69 66 20 6e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53 if none.. *. * S
5450: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
5460: 57 72 69 74 65 73 20 6f 75 74 70 75 74 20 6f 6e Writes output on
5470: 20 74 68 65 20 6f 75 74 70 75 74 20 64 65 76 69 the output devi
5480: 63 65 20 6f 66 20 74 68 65 20 63 68 61 6e 6e 65 ce of the channe
5490: 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d l.. *. *--------
54a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
54b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
54c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
54d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
54e0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 -----. */.static
54f0: 20 69 6e 74 20 54 6c 73 4f 75 74 70 75 74 50 72 int TlsOutputPr
5500: 6f 63 28 0a 20 20 20 20 43 6c 69 65 6e 74 44 61 oc(. ClientDa
5510: 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c ta instanceData,
5520: 09 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 73 ./* Connection s
5530: 74 61 74 65 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 tate info */.
5540: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 62 75 66 const char *buf
5550: 2c 09 09 2f 2a 20 42 75 66 66 65 72 20 77 69 74 ,../* Buffer wit
5560: 68 20 64 61 74 61 20 74 6f 20 77 72 69 74 65 20 h data to write
5570: 74 6f 20 42 49 4f 20 2a 2f 0a 20 20 20 20 69 6e to BIO */. in
5580: 74 20 74 6f 57 72 69 74 65 2c 09 09 2f 2a 20 53 t toWrite,../* S
5590: 69 7a 65 20 6f 66 20 64 61 74 61 20 74 6f 20 77 ize of data to w
55a0: 72 69 74 65 20 69 6e 20 62 79 74 65 73 20 2a 2f rite in bytes */
55b0: 0a 20 20 20 20 69 6e 74 20 2a 65 72 72 6f 72 43 . int *errorC
55c0: 6f 64 65 50 74 72 29 09 09 2f 2a 20 53 74 6f 72 odePtr)../* Stor
55d0: 61 67 65 20 66 6f 72 20 65 72 72 6f 72 20 63 6f age for error co
55e0: 64 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a de to return */.
55f0: 7b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 6c {. unsigned l
5600: 6f 6e 67 20 62 61 63 6b 69 6e 67 45 72 72 6f 72 ong backingError
5610: 3b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 ;. State *sta
5620: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a tePtr = (State *
5630: 29 20 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a ) instanceData;.
5640: 20 20 20 20 69 6e 74 20 77 72 69 74 74 65 6e 2c int written,
5650: 20 65 72 72 3b 0a 20 20 20 20 2a 65 72 72 6f 72 err;. *error
5660: 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a 0a 20 20 CodePtr = 0;..
5670: 20 20 64 70 72 69 6e 74 66 28 22 57 72 69 74 65 dprintf("Write
5680: 28 25 70 2c 20 25 64 29 22 2c 20 28 76 6f 69 64 (%p, %d)", (void
5690: 20 2a 29 20 73 74 61 74 65 50 74 72 2c 20 74 6f *) statePtr, to
56a0: 57 72 69 74 65 29 3b 0a 20 20 20 20 64 70 72 69 Write);. dpri
56b0: 6e 74 42 75 66 66 65 72 28 62 75 66 2c 20 74 6f ntBuffer(buf, to
56c0: 57 72 69 74 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 Write);.. /*
56d0: 41 62 6f 72 74 20 69 66 20 74 68 65 20 75 73 65 Abort if the use
56e0: 72 20 76 65 72 69 66 79 20 63 61 6c 6c 62 61 63 r verify callbac
56f0: 6b 20 69 73 20 73 74 69 6c 6c 20 72 75 6e 6e 69 k is still runni
5700: 6e 67 20 74 6f 20 61 76 6f 69 64 20 74 72 69 67 ng to avoid trig
5710: 67 65 72 69 6e 67 0a 20 20 20 20 20 2a 20 61 6e gering. * an
5720: 6f 74 68 65 72 20 63 61 6c 6c 20 62 65 66 6f 72 other call befor
5730: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 6f 6e e the current on
5740: 65 20 69 73 20 63 6f 6d 70 6c 65 74 65 2e 20 2a e is complete. *
5750: 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 /. if (stateP
5760: 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f tr->flags & TLS_
5770: 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 29 20 7b 0a TCL_CALLBACK) {.
5780: 09 64 70 72 69 6e 74 66 28 22 44 6f 6e 27 74 20 .dprintf("Don't
5790: 70 72 6f 63 65 73 73 20 6f 75 74 70 75 74 20 77 process output w
57a0: 68 69 6c 65 20 63 61 6c 6c 62 61 63 6b 73 20 61 hile callbacks a
57b0: 72 65 20 72 75 6e 6e 69 6e 67 22 29 3b 0a 09 77 re running");..w
57c0: 72 69 74 74 65 6e 20 3d 20 2d 31 3b 0a 09 2a 65 ritten = -1;..*e
57d0: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 41 rrorCodePtr = EA
57e0: 47 41 49 4e 3b 0a 09 72 65 74 75 72 6e 20 2d 31 GAIN;..return -1
57f0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
5800: 49 66 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a If not initializ
5810: 65 64 2c 20 64 6f 20 63 6f 6e 6e 65 63 74 20 2a ed, do connect *
5820: 2f 0a 20 20 20 20 2f 2a 20 43 61 6e 20 61 6c 73 /. /* Can als
5830: 6f 20 63 68 65 63 6b 20 53 53 4c 5f 69 73 5f 69 o check SSL_is_i
5840: 6e 69 74 5f 66 69 6e 69 73 68 65 64 28 73 73 6c nit_finished(ssl
5850: 29 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 ) */. if (sta
5860: 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 tePtr->flags & T
5870: 4c 53 5f 54 43 4c 5f 49 4e 49 54 29 20 7b 0a 09 LS_TCL_INIT) {..
5880: 69 6e 74 20 74 6c 73 43 6f 6e 6e 65 63 74 3b 0a int tlsConnect;.
5890: 0a 09 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 69 ..dprintf("Calli
58a0: 6e 67 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f ng Tls_WaitForCo
58b0: 6e 6e 65 63 74 22 29 3b 0a 0a 09 74 6c 73 43 6f nnect");...tlsCo
58c0: 6e 6e 65 63 74 20 3d 20 54 6c 73 5f 57 61 69 74 nnect = Tls_Wait
58d0: 46 6f 72 43 6f 6e 6e 65 63 74 28 73 74 61 74 65 ForConnect(state
58e0: 50 74 72 2c 20 65 72 72 6f 72 43 6f 64 65 50 74 Ptr, errorCodePt
58f0: 72 2c 20 31 29 3b 0a 09 69 66 20 28 74 6c 73 43 r, 1);..if (tlsC
5900: 6f 6e 6e 65 63 74 20 3c 20 30 29 20 7b 0a 09 20 onnect < 0) {..
5910: 20 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20 dprintf("Got
5920: 61 6e 20 65 72 72 6f 72 20 77 61 69 74 69 6e 67 an error waiting
5930: 20 74 6f 20 63 6f 6e 6e 65 63 74 20 28 74 6c 73 to connect (tls
5940: 43 6f 6e 6e 65 63 74 20 3d 20 25 69 2c 20 2a 65 Connect = %i, *e
5950: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 25 69 rrorCodePtr = %i
5960: 29 22 2c 0a 09 09 74 6c 73 43 6f 6e 6e 65 63 74 )",...tlsConnect
5970: 2c 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29 , *errorCodePtr)
5980: 3b 0a 0a 09 20 20 20 20 77 72 69 74 74 65 6e 20 ;... written
5990: 3d 20 2d 31 3b 0a 09 20 20 20 20 69 66 20 28 2a = -1;.. if (*
59a0: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 3d 20 errorCodePtr ==
59b0: 45 43 4f 4e 4e 52 45 53 45 54 29 20 7b 0a 09 09 ECONNRESET) {...
59c0: 64 70 72 69 6e 74 66 28 22 47 6f 74 20 63 6f 6e dprintf("Got con
59d0: 6e 65 63 74 69 6f 6e 20 72 65 73 65 74 22 29 3b nection reset");
59e0: 0a 09 09 2f 2a 20 53 6f 66 74 20 45 4f 46 20 2a .../* Soft EOF *
59f0: 2f 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 /...*errorCodePt
5a00: 72 20 3d 20 30 3b 0a 09 09 77 72 69 74 74 65 6e r = 0;...written
5a10: 20 3d 20 30 3b 0a 09 20 20 20 20 7d 0a 09 20 20 = 0;.. }..
5a20: 20 20 72 65 74 75 72 6e 20 77 72 69 74 74 65 6e return written
5a30: 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 74 6c ;..} else if (tl
5a40: 73 43 6f 6e 6e 65 63 74 20 3d 3d 20 30 29 20 7b sConnect == 0) {
5a50: 0a 09 20 20 20 20 2f 2a 20 54 72 79 20 61 67 61 .. /* Try aga
5a60: 69 6e 20 2a 2f 0a 09 20 20 20 20 77 72 69 74 74 in */.. writt
5a70: 65 6e 20 3d 20 2d 31 3b 0a 09 20 20 20 20 72 65 en = -1;.. re
5a80: 74 75 72 6e 20 77 72 69 74 74 65 6e 3b 0a 09 7d turn written;..}
5a90: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 . }.. if (
5aa0: 74 6f 57 72 69 74 65 20 3d 3d 20 30 29 20 7b 0a toWrite == 0) {.
5ab0: 09 64 70 72 69 6e 74 66 28 22 7a 65 72 6f 2d 77 .dprintf("zero-w
5ac0: 72 69 74 65 22 29 3b 0a 09 65 72 72 20 3d 20 42 rite");..err = B
5ad0: 49 4f 5f 66 6c 75 73 68 28 73 74 61 74 65 50 74 IO_flush(statePt
5ae0: 72 2d 3e 62 69 6f 29 3b 0a 0a 09 69 66 20 28 65 r->bio);...if (e
5af0: 72 72 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 rr <= 0) {..
5b00: 64 70 72 69 6e 74 66 28 22 46 6c 75 73 68 69 6e dprintf("Flushin
5b10: 67 20 66 61 69 6c 65 64 22 29 3b 0a 09 20 20 20 g failed");..
5b20: 20 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 Tls_Error(state
5b30: 50 74 72 2c 20 22 46 6c 75 73 68 20 66 61 69 6c Ptr, "Flush fail
5b40: 65 64 22 29 3b 0a 0a 09 20 20 20 20 2a 65 72 72 ed");... *err
5b50: 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 49 4f 3b orCodePtr = EIO;
5b60: 0a 09 20 20 20 20 77 72 69 74 74 65 6e 20 3d 20 .. written =
5b70: 30 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 2d 0;.. return -
5b80: 31 3b 0a 09 7d 0a 0a 09 77 72 69 74 74 65 6e 20 1;..}...written
5b90: 3d 20 30 3b 0a 09 2a 65 72 72 6f 72 43 6f 64 65 = 0;..*errorCode
5ba0: 50 74 72 20 3d 20 30 3b 0a 09 72 65 74 75 72 6e Ptr = 0;..return
5bb0: 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 0;. }.. /
5bc0: 2a 0a 20 20 20 20 20 2a 20 57 65 20 6e 65 65 64 *. * We need
5bd0: 20 74 6f 20 63 6c 65 61 72 20 74 68 65 20 53 53 to clear the SS
5be0: 4c 20 65 72 72 6f 72 20 73 74 61 63 6b 20 6e 6f L error stack no
5bf0: 77 20 62 65 63 61 75 73 65 20 77 65 20 73 6f 6d w because we som
5c00: 65 74 69 6d 65 73 20 72 65 61 63 68 0a 20 20 20 etimes reach.
5c10: 20 20 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f * this functio
5c20: 6e 20 77 69 74 68 20 6c 65 66 74 6f 76 65 72 20 n with leftover
5c30: 65 72 72 6f 72 73 20 69 6e 20 74 68 65 20 73 74 errors in the st
5c40: 61 63 6b 2e 20 20 49 66 20 42 49 4f 5f 77 72 69 ack. If BIO_wri
5c50: 74 65 0a 20 20 20 20 20 2a 20 72 65 74 75 72 6e te. * return
5c60: 73 20 2d 31 20 61 6e 64 20 69 6e 74 65 6e 64 73 s -1 and intends
5c70: 20 45 41 47 41 49 4e 2c 20 74 68 65 72 65 20 69 EAGAIN, there i
5c80: 73 20 61 20 6c 65 66 74 6f 76 65 72 20 65 72 72 s a leftover err
5c90: 6f 72 2c 20 69 74 20 77 69 6c 6c 20 62 65 0a 20 or, it will be.
5ca0: 20 20 20 20 2a 20 6d 69 73 63 6f 6e 73 74 72 75 * misconstru
5cb0: 65 64 20 61 73 20 61 6e 20 65 72 72 6f 72 2c 20 ed as an error,
5cc0: 6e 6f 74 20 45 41 47 41 49 4e 2e 0a 20 20 20 20 not EAGAIN..
5cd0: 20 2a 0a 20 20 20 20 20 2a 20 41 6c 74 65 72 6e *. * Altern
5ce0: 61 74 69 76 65 6c 79 2c 20 77 65 20 6d 61 79 20 atively, we may
5cf0: 77 61 6e 74 20 74 6f 20 68 61 6e 64 6c 65 20 74 want to handle t
5d00: 68 65 20 3c 30 20 72 65 74 75 72 6e 20 63 6f 64 he <0 return cod
5d10: 65 73 20 66 72 6f 6d 0a 20 20 20 20 20 2a 20 42 es from. * B
5d20: 49 4f 5f 77 72 69 74 65 20 73 70 65 63 69 61 6c IO_write special
5d30: 6c 79 20 28 61 73 20 61 64 76 69 73 65 64 20 69 ly (as advised i
5d40: 6e 20 74 68 65 20 52 53 41 20 64 6f 63 73 29 2e n the RSA docs).
5d50: 20 20 54 4c 53 27 73 20 6c 6f 77 65 72 20 6c 65 TLS's lower le
5d60: 76 65 6c 0a 20 20 20 20 20 2a 20 42 49 4f 20 66 vel. * BIO f
5d70: 75 6e 63 74 69 6f 6e 73 20 70 6c 61 79 20 77 69 unctions play wi
5d80: 74 68 20 74 68 65 20 72 65 74 72 79 20 66 6c 61 th the retry fla
5d90: 67 73 20 74 68 6f 75 67 68 2c 20 61 6e 64 20 74 gs though, and t
5da0: 68 69 73 20 73 65 65 6d 73 20 74 6f 0a 20 20 20 his seems to.
5db0: 20 20 2a 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 * work correct
5dc0: 6c 79 2e 20 20 53 69 6d 69 6c 61 72 20 66 69 78 ly. Similar fix
5dd0: 20 69 6e 20 54 6c 73 49 6e 70 75 74 50 72 6f 63 in TlsInputProc
5de0: 2e 20 2d 20 68 6f 62 62 73 0a 20 20 20 20 20 2a . - hobbs. *
5df0: 2f 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f /. ERR_clear_
5e00: 65 72 72 6f 72 28 29 3b 0a 20 20 20 20 42 49 4f error();. BIO
5e10: 5f 63 6c 65 61 72 5f 72 65 74 72 79 5f 66 6c 61 _clear_retry_fla
5e20: 67 73 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f gs(statePtr->bio
5e30: 29 3b 0a 20 20 20 20 77 72 69 74 74 65 6e 20 3d );. written =
5e40: 20 42 49 4f 5f 77 72 69 74 65 28 73 74 61 74 65 BIO_write(state
5e50: 50 74 72 2d 3e 62 69 6f 2c 20 62 75 66 2c 20 74 Ptr->bio, buf, t
5e60: 6f 57 72 69 74 65 29 3b 0a 20 20 20 20 64 70 72 oWrite);. dpr
5e70: 69 6e 74 66 28 22 42 49 4f 5f 77 72 69 74 65 28 intf("BIO_write(
5e80: 25 70 2c 20 25 64 29 20 2d 3e 20 5b 25 64 5d 22 %p, %d) -> [%d]"
5e90: 2c 20 28 76 6f 69 64 20 2a 29 20 73 74 61 74 65 , (void *) state
5ea0: 50 74 72 2c 20 74 6f 57 72 69 74 65 2c 20 77 72 Ptr, toWrite, wr
5eb0: 69 74 74 65 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 itten);.. /*
5ec0: 53 61 6d 65 20 61 73 20 53 53 4c 5f 77 61 6e 74 Same as SSL_want
5ed0: 2c 20 62 75 74 20 61 6c 73 6f 20 63 68 65 63 6b , but also check
5ee0: 73 20 74 68 65 20 65 72 72 6f 72 20 71 75 65 75 s the error queu
5ef0: 65 20 2a 2f 0a 20 20 20 20 65 72 72 20 3d 20 53 e */. err = S
5f00: 53 4c 5f 67 65 74 5f 65 72 72 6f 72 28 73 74 61 SL_get_error(sta
5f10: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 77 72 69 74 tePtr->ssl, writ
5f20: 74 65 6e 29 3b 0a 20 20 20 20 62 61 63 6b 69 6e ten);. backin
5f30: 67 45 72 72 6f 72 20 3d 20 45 52 52 5f 67 65 74 gError = ERR_get
5f40: 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 69 _error();.. i
5f50: 66 20 28 77 72 69 74 74 65 6e 20 3c 3d 20 30 29 f (written <= 0)
5f60: 20 7b 0a 09 2f 2a 20 54 68 65 20 72 65 74 72 79 {../* The retry
5f70: 20 66 6c 61 67 20 69 73 20 73 65 74 20 62 79 20 flag is set by
5f80: 74 68 65 20 42 49 4f 5f 73 65 74 5f 72 65 74 72 the BIO_set_retr
5f90: 79 5f 2a 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f y_* functions */
5fa0: 0a 09 69 66 20 28 42 49 4f 5f 73 68 6f 75 6c 64 ..if (BIO_should
5fb0: 5f 72 65 74 72 79 28 73 74 61 74 65 50 74 72 2d _retry(statePtr-
5fc0: 3e 62 69 6f 29 29 20 7b 0a 09 20 20 20 20 64 70 >bio)) {.. dp
5fd0: 72 69 6e 74 66 28 22 57 72 69 74 65 20 66 61 69 rintf("Write fai
5fe0: 6c 65 64 20 77 69 74 68 20 63 6f 64 65 20 25 64 led with code %d
5ff0: 2c 20 62 79 74 65 73 20 77 72 69 74 74 65 6e 3d , bytes written=
6000: 25 64 3a 20 73 68 6f 75 6c 64 20 72 65 74 72 79 %d: should retry
6010: 22 2c 0a 09 09 65 72 72 2c 20 77 72 69 74 74 65 ",...err, writte
6020: 6e 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 n);..} else {..
6030: 20 20 20 64 70 72 69 6e 74 66 28 22 57 72 69 74 dprintf("Writ
6040: 65 20 66 61 69 6c 65 64 20 77 69 74 68 20 63 6f e failed with co
6050: 64 65 20 25 64 2c 20 62 79 74 65 73 20 77 72 69 de %d, bytes wri
6060: 74 74 65 6e 3d 25 64 3a 20 65 72 72 6f 72 20 63 tten=%d: error c
6070: 6f 6e 64 69 74 69 6f 6e 22 2c 0a 09 09 65 72 72 ondition",...err
6080: 2c 20 77 72 69 74 74 65 6e 29 3b 0a 09 7d 0a 0a , written);..}..
6090: 09 2f 2a 20 54 68 65 73 65 20 61 72 65 20 74 68 ./* These are th
60a0: 65 20 73 61 6d 65 20 61 73 20 42 49 4f 5f 72 65 e same as BIO_re
60b0: 74 72 79 5f 74 79 70 65 20 2a 2f 0a 09 69 66 20 try_type */..if
60c0: 28 42 49 4f 5f 73 68 6f 75 6c 64 5f 72 65 61 64 (BIO_should_read
60d0: 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 29 (statePtr->bio))
60e0: 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 {.. dprintf(
60f0: 22 42 49 4f 20 68 61 73 20 69 6e 73 75 66 66 69 "BIO has insuffi
6100: 63 69 65 6e 74 20 64 61 74 61 20 74 6f 20 72 65 cient data to re
6110: 61 64 20 61 6e 64 20 72 65 74 75 72 6e 22 29 3b ad and return");
6120: 0a 09 7d 0a 09 69 66 20 28 42 49 4f 5f 73 68 6f ..}..if (BIO_sho
6130: 75 6c 64 5f 77 72 69 74 65 28 73 74 61 74 65 50 uld_write(stateP
6140: 74 72 2d 3e 62 69 6f 29 29 20 7b 0a 09 20 20 20 tr->bio)) {..
6150: 20 64 70 72 69 6e 74 66 28 22 42 49 4f 20 68 61 dprintf("BIO ha
6160: 73 20 70 65 6e 64 69 6e 67 20 64 61 74 61 20 74 s pending data t
6170: 6f 20 77 72 69 74 65 22 29 3b 0a 09 7d 0a 09 69 o write");..}..i
6180: 66 20 28 42 49 4f 5f 73 68 6f 75 6c 64 5f 69 6f f (BIO_should_io
6190: 5f 73 70 65 63 69 61 6c 28 73 74 61 74 65 50 74 _special(statePt
61a0: 72 2d 3e 62 69 6f 29 29 20 7b 0a 09 20 20 20 20 r->bio)) {..
61b0: 69 6e 74 20 72 65 61 73 6f 6e 20 3d 20 42 49 4f int reason = BIO
61c0: 5f 67 65 74 5f 72 65 74 72 79 5f 72 65 61 73 6f _get_retry_reaso
61d0: 6e 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 n(statePtr->bio)
61e0: 3b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
61f0: 42 49 4f 20 68 61 73 20 73 6f 6d 65 20 73 70 65 BIO has some spe
6200: 63 69 61 6c 20 63 6f 6e 64 69 74 69 6f 6e 20 6f cial condition o
6210: 74 68 65 72 20 74 68 61 6e 20 72 65 61 64 20 6f ther than read o
6220: 72 20 77 72 69 74 65 3a 20 63 6f 64 65 3d 25 64 r write: code=%d
6230: 22 2c 20 72 65 61 73 6f 6e 29 3b 0a 09 7d 0a 0a ", reason);..}..
6240: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 42 49 } else {..BI
6250: 4f 5f 66 6c 75 73 68 28 73 74 61 74 65 50 74 72 O_flush(statePtr
6260: 2d 3e 62 69 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 ->bio);. }..
6270: 20 20 20 73 77 69 74 63 68 20 28 65 72 72 29 20 switch (err)
6280: 7b 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f {..case SSL_ERRO
6290: 52 5f 4e 4f 4e 45 3a 0a 09 20 20 20 20 2f 2a 20 R_NONE:.. /*
62a0: 49 2f 4f 20 6f 70 65 72 61 74 69 6f 6e 20 63 6f I/O operation co
62b0: 6d 70 6c 65 74 65 64 20 2a 2f 0a 09 20 20 20 20 mpleted */..
62c0: 64 70 72 69 6e 74 66 28 22 53 53 4c 5f 45 52 52 dprintf("SSL_ERR
62d0: 4f 52 5f 4e 4f 4e 45 22 29 3b 0a 09 20 20 20 20 OR_NONE");..
62e0: 69 66 20 28 77 72 69 74 74 65 6e 20 3c 20 30 29 if (written < 0)
62f0: 20 7b 0a 09 09 77 72 69 74 74 65 6e 20 3d 20 30 {...written = 0
6300: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 62 72 ;.. }.. br
6310: 65 61 6b 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f eak;...case SSL_
6320: 45 52 52 4f 52 5f 53 53 4c 3a 0a 09 20 20 20 20 ERROR_SSL:..
6330: 2f 2a 20 41 20 6e 6f 6e 2d 72 65 63 6f 76 65 72 /* A non-recover
6340: 61 62 6c 65 2c 20 66 61 74 61 6c 20 65 72 72 6f able, fatal erro
6350: 72 20 69 6e 20 74 68 65 20 53 53 4c 20 6c 69 62 r in the SSL lib
6360: 72 61 72 79 20 6f 63 63 75 72 72 65 64 2c 0a 09 rary occurred,..
6370: 20 20 20 20 20 20 20 75 73 75 61 6c 6c 79 20 61 usually a
6380: 20 70 72 6f 74 6f 63 6f 6c 20 65 72 72 6f 72 20 protocol error
6390: 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 */.. dprintf(
63a0: 22 53 53 4c 5f 45 52 52 4f 52 5f 53 53 4c 3a 20 "SSL_ERROR_SSL:
63b0: 46 61 74 61 6c 20 53 53 4c 20 70 72 6f 74 6f 63 Fatal SSL protoc
63c0: 6f 6c 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 ol error occurre
63d0: 64 22 29 3b 0a 09 20 20 20 20 69 66 20 28 62 61 d");.. if (ba
63e0: 63 6b 69 6e 67 45 72 72 6f 72 20 21 3d 20 30 29 ckingError != 0)
63f0: 20 7b 0a 09 09 54 6c 73 5f 45 72 72 6f 72 28 73 {...Tls_Error(s
6400: 74 61 74 65 50 74 72 2c 20 45 52 52 5f 72 65 61 tatePtr, ERR_rea
6410: 73 6f 6e 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 son_error_string
6420: 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 29 29 3b (backingError));
6430: 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 .. } else if
6440: 28 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f (SSL_get_verify_
6450: 72 65 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d result(statePtr-
6460: 3e 73 73 6c 29 20 21 3d 20 58 35 30 39 5f 56 5f >ssl) != X509_V_
6470: 4f 4b 29 20 7b 0a 09 09 54 6c 73 5f 45 72 72 6f OK) {...Tls_Erro
6480: 72 28 73 74 61 74 65 50 74 72 2c 0a 09 09 20 20 r(statePtr,...
6490: 20 20 58 35 30 39 5f 76 65 72 69 66 79 5f 63 65 X509_verify_ce
64a0: 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 rt_error_string(
64b0: 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 72 SSL_get_verify_r
64c0: 65 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d 3e esult(statePtr->
64d0: 73 73 6c 29 29 29 3b 0a 09 20 20 20 20 7d 20 65 ssl)));.. } e
64e0: 6c 73 65 20 7b 0a 09 09 54 6c 73 5f 45 72 72 6f lse {...Tls_Erro
64f0: 72 28 73 74 61 74 65 50 74 72 2c 20 22 55 6e 6b r(statePtr, "Unk
6500: 6e 6f 77 6e 20 53 53 4c 20 65 72 72 6f 72 22 29 nown SSL error")
6510: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 2a 65 ;.. }.. *e
6520: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 43 rrorCodePtr = EC
6530: 4f 4e 4e 41 42 4f 52 54 45 44 3b 0a 09 20 20 20 ONNABORTED;..
6540: 20 77 72 69 74 74 65 6e 20 3d 20 2d 31 3b 0a 09 written = -1;..
6550: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 63 61 73 break;...cas
6560: 65 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 e SSL_ERROR_WANT
6570: 5f 52 45 41 44 3a 0a 09 20 20 20 20 2f 2a 20 4f _READ:.. /* O
6580: 70 65 72 61 74 69 6f 6e 20 64 69 64 20 6e 6f 74 peration did not
6590: 20 63 6f 6d 70 6c 65 74 65 20 64 75 65 20 74 6f complete due to
65a0: 20 6e 6f 74 20 65 6e 6f 75 67 68 20 64 61 74 61 not enough data
65b0: 20 77 61 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a was available..
65c0: 09 20 20 20 20 20 20 20 52 65 74 72 79 20 61 67 . Retry ag
65d0: 61 69 6e 20 6c 61 74 65 72 20 77 69 74 68 20 73 ain later with s
65e0: 61 6d 65 20 64 61 74 61 2e 20 2a 2f 0a 09 20 20 ame data. */..
65f0: 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20 53 dprintf("Got S
6600: 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 52 45 SL_ERROR_WANT_RE
6610: 41 44 2c 20 6d 61 70 70 69 6e 67 20 69 74 20 74 AD, mapping it t
6620: 6f 20 45 41 47 41 49 4e 22 29 3b 0a 09 20 20 20 o EAGAIN");..
6630: 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d *errorCodePtr =
6640: 20 45 41 47 41 49 4e 3b 0a 09 20 20 20 20 77 72 EAGAIN;.. wr
6650: 69 74 74 65 6e 20 3d 20 2d 31 3b 0a 09 20 20 20 itten = -1;..
6660: 20 73 74 61 74 65 50 74 72 2d 3e 77 61 6e 74 20 statePtr->want
6670: 7c 3d 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 3b |= TCL_READABLE;
6680: 0a 09 20 20 20 20 42 49 4f 5f 73 65 74 5f 72 65 .. BIO_set_re
6690: 74 72 79 5f 72 65 61 64 28 73 74 61 74 65 50 74 try_read(statePt
66a0: 72 2d 3e 62 69 6f 29 3b 0a 09 20 20 20 20 62 72 r->bio);.. br
66b0: 65 61 6b 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f eak;...case SSL_
66c0: 45 52 52 4f 52 5f 57 41 4e 54 5f 57 52 49 54 45 ERROR_WANT_WRITE
66d0: 3a 0a 09 20 20 20 20 2f 2a 20 4f 70 65 72 61 74 :.. /* Operat
66e0: 69 6f 6e 20 64 69 64 20 6e 6f 74 20 63 6f 6d 70 ion did not comp
66f0: 6c 65 74 65 20 64 75 65 20 74 6f 20 75 6e 61 62 lete due to unab
6700: 6c 65 20 74 6f 20 73 65 6e 64 20 61 6c 6c 20 64 le to send all d
6710: 61 74 61 20 74 6f 20 74 68 65 0a 09 20 20 20 20 ata to the..
6720: 20 20 20 42 49 4f 2e 20 52 65 74 72 79 20 6c 61 BIO. Retry la
6730: 74 65 72 20 77 69 74 68 20 73 61 6d 65 20 64 61 ter with same da
6740: 74 61 2e 20 2a 2f 0a 09 20 20 20 20 64 70 72 69 ta. */.. dpri
6750: 6e 74 66 28 22 47 6f 74 20 53 53 4c 5f 45 52 52 ntf("Got SSL_ERR
6760: 4f 52 5f 57 41 4e 54 5f 57 52 49 54 45 2c 20 6d OR_WANT_WRITE, m
6770: 61 70 70 69 6e 67 20 69 74 20 74 6f 20 45 41 47 apping it to EAG
6780: 41 49 4e 22 29 3b 0a 09 20 20 20 20 2a 65 72 72 AIN");.. *err
6790: 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 41 47 41 orCodePtr = EAGA
67a0: 49 4e 3b 0a 09 20 20 20 20 77 72 69 74 74 65 6e IN;.. written
67b0: 20 3d 20 2d 31 3b 0a 09 20 20 20 20 73 74 61 74 = -1;.. stat
67c0: 65 50 74 72 2d 3e 77 61 6e 74 20 7c 3d 20 54 43 ePtr->want |= TC
67d0: 4c 5f 57 52 49 54 41 42 4c 45 3b 0a 09 20 20 20 L_WRITABLE;..
67e0: 20 42 49 4f 5f 73 65 74 5f 72 65 74 72 79 5f 77 BIO_set_retry_w
67f0: 72 69 74 65 28 73 74 61 74 65 50 74 72 2d 3e 62 rite(statePtr->b
6800: 69 6f 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b io);.. break;
6810: 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f ...case SSL_ERRO
6820: 52 5f 57 41 4e 54 5f 58 35 30 39 5f 4c 4f 4f 4b R_WANT_X509_LOOK
6830: 55 50 3a 0a 09 20 20 20 20 2f 2a 20 54 68 65 20 UP:.. /* The
6840: 6f 70 65 72 61 74 69 6f 6e 20 64 69 64 20 6e 6f operation did no
6850: 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 63 61 75 t complete becau
6860: 73 65 20 61 6e 20 61 70 70 6c 69 63 61 74 69 6f se an applicatio
6870: 6e 20 63 61 6c 6c 62 61 63 6b 0a 09 20 20 20 20 n callback..
6880: 20 20 20 73 65 74 20 62 79 20 53 53 4c 5f 43 54 set by SSL_CT
6890: 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 63 65 72 X_set_client_cer
68a0: 74 5f 63 62 28 29 20 68 61 73 20 61 73 6b 65 64 t_cb() has asked
68b0: 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 61 67 to be called ag
68c0: 61 69 6e 2e 20 2a 2f 0a 09 20 20 20 20 64 70 72 ain. */.. dpr
68d0: 69 6e 74 66 28 22 47 6f 74 20 53 53 4c 5f 45 52 intf("Got SSL_ER
68e0: 52 4f 52 5f 57 41 4e 54 5f 58 35 30 39 5f 4c 4f ROR_WANT_X509_LO
68f0: 4f 4b 55 50 2c 20 6d 61 70 70 69 6e 67 20 69 74 OKUP, mapping it
6900: 20 74 6f 20 45 41 47 41 49 4e 22 29 3b 0a 09 20 to EAGAIN");..
6910: 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 *errorCodePtr
6920: 20 3d 20 45 41 47 41 49 4e 3b 0a 09 20 20 20 20 = EAGAIN;..
6930: 77 72 69 74 74 65 6e 20 3d 20 2d 31 3b 0a 09 20 written = -1;..
6940: 20 20 20 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 break;...case
6950: 20 53 53 4c 5f 45 52 52 4f 52 5f 53 59 53 43 41 SSL_ERROR_SYSCA
6960: 4c 4c 3a 0a 09 20 20 20 20 2f 2a 20 53 6f 6d 65 LL:.. /* Some
6970: 20 6e 6f 6e 2d 72 65 63 6f 76 65 72 61 62 6c 65 non-recoverable
6980: 2c 20 66 61 74 61 6c 20 49 2f 4f 20 65 72 72 6f , fatal I/O erro
6990: 72 20 6f 63 63 75 72 72 65 64 20 2a 2f 0a 09 20 r occurred */..
69a0: 20 20 20 64 70 72 69 6e 74 66 28 22 53 53 4c 5f dprintf("SSL_
69b0: 45 52 52 4f 52 5f 53 59 53 43 41 4c 4c 3a 20 46 ERROR_SYSCALL: F
69c0: 61 74 61 6c 20 49 2f 4f 20 65 72 72 6f 72 20 6f atal I/O error o
69d0: 63 63 75 72 72 65 64 22 29 3b 0a 0a 09 20 20 20 ccurred");...
69e0: 20 69 66 20 28 62 61 63 6b 69 6e 67 45 72 72 6f if (backingErro
69f0: 72 20 3d 3d 20 30 20 26 26 20 77 72 69 74 74 65 r == 0 && writte
6a00: 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 64 70 72 69 n == 0) {...dpri
6a10: 6e 74 66 28 22 45 4f 46 20 72 65 61 63 68 65 64 ntf("EOF reached
6a20: 22 29 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 ")...*errorCodeP
6a30: 74 72 20 3d 20 30 3b 0a 09 09 77 72 69 74 74 65 tr = 0;...writte
6a40: 6e 20 3d 20 30 3b 0a 09 09 54 6c 73 5f 45 72 72 n = 0;...Tls_Err
6a50: 6f 72 28 73 74 61 74 65 50 74 72 2c 20 22 45 4f or(statePtr, "EO
6a60: 46 20 72 65 61 63 68 65 64 22 29 3b 0a 0a 09 20 F reached");...
6a70: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 62 61 } else if (ba
6a80: 63 6b 69 6e 67 45 72 72 6f 72 20 3d 3d 20 30 20 ckingError == 0
6a90: 26 26 20 77 72 69 74 74 65 6e 20 3d 3d 20 2d 31 && written == -1
6aa0: 29 20 7b 0a 09 09 64 70 72 69 6e 74 66 28 22 49 ) {...dprintf("I
6ab0: 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 /O error occurre
6ac0: 64 20 28 65 72 72 6e 6f 20 3d 20 25 6c 75 29 22 d (errno = %lu)"
6ad0: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 , (unsigned long
6ae0: 29 20 54 63 6c 5f 47 65 74 45 72 72 6e 6f 28 29 ) Tcl_GetErrno()
6af0: 29 3b 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 );...*errorCodeP
6b00: 74 72 20 3d 20 54 63 6c 5f 47 65 74 45 72 72 6e tr = Tcl_GetErrn
6b10: 6f 28 29 3b 0a 09 09 77 72 69 74 74 65 6e 20 3d o();...written =
6b20: 20 2d 31 3b 0a 09 09 54 6c 73 5f 45 72 72 6f 72 -1;...Tls_Error
6b30: 28 73 74 61 74 65 50 74 72 2c 20 54 63 6c 5f 45 (statePtr, Tcl_E
6b40: 72 72 6e 6f 4d 73 67 28 2a 65 72 72 6f 72 43 6f rrnoMsg(*errorCo
6b50: 64 65 50 74 72 29 29 3b 0a 0a 09 20 20 20 20 7d dePtr));... }
6b60: 20 65 6c 73 65 20 7b 0a 09 09 64 70 72 69 6e 74 else {...dprint
6b70: 66 28 22 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 f("I/O error occ
6b80: 75 72 72 65 64 20 28 62 61 63 6b 69 6e 67 45 72 urred (backingEr
6b90: 72 6f 72 20 3d 20 25 6c 75 29 22 2c 20 62 61 63 ror = %lu)", bac
6ba0: 6b 69 6e 67 45 72 72 6f 72 29 3b 0a 09 09 2a 65 kingError);...*e
6bb0: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 54 63 rrorCodePtr = Tc
6bc0: 6c 5f 47 65 74 45 72 72 6e 6f 28 29 3b 0a 09 09 l_GetErrno();...
6bd0: 77 72 69 74 74 65 6e 20 3d 20 2d 31 3b 0a 09 09 written = -1;...
6be0: 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 Tls_Error(stateP
6bf0: 74 72 2c 20 45 52 52 5f 72 65 61 73 6f 6e 5f 65 tr, ERR_reason_e
6c00: 72 72 6f 72 5f 73 74 72 69 6e 67 28 62 61 63 6b rror_string(back
6c10: 69 6e 67 45 72 72 6f 72 29 29 3b 0a 09 20 20 20 ingError));..
6c20: 20 7d 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a }.. break;..
6c30: 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f .case SSL_ERROR_
6c40: 5a 45 52 4f 5f 52 45 54 55 52 4e 3a 0a 09 20 20 ZERO_RETURN:..
6c50: 20 20 2f 2a 20 50 65 65 72 20 68 61 73 20 63 6c /* Peer has cl
6c60: 65 61 6e 6c 79 20 63 6c 6f 73 65 64 20 74 68 65 eanly closed the
6c70: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 62 79 20 73 connection by s
6c80: 65 6e 64 69 6e 67 20 74 68 65 20 63 6c 6f 73 65 ending the close
6c90: 5f 6e 6f 74 69 66 79 0a 09 20 20 20 20 20 20 20 _notify..
6ca0: 61 6c 65 72 74 2e 20 43 61 6e 27 74 20 72 65 61 alert. Can't rea
6cb0: 64 2c 20 62 75 74 20 63 61 6e 20 77 72 69 74 65 d, but can write
6cc0: 2e 20 4e 65 65 64 20 74 6f 20 72 65 74 75 72 6e . Need to return
6cd0: 20 61 6e 20 45 4f 46 2c 20 73 6f 20 74 68 65 0a an EOF, so the.
6ce0: 09 20 20 20 20 20 20 20 63 68 61 6e 6e 65 6c 20 . channel
6cf0: 69 73 20 63 6c 6f 73 65 64 20 77 68 69 63 68 20 is closed which
6d00: 77 69 6c 6c 20 73 65 6e 64 20 61 6e 20 53 53 4c will send an SSL
6d10: 5f 73 68 75 74 64 6f 77 6e 28 29 2e 20 2a 2f 0a _shutdown(). */.
6d20: 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 53 53 . dprintf("SS
6d30: 4c 5f 45 52 52 4f 52 5f 5a 45 52 4f 5f 52 45 54 L_ERROR_ZERO_RET
6d40: 55 52 4e 3a 20 50 65 65 72 20 68 61 73 20 63 6c URN: Peer has cl
6d50: 6f 73 65 64 20 74 68 65 20 63 6f 6e 6e 65 63 74 osed the connect
6d60: 69 6f 6e 22 29 3b 0a 09 20 20 20 20 2a 65 72 72 ion");.. *err
6d70: 6f 72 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a 09 orCodePtr = 0;..
6d80: 20 20 20 20 77 72 69 74 74 65 6e 20 3d 20 30 3b written = 0;
6d90: 0a 09 20 20 20 20 54 6c 73 5f 45 72 72 6f 72 28 .. Tls_Error(
6da0: 73 74 61 74 65 50 74 72 2c 20 22 50 65 65 72 20 statePtr, "Peer
6db0: 68 61 73 20 63 6c 6f 73 65 64 20 74 68 65 20 63 has closed the c
6dc0: 6f 6e 6e 65 63 74 69 6f 6e 20 66 6f 72 20 77 72 onnection for wr
6dd0: 69 74 69 6e 67 20 62 79 20 73 65 6e 64 69 6e 67 iting by sending
6de0: 20 74 68 65 20 63 6c 6f 73 65 5f 6e 6f 74 69 66 the close_notif
6df0: 79 20 61 6c 65 72 74 22 29 3b 0a 09 20 20 20 20 y alert");..
6e00: 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20 53 53 break;...case SS
6e10: 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 41 53 59 L_ERROR_WANT_ASY
6e20: 4e 43 3a 0a 09 20 20 20 20 2f 2a 20 55 73 65 64 NC:.. /* Used
6e30: 20 77 69 74 68 20 66 6c 61 67 20 53 53 4c 5f 4d with flag SSL_M
6e40: 4f 44 45 5f 41 53 59 4e 43 2c 20 6f 70 65 72 61 ODE_ASYNC, opera
6e50: 74 69 6f 6e 20 64 69 64 6e 27 74 20 63 6f 6d 70 tion didn't comp
6e60: 6c 65 74 65 20 62 65 63 61 75 73 65 0a 09 20 20 lete because..
6e70: 20 20 20 20 20 61 6e 20 61 73 79 6e 63 20 65 6e an async en
6e80: 67 69 6e 65 20 69 73 20 73 74 69 6c 6c 20 70 72 gine is still pr
6e90: 6f 63 65 73 73 69 6e 67 20 64 61 74 61 2e 20 2a ocessing data. *
6ea0: 2f 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 /.. dprintf("
6eb0: 47 6f 74 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 Got SSL_ERROR_WA
6ec0: 4e 54 5f 41 53 59 4e 43 2c 20 6d 61 70 70 69 6e NT_ASYNC, mappin
6ed0: 67 20 74 68 69 73 20 74 6f 20 45 41 47 41 49 4e g this to EAGAIN
6ee0: 22 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 ");.. *errorC
6ef0: 6f 64 65 50 74 72 20 3d 20 45 41 47 41 49 4e 3b odePtr = EAGAIN;
6f00: 0a 09 20 20 20 20 77 72 69 74 74 65 6e 20 3d 20 .. written =
6f10: 30 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 0;.. break;..
6f20: 09 64 65 66 61 75 6c 74 3a 0a 09 20 20 20 20 64 .default:.. d
6f30: 70 72 69 6e 74 66 28 22 75 6e 6b 6e 6f 77 6e 20 printf("unknown
6f40: 65 72 72 6f 72 3a 20 25 64 22 2c 20 65 72 72 29 error: %d", err)
6f50: 3b 0a 09 20 20 20 20 54 6c 73 5f 45 72 72 6f 72 ;.. Tls_Error
6f60: 28 73 74 61 74 65 50 74 72 2c 20 22 55 6e 6b 6e (statePtr, "Unkn
6f70: 6f 77 6e 20 65 72 72 6f 72 22 29 3b 0a 09 20 20 own error");..
6f80: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a break;. }..
6f90: 20 20 20 20 64 70 72 69 6e 74 66 28 22 4f 75 74 dprintf("Out
6fa0: 70 75 74 28 25 64 29 20 2d 3e 20 25 64 22 2c 20 put(%d) -> %d",
6fb0: 74 6f 57 72 69 74 65 2c 20 77 72 69 74 74 65 6e toWrite, written
6fc0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77 72 );. return wr
6fd0: 69 74 74 65 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d itten;.}../*. *-
6fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
7030: 20 2a 20 54 6c 73 5f 47 65 74 50 61 72 65 6e 74 * Tls_GetParent
7040: 20 2d 2d 0a 20 2a 0a 20 2a 09 47 65 74 20 70 61 --. *. *.Get pa
7050: 72 65 6e 74 20 63 68 61 6e 6e 65 6c 20 66 6f 72 rent channel for
7060: 20 61 20 73 74 61 63 6b 65 64 20 63 68 61 6e 6e a stacked chann
7070: 65 6c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 el.. *. * Result
7080: 73 3a 0a 20 2a 09 54 63 6c 5f 43 68 61 6e 6e 65 s:. *.Tcl_Channe
7090: 6c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 6e l or NULL if non
70a0: 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d e.. *. *--------
70b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
70c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
70d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
70e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
70f0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 54 63 6c 5f 43 68 -----. */.Tcl_Ch
7100: 61 6e 6e 65 6c 20 54 6c 73 5f 47 65 74 50 61 72 annel Tls_GetPar
7110: 65 6e 74 28 0a 20 20 20 20 53 74 61 74 65 20 2a ent(. State *
7120: 73 74 61 74 65 50 74 72 2c 09 09 2f 2a 20 43 6f statePtr,../* Co
7130: 6e 6e 65 63 74 69 6f 6e 20 73 74 61 74 65 20 69 nnection state i
7140: 6e 66 6f 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d nfo */. int m
7150: 61 73 6b 46 6c 61 67 73 29 09 09 2f 2a 20 57 68 askFlags)../* Wh
7160: 69 63 68 20 66 6c 61 67 73 20 74 6f 20 70 72 6f ich flags to pro
7170: 63 65 73 73 20 2a 2f 0a 7b 0a 20 20 20 20 64 70 cess */.{. dp
7180: 72 69 6e 74 66 28 22 52 65 71 75 65 73 74 65 64 rintf("Requested
7190: 20 74 6f 20 67 65 74 20 70 61 72 65 6e 74 20 6f to get parent o
71a0: 66 20 63 68 61 6e 6e 65 6c 20 25 70 22 2c 20 73 f channel %p", s
71b0: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 3b 0a tatePtr->self);.
71c0: 0a 20 20 20 20 69 66 20 28 28 73 74 61 74 65 50 . if ((stateP
71d0: 74 72 2d 3e 66 6c 61 67 73 20 26 20 7e 6d 61 73 tr->flags & ~mas
71e0: 6b 46 6c 61 67 73 29 20 26 20 54 4c 53 5f 54 43 kFlags) & TLS_TC
71f0: 4c 5f 46 41 53 54 50 41 54 48 29 20 7b 0a 09 64 L_FASTPATH) {..d
7200: 70 72 69 6e 74 66 28 22 41 73 6b 65 64 20 74 6f printf("Asked to
7210: 20 67 65 74 20 74 68 65 20 70 61 72 65 6e 74 20 get the parent
7220: 63 68 61 6e 6e 65 6c 20 77 68 69 6c 65 20 77 65 channel while we
7230: 20 61 72 65 20 75 73 69 6e 67 20 46 61 73 74 50 are using FastP
7240: 61 74 68 20 2d 2d 20 72 65 74 75 72 6e 69 6e 67 ath -- returning
7250: 20 4e 55 4c 4c 22 29 3b 0a 09 72 65 74 75 72 6e NULL");..return
7260: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 NULL;. }.
7270: 20 72 65 74 75 72 6e 20 54 63 6c 5f 47 65 74 53 return Tcl_GetS
7280: 74 61 63 6b 65 64 43 68 61 6e 6e 65 6c 28 73 74 tackedChannel(st
7290: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 3b 0a 7d atePtr->self);.}
72a0: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
72b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
72c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
72d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
72e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
72f0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 53 65 ----. *. * TlsSe
7300: 74 4f 70 74 69 6f 6e 50 72 6f 63 20 2d 2d 0a 20 tOptionProc --.
7310: 2a 0a 20 2a 09 53 65 74 73 20 61 6e 20 6f 70 74 *. *.Sets an opt
7320: 69 6f 6e 20 74 6f 20 76 61 6c 75 65 20 66 6f 72 ion to value for
7330: 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 a SSL socket ba
7340: 73 65 64 20 63 68 61 6e 6e 65 6c 2e 20 43 61 6c sed channel. Cal
7350: 6c 65 64 20 62 79 20 74 68 65 0a 20 2a 09 67 65 led by the. *.ge
7360: 6e 65 72 69 63 20 49 2f 4f 20 6c 61 79 65 72 20 neric I/O layer
7370: 77 68 65 6e 65 76 65 72 20 74 68 65 20 54 63 6c whenever the Tcl
7380: 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f _SetChannelOptio
7390: 6e 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 n() function is
73a0: 75 73 65 64 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 used.. *. * Resu
73b0: 6c 74 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 69 lts:. *.TCL_OK i
73c0: 66 20 73 75 63 63 65 73 73 66 75 6c 20 6f 72 20 f successful or
73d0: 54 43 4c 5f 45 52 52 4f 52 20 69 66 20 66 61 69 TCL_ERROR if fai
73e0: 6c 65 64 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 led.. *. * Side
73f0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 55 70 64 61 effects:. *.Upda
7400: 74 65 73 20 63 68 61 6e 6e 65 6c 20 6f 70 74 69 tes channel opti
7410: 6f 6e 20 74 6f 20 6e 65 77 20 76 61 6c 75 65 2e on to new value.
7420: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
7430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7470: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 ---. */.static i
7480: 6e 74 0a 54 6c 73 53 65 74 4f 70 74 69 6f 6e 50 nt.TlsSetOptionP
7490: 72 6f 63 28 0a 20 20 20 20 43 6c 69 65 6e 74 44 roc(. ClientD
74a0: 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 ata instanceData
74b0: 2c 09 2f 2a 20 53 6f 63 6b 65 74 20 73 74 61 74 ,./* Socket stat
74c0: 65 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e e. */. Tcl_In
74d0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 09 09 2f terp *interp,../
74e0: 2a 20 46 6f 72 20 65 72 72 6f 72 73 20 2d 20 63 * For errors - c
74f0: 61 6e 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 an be NULL. */.
7500: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6f const char *o
7510: 70 74 69 6f 6e 4e 61 6d 65 2c 09 2f 2a 20 4e 61 ptionName,./* Na
7520: 6d 65 20 6f 66 20 74 68 65 20 6f 70 74 69 6f 6e me of the option
7530: 20 74 6f 20 73 65 74 20 74 68 65 20 76 61 6c 75 to set the valu
7540: 65 20 66 6f 72 2c 20 6f 72 0a 09 09 09 09 20 2a e for, or..... *
7550: 20 4e 55 4c 4c 20 74 6f 20 67 65 74 20 61 6c 6c NULL to get all
7560: 20 6f 70 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 options and the
7570: 69 72 20 76 61 6c 75 65 73 2e 20 2a 2f 0a 20 20 ir values. */.
7580: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6f 70 const char *op
7590: 74 69 6f 6e 56 61 6c 75 65 29 09 2f 2a 20 56 61 tionValue)./* Va
75a0: 6c 75 65 20 66 6f 72 20 6f 70 74 69 6f 6e 2e 20 lue for option.
75b0: 2a 2f 0a 7b 0a 20 20 20 20 53 74 61 74 65 20 2a */.{. State *
75c0: 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 statePtr = (Stat
75d0: 65 20 2a 29 20 69 6e 73 74 61 6e 63 65 44 61 74 e *) instanceDat
75e0: 61 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e a;. Tcl_Chann
75f0: 65 6c 20 70 61 72 65 6e 74 20 3d 20 54 6c 73 5f el parent = Tls_
7600: 47 65 74 50 61 72 65 6e 74 28 73 74 61 74 65 50 GetParent(stateP
7610: 74 72 2c 20 54 4c 53 5f 54 43 4c 5f 46 41 53 54 tr, TLS_TCL_FAST
7620: 50 41 54 48 29 3b 0a 20 20 20 20 54 63 6c 5f 44 PATH);. Tcl_D
7630: 72 69 76 65 72 53 65 74 4f 70 74 69 6f 6e 50 72 riverSetOptionPr
7640: 6f 63 20 2a 73 65 74 4f 70 74 69 6f 6e 50 72 6f oc *setOptionPro
7650: 63 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 c;.. dprintf(
7660: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 "Called");..
7670: 2f 2a 20 50 61 73 73 20 74 6f 20 70 61 72 65 6e /* Pass to paren
7680: 74 20 2a 2f 0a 20 20 20 20 73 65 74 4f 70 74 69 t */. setOpti
7690: 6f 6e 50 72 6f 63 20 3d 20 54 63 6c 5f 43 68 61 onProc = Tcl_Cha
76a0: 6e 6e 65 6c 53 65 74 4f 70 74 69 6f 6e 50 72 6f nnelSetOptionPro
76b0: 63 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c c(Tcl_GetChannel
76c0: 54 79 70 65 28 70 61 72 65 6e 74 29 29 3b 0a 20 Type(parent));.
76d0: 20 20 20 69 66 20 28 73 65 74 4f 70 74 69 6f 6e if (setOption
76e0: 50 72 6f 63 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a Proc != NULL) {.
76f0: 09 72 65 74 75 72 6e 20 28 2a 73 65 74 4f 70 74 .return (*setOpt
7700: 69 6f 6e 50 72 6f 63 29 28 54 63 6c 5f 47 65 74 ionProc)(Tcl_Get
7710: 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 ChannelInstanceD
7720: 61 74 61 28 70 61 72 65 6e 74 29 2c 20 69 6e 74 ata(parent), int
7730: 65 72 70 2c 20 6f 70 74 69 6f 6e 4e 61 6d 65 2c erp, optionName,
7740: 20 6f 70 74 69 6f 6e 56 61 6c 75 65 29 3b 0a 20 optionValue);.
7750: 20 20 20 7d 0a 20 20 20 20 2f 2a 0a 20 20 20 20 }. /*.
7760: 20 2a 20 52 65 71 75 65 73 74 20 66 6f 72 20 61 * Request for a
7770: 20 73 70 65 63 69 66 69 63 20 6f 70 74 69 6f 6e specific option
7780: 20 68 61 73 20 74 6f 20 66 61 69 6c 2c 20 77 65 has to fail, we
7790: 20 64 6f 6e 27 74 20 68 61 76 65 20 61 6e 79 2e don't have any.
77a0: 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 74 . */. ret
77b0: 75 72 6e 20 54 63 6c 5f 42 61 64 43 68 61 6e 6e urn Tcl_BadChann
77c0: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c elOption(interp,
77d0: 20 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20 22 22 29 optionName, "")
77e0: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d ;.}../*. *------
77f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
7830: 0a 20 2a 20 54 6c 73 47 65 74 4f 70 74 69 6f 6e . * TlsGetOption
7840: 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 47 65 Proc --. *. *.Ge
7850: 74 20 61 20 6f 70 74 69 6f 6e 27 73 20 76 61 6c t a option's val
7860: 75 65 20 66 6f 72 20 61 20 53 53 4c 20 73 6f 63 ue for a SSL soc
7870: 6b 65 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 ket based channe
7880: 6c 2c 20 6f 72 20 61 20 6c 69 73 74 20 6f 66 20 l, or a list of
7890: 61 6c 6c 0a 20 2a 09 6f 70 74 69 6f 6e 73 20 61 all. *.options a
78a0: 6e 64 20 74 68 65 69 72 20 76 61 6c 75 65 73 2e nd their values.
78b0: 20 43 61 6c 6c 65 64 20 62 79 20 74 68 65 20 67 Called by the g
78c0: 65 6e 65 72 69 63 20 49 2f 4f 20 6c 61 79 65 72 eneric I/O layer
78d0: 20 77 68 65 6e 65 76 65 72 20 74 68 65 0a 20 2a whenever the. *
78e0: 09 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f .Tcl_GetChannelO
78f0: 70 74 69 6f 6e 28 29 20 66 75 6e 63 74 69 6f 6e ption() function
7900: 20 69 73 20 75 73 65 64 2e 0a 20 2a 0a 20 2a 0a is used.. *. *.
7910: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 * Results:. *.A
7920: 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 standard Tcl re
7930: 73 75 6c 74 2e 20 54 68 65 20 76 61 6c 75 65 20 sult. The value
7940: 6f 66 20 74 68 65 20 73 70 65 63 69 66 69 65 64 of the specified
7950: 20 6f 70 74 69 6f 6e 20 6f 72 20 61 20 6c 69 73 option or a lis
7960: 74 20 6f 66 0a 20 2a 09 61 6c 6c 20 6f 70 74 69 t of. *.all opti
7970: 6f 6e 73 20 61 6e 64 20 74 68 65 69 72 20 76 61 ons and their va
7980: 6c 75 65 73 20 69 73 20 72 65 74 75 72 6e 65 64 lues is returned
7990: 20 69 6e 20 74 68 65 20 73 75 70 70 6c 69 65 64 in the supplied
79a0: 20 44 53 74 72 69 6e 67 2e 0a 20 2a 0a 20 2a 20 DString.. *. *
79b0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
79c0: 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d .None.. *. *----
79d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
79e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
79f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
7a10: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 54 */.static int.T
7a20: 6c 73 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63 28 lsGetOptionProc(
7a30: 0a 20 20 20 20 43 6c 69 65 6e 74 44 61 74 61 20 . ClientData
7a40: 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 09 2f 2a instanceData,./*
7a50: 20 53 6f 63 6b 65 74 20 73 74 61 74 65 2e 20 2a Socket state. *
7a60: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 /. Tcl_Interp
7a70: 20 2a 69 6e 74 65 72 70 2c 09 09 2f 2a 20 46 6f *interp,../* Fo
7a80: 72 20 65 72 72 6f 72 73 20 2d 20 63 61 6e 20 62 r errors - can b
7a90: 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 20 20 63 e NULL. */. c
7aa0: 6f 6e 73 74 20 63 68 61 72 20 2a 6f 70 74 69 6f onst char *optio
7ab0: 6e 4e 61 6d 65 2c 09 2f 2a 20 4e 61 6d 65 20 6f nName,./* Name o
7ac0: 66 20 74 68 65 20 6f 70 74 69 6f 6e 20 74 6f 20 f the option to
7ad0: 72 65 74 72 69 65 76 65 20 74 68 65 20 76 61 6c retrieve the val
7ae0: 75 65 20 66 6f 72 2c 0a 09 09 09 09 20 2a 20 6f ue for,..... * o
7af0: 72 20 4e 55 4c 4c 20 74 6f 20 67 65 74 20 61 6c r NULL to get al
7b00: 6c 20 6f 70 74 69 6f 6e 73 20 61 6e 64 20 74 68 l options and th
7b10: 65 69 72 20 76 61 6c 75 65 73 2e 20 2a 2f 0a 20 eir values. */.
7b20: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 2a Tcl_DString *
7b30: 6f 70 74 69 6f 6e 56 61 6c 75 65 29 09 2f 2a 20 optionValue)./*
7b40: 57 68 65 72 65 20 74 6f 20 73 74 6f 72 65 20 74 Where to store t
7b50: 68 65 20 63 6f 6d 70 75 74 65 64 20 76 61 6c 75 he computed valu
7b60: 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 e initialized by
7b70: 20 63 61 6c 6c 65 72 2e 20 2a 2f 0a 7b 0a 20 20 caller. */.{.
7b80: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 State *statePt
7b90: 72 20 3d 20 28 53 74 61 74 65 20 2a 29 20 69 6e r = (State *) in
7ba0: 73 74 61 6e 63 65 44 61 74 61 3b 0a 20 20 20 20 stanceData;.
7bb0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 70 61 72 65 Tcl_Channel pare
7bc0: 6e 74 20 3d 20 54 6c 73 5f 47 65 74 50 61 72 65 nt = Tls_GetPare
7bd0: 6e 74 28 73 74 61 74 65 50 74 72 2c 20 54 4c 53 nt(statePtr, TLS
7be0: 5f 54 43 4c 5f 46 41 53 54 50 41 54 48 29 3b 0a _TCL_FASTPATH);.
7bf0: 20 20 20 20 54 63 6c 5f 44 72 69 76 65 72 47 65 Tcl_DriverGe
7c00: 74 4f 70 74 69 6f 6e 50 72 6f 63 20 2a 67 65 74 tOptionProc *get
7c10: 4f 70 74 69 6f 6e 50 72 6f 63 3b 0a 0a 20 20 20 OptionProc;..
7c20: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
7c30: 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 50 61 73 73 ");.. /* Pass
7c40: 20 74 6f 20 70 61 72 65 6e 74 20 2a 2f 0a 20 20 to parent */.
7c50: 20 20 67 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 getOptionProc
7c60: 3d 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 47 65 74 = Tcl_ChannelGet
7c70: 4f 70 74 69 6f 6e 50 72 6f 63 28 54 63 6c 5f 47 OptionProc(Tcl_G
7c80: 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 70 61 etChannelType(pa
7c90: 72 65 6e 74 29 29 3b 0a 20 20 20 20 69 66 20 28 rent));. if (
7ca0: 67 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 21 3d getOptionProc !=
7cb0: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e NULL) {..return
7cc0: 20 28 2a 67 65 74 4f 70 74 69 6f 6e 50 72 6f 63 (*getOptionProc
7cd0: 29 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c )(Tcl_GetChannel
7ce0: 49 6e 73 74 61 6e 63 65 44 61 74 61 28 70 61 72 InstanceData(par
7cf0: 65 6e 74 29 2c 20 69 6e 74 65 72 70 2c 0a 09 20 ent), interp,..
7d00: 20 20 20 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20 6f optionName, o
7d10: 70 74 69 6f 6e 56 61 6c 75 65 29 3b 0a 20 20 20 ptionValue);.
7d20: 20 7d 20 65 6c 73 65 20 69 66 20 28 6f 70 74 69 } else if (opti
7d30: 6f 6e 4e 61 6d 65 20 3d 3d 20 28 63 68 61 72 2a onName == (char*
7d40: 29 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 0a 09 20 ) NULL) {../*..
7d50: 2a 20 52 65 71 75 65 73 74 20 69 73 20 71 75 65 * Request is que
7d60: 72 79 20 66 6f 72 20 61 6c 6c 20 6f 70 74 69 6f ry for all optio
7d70: 6e 73 2c 20 74 68 69 73 20 69 73 20 6f 6b 2e 0a ns, this is ok..
7d80: 09 20 2a 2f 0a 09 72 65 74 75 72 6e 20 54 43 4c . */..return TCL
7d90: 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f _OK;. }. /
7da0: 2a 0a 20 20 20 20 20 2a 20 52 65 71 75 65 73 74 *. * Request
7db0: 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 for a specific
7dc0: 6f 70 74 69 6f 6e 20 68 61 73 20 74 6f 20 66 61 option has to fa
7dd0: 69 6c 2c 20 77 65 20 64 6f 6e 27 74 20 68 61 76 il, we don't hav
7de0: 65 20 61 6e 79 2e 0a 20 20 20 20 20 2a 2f 0a 20 e any.. */.
7df0: 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 42 61 return Tcl_Ba
7e00: 64 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 dChannelOption(i
7e10: 6e 74 65 72 70 2c 20 6f 70 74 69 6f 6e 4e 61 6d nterp, optionNam
7e20: 65 2c 20 22 22 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a e, "");.}../*. *
7e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
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 0a 20 2a -------------. *
7e80: 0a 20 2a 20 54 6c 73 43 68 61 6e 6e 65 6c 48 61 . * TlsChannelHa
7e90: 6e 64 6c 65 72 54 69 6d 65 72 20 2d 2d 0a 20 2a ndlerTimer --. *
7ea0: 0a 20 2a 09 43 61 6c 6c 65 64 20 62 79 20 74 68 . *.Called by th
7eb0: 65 20 6e 6f 74 69 66 69 65 72 20 76 69 61 20 61 e notifier via a
7ec0: 20 74 69 6d 65 72 2c 20 74 6f 20 66 6c 75 73 68 timer, to flush
7ed0: 20 6f 75 74 20 64 61 74 61 20 77 61 69 74 69 6e out data waitin
7ee0: 67 20 69 6e 0a 20 2a 09 63 68 61 6e 6e 65 6c 20 g in. *.channel
7ef0: 62 75 66 66 65 72 73 2e 20 63 61 6c 6c 65 64 20 buffers. called
7f00: 62 79 20 74 68 65 20 67 65 6e 65 72 69 63 20 49 by the generic I
7f10: 2f 4f 20 6c 61 79 65 72 20 77 68 65 6e 65 76 65 /O layer wheneve
7f20: 72 20 74 68 65 0a 20 2a 09 54 63 6c 5f 47 65 74 r the. *.Tcl_Get
7f30: 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 28 29 20 ChannelHandle()
7f40: 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 function is used
7f50: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
7f60: 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 . *.None.. *. *
7f70: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
7f80: 09 43 72 65 61 74 65 73 20 6e 6f 74 69 66 69 63 .Creates notific
7f90: 61 74 69 6f 6e 20 65 76 65 6e 74 2e 0a 20 2a 0a ation event.. *.
7fa0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
7fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
7ff0: 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 */.static void
8000: 54 6c 73 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 TlsChannelHandle
8010: 72 54 69 6d 65 72 28 0a 20 20 20 20 43 6c 69 65 rTimer(. Clie
8020: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 ntData clientDat
8030: 61 29 09 2f 2a 20 53 6f 63 6b 65 74 20 73 74 61 a)./* Socket sta
8040: 74 65 2e 20 2a 2f 0a 7b 0a 20 20 20 20 53 74 61 te. */.{. Sta
8050: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 te *statePtr = (
8060: 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 State *) clientD
8070: 61 74 61 3b 0a 20 20 20 20 69 6e 74 20 6d 61 73 ata;. int mas
8080: 6b 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 77 61 k = statePtr->wa
8090: 6e 74 3b 20 2f 2a 20 49 6e 69 74 20 74 6f 20 53 nt; /* Init to S
80a0: 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 52 45 SL_ERROR_WANT_RE
80b0: 41 44 20 61 6e 64 20 53 53 4c 5f 45 52 52 4f 52 AD and SSL_ERROR
80c0: 5f 57 41 4e 54 5f 57 52 49 54 45 20 2a 2f 0a 0a _WANT_WRITE */..
80d0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
80e0: 6c 65 64 20 77 69 74 68 20 6d 61 73 6b 20 30 78 led with mask 0x
80f0: 25 30 32 78 22 2c 20 6d 61 73 6b 29 3b 0a 0a 20 %02x", mask);..
8100: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 74 69 6d statePtr->tim
8110: 65 72 20 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 er = (Tcl_TimerT
8120: 6f 6b 65 6e 29 20 4e 55 4c 4c 3b 0a 0a 20 20 20 oken) NULL;..
8130: 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 6d /* Check for am
8140: 6f 75 6e 74 20 6f 66 20 64 61 74 61 20 70 65 6e ount of data pen
8150: 64 69 6e 67 20 69 6e 20 49 4f 20 6f 72 20 42 49 ding in IO or BI
8160: 4f 20 77 72 69 74 65 20 62 75 66 66 65 72 20 2a O write buffer *
8170: 2f 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 4f 75 /. if (Tcl_Ou
8180: 74 70 75 74 42 75 66 66 65 72 65 64 28 73 74 61 tputBuffered(sta
8190: 74 65 50 74 72 2d 3e 73 65 6c 66 29 20 7c 7c 20 tePtr->self) ||
81a0: 42 49 4f 5f 77 70 65 6e 64 69 6e 67 28 73 74 61 BIO_wpending(sta
81b0: 74 65 50 74 72 2d 3e 62 69 6f 29 29 20 7b 0a 09 tePtr->bio)) {..
81c0: 64 70 72 69 6e 74 66 28 22 5b 63 68 61 6e 3d 25 dprintf("[chan=%
81d0: 70 5d 20 42 49 4f 20 77 72 69 74 61 62 6c 65 22 p] BIO writable"
81e0: 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 , statePtr->self
81f0: 29 3b 0a 0a 09 6d 61 73 6b 20 7c 3d 20 54 43 4c );...mask |= TCL
8200: 5f 57 52 49 54 41 42 4c 45 3b 0a 20 20 20 20 7d _WRITABLE;. }
8210: 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 .. /* Check f
8220: 6f 72 20 61 6d 6f 75 6e 74 20 6f 66 20 64 61 74 or amount of dat
8230: 61 20 70 65 6e 64 69 6e 67 20 69 6e 20 49 4f 20 a pending in IO
8240: 6f 72 20 42 49 4f 20 72 65 61 64 20 62 75 66 66 or BIO read buff
8250: 65 72 20 2a 2f 0a 20 20 20 20 69 66 20 28 54 63 er */. if (Tc
8260: 6c 5f 49 6e 70 75 74 42 75 66 66 65 72 65 64 28 l_InputBuffered(
8270: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 20 statePtr->self)
8280: 7c 7c 20 42 49 4f 5f 70 65 6e 64 69 6e 67 28 73 || BIO_pending(s
8290: 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 29 20 7b tatePtr->bio)) {
82a0: 0a 09 64 70 72 69 6e 74 66 28 22 5b 63 68 61 6e ..dprintf("[chan
82b0: 3d 25 70 5d 20 42 49 4f 20 72 65 61 64 61 62 6c =%p] BIO readabl
82c0: 65 22 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 e", statePtr->se
82d0: 6c 66 29 3b 0a 0a 09 6d 61 73 6b 20 7c 3d 20 54 lf);...mask |= T
82e0: 43 4c 5f 52 45 41 44 41 42 4c 45 3b 0a 20 20 20 CL_READABLE;.
82f0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 4e 6f 74 69 66 }.. /* Notif
8300: 79 20 74 68 65 20 67 65 6e 65 72 69 63 20 49 4f y the generic IO
8310: 20 6c 61 79 65 72 20 74 68 61 74 20 6d 61 73 6b layer that mask
8320: 20 65 76 65 6e 74 73 20 68 61 76 65 20 6f 63 63 events have occ
8330: 75 72 72 65 64 20 6f 6e 20 74 68 65 20 63 68 61 urred on the cha
8340: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 64 70 72 69 nnel */. dpri
8350: 6e 74 66 28 22 4e 6f 74 69 66 79 69 6e 67 20 6f ntf("Notifying o
8360: 75 72 73 65 6c 76 65 73 20 77 69 74 68 20 6d 61 urselves with ma
8370: 73 6b 3d 25 64 22 2c 20 6d 61 73 6b 29 3b 0a 20 sk=%d", mask);.
8380: 20 20 20 54 63 6c 5f 4e 6f 74 69 66 79 43 68 61 Tcl_NotifyCha
8390: 6e 6e 65 6c 28 73 74 61 74 65 50 74 72 2d 3e 73 nnel(statePtr->s
83a0: 65 6c 66 2c 20 6d 61 73 6b 29 3b 0a 20 20 20 20 elf, mask);.
83b0: 73 74 61 74 65 50 74 72 2d 3e 77 61 6e 74 20 3d statePtr->want =
83c0: 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 0;. return;.
83d0: 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d }../*. *--------
83e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
83f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8420: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 57 -----. *. * TlsW
8430: 61 74 63 68 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 atchProc --. *.
8440: 2a 09 53 65 74 20 75 70 20 74 68 65 20 65 76 65 *.Set up the eve
8450: 6e 74 20 6e 6f 74 69 66 69 65 72 20 74 6f 20 77 nt notifier to w
8460: 61 74 63 68 20 66 6f 72 20 65 76 65 6e 74 73 20 atch for events
8470: 6f 66 20 69 6e 74 65 72 65 73 74 20 66 72 6f 6d of interest from
8480: 20 74 68 69 73 0a 20 2a 09 63 68 61 6e 6e 65 6c this. *.channel
8490: 2e 20 43 61 6c 6c 65 64 20 62 79 20 74 68 65 20 . Called by the
84a0: 67 65 6e 65 72 69 63 20 49 2f 4f 20 6c 61 79 65 generic I/O laye
84b0: 72 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 75 r whenever the u
84c0: 73 65 72 20 28 6f 72 20 74 68 65 0a 20 2a 09 73 ser (or the. *.s
84d0: 79 73 74 65 6d 29 20 61 6e 6e 6f 75 6e 63 65 73 ystem) announces
84e0: 20 69 74 73 20 28 64 69 73 29 69 6e 74 65 72 65 its (dis)intere
84f0: 73 74 20 69 6e 20 65 76 65 6e 74 73 20 6f 6e 20 st in events on
8500: 74 68 65 20 63 68 61 6e 6e 65 6c 2e 20 54 68 69 the channel. Thi
8510: 73 20 69 73 0a 20 2a 09 63 61 6c 6c 65 64 20 72 s is. *.called r
8520: 65 70 65 61 74 65 64 6c 79 2e 0a 20 2a 0a 20 2a epeatedly.. *. *
8530: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e Results:. *.Non
8540: 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 e.. *. * Side ef
8550: 66 65 63 74 73 3a 0a 20 2a 09 53 65 74 73 20 75 fects:. *.Sets u
8560: 70 20 74 68 65 20 74 69 6d 65 2d 62 61 73 65 64 p the time-based
8570: 20 6e 6f 74 69 66 69 65 72 20 73 6f 20 74 68 61 notifier so tha
8580: 74 20 66 75 74 75 72 65 20 65 76 65 6e 74 73 20 t future events
8590: 6f 6e 20 74 68 65 20 63 68 61 6e 6e 65 6c 0a 20 on the channel.
85a0: 2a 09 77 69 6c 6c 20 62 65 20 73 65 65 6e 20 62 *.will be seen b
85b0: 79 20 54 43 4c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d y TCL.. *. *----
85c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
85d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
85e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
85f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 ---------. */.st
8610: 61 74 69 63 20 76 6f 69 64 0a 54 6c 73 57 61 74 atic void.TlsWat
8620: 63 68 50 72 6f 63 28 0a 20 20 20 20 43 6c 69 65 chProc(. Clie
8630: 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 ntData instanceD
8640: 61 74 61 2c 09 2f 2a 20 43 6f 6e 6e 65 63 74 69 ata,./* Connecti
8650: 6f 6e 20 73 74 61 74 65 20 69 6e 66 6f 20 2a 2f on state info */
8660: 0a 20 20 20 20 69 6e 74 20 6d 61 73 6b 29 09 09 . int mask)..
8670: 09 2f 2a 20 45 76 65 6e 74 73 20 6f 66 20 69 6e ./* Events of in
8680: 74 65 72 65 73 74 3b 20 61 6e 20 4f 52 2d 65 64 terest; an OR-ed
8690: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 0a combination of.
86a0: 09 09 09 09 20 2a 20 54 43 4c 5f 52 45 41 44 41 .... * TCL_READA
86b0: 42 4c 45 2c 20 54 43 4c 5f 57 52 49 54 41 42 4c BLE, TCL_WRITABL
86c0: 45 20 61 6e 64 20 54 43 4c 5f 45 58 43 45 50 54 E and TCL_EXCEPT
86d0: 49 4f 4e 2e 20 2a 2f 0a 7b 0a 20 20 20 20 54 63 ION. */.{. Tc
86e0: 6c 5f 43 68 61 6e 6e 65 6c 20 70 61 72 65 6e 74 l_Channel parent
86f0: 3b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 ;. State *sta
8700: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a tePtr = (State *
8710: 29 20 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a ) instanceData;.
8720: 20 20 20 20 54 63 6c 5f 44 72 69 76 65 72 57 61 Tcl_DriverWa
8730: 74 63 68 50 72 6f 63 20 2a 77 61 74 63 68 50 72 tchProc *watchPr
8740: 6f 63 3b 0a 20 20 20 20 69 6e 74 20 70 65 6e 64 oc;. int pend
8750: 69 6e 67 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 ing = 0;.. dp
8760: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 20 77 69 rintf("Called wi
8770: 74 68 20 6d 61 73 6b 20 30 78 25 30 32 78 22 2c th mask 0x%02x",
8780: 20 6d 61 73 6b 29 3b 0a 20 20 20 20 64 70 72 69 mask);. dpri
8790: 6e 74 46 6c 61 67 73 28 73 74 61 74 65 50 74 72 ntFlags(statePtr
87a0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 62 6f 72 74 );.. /* Abort
87b0: 20 69 66 20 74 68 65 20 75 73 65 72 20 76 65 72 if the user ver
87c0: 69 66 79 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 ify callback is
87d0: 73 74 69 6c 6c 20 72 75 6e 6e 69 6e 67 20 74 6f still running to
87e0: 20 61 76 6f 69 64 20 74 72 69 67 67 65 72 69 6e avoid triggerin
87f0: 67 0a 20 20 20 20 20 2a 20 61 6e 6f 74 68 65 72 g. * another
8800: 20 63 61 6c 6c 20 62 65 66 6f 72 65 20 74 68 65 call before the
8810: 20 63 75 72 72 65 6e 74 20 6f 6e 65 20 69 73 20 current one is
8820: 63 6f 6d 70 6c 65 74 65 2e 20 2a 2f 0a 20 20 20 complete. */.
8830: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 66 if (statePtr->f
8840: 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f 43 lags & TLS_TCL_C
8850: 41 4c 4c 42 41 43 4b 29 20 7b 0a 09 64 70 72 69 ALLBACK) {..dpri
8860: 6e 74 66 28 22 43 61 6c 6c 62 61 63 6b 20 69 73 ntf("Callback is
8870: 20 6f 6e 2d 67 6f 69 6e 67 2c 20 64 6f 69 6e 67 on-going, doing
8880: 20 6e 6f 74 68 69 6e 67 22 29 3b 0a 09 72 65 74 nothing");..ret
8890: 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 urn;. }..
88a0: 70 61 72 65 6e 74 20 3d 20 54 6c 73 5f 47 65 74 parent = Tls_Get
88b0: 50 61 72 65 6e 74 28 73 74 61 74 65 50 74 72 2c Parent(statePtr,
88c0: 20 54 4c 53 5f 54 43 4c 5f 46 41 53 54 50 41 54 TLS_TCL_FASTPAT
88d0: 48 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 H);.. if (sta
88e0: 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 tePtr->flags & T
88f0: 4c 53 5f 54 43 4c 5f 48 41 4e 44 53 48 41 4b 45 LS_TCL_HANDSHAKE
8900: 5f 46 41 49 4c 45 44 29 20 7b 0a 09 64 70 72 69 _FAILED) {..dpri
8910: 6e 74 66 28 22 41 73 6b 65 64 20 74 6f 20 77 61 ntf("Asked to wa
8920: 74 63 68 20 61 20 73 6f 63 6b 65 74 20 77 69 74 tch a socket wit
8930: 68 20 61 20 66 61 69 6c 65 64 20 68 61 6e 64 73 h a failed hands
8940: 68 61 6b 65 20 2d 2d 20 6e 6f 74 68 69 6e 67 20 hake -- nothing
8950: 63 61 6e 20 68 61 70 70 65 6e 20 68 65 72 65 22 can happen here"
8960: 29 3b 0a 09 64 70 72 69 6e 74 66 28 22 55 6e 72 );..dprintf("Unr
8970: 65 67 69 73 74 65 72 69 6e 67 20 69 6e 74 65 72 egistering inter
8980: 65 73 74 20 69 6e 20 74 68 65 20 6c 6f 77 65 72 est in the lower
8990: 20 63 68 61 6e 6e 65 6c 22 29 3b 0a 0a 09 77 61 channel");...wa
89a0: 74 63 68 50 72 6f 63 20 3d 20 54 63 6c 5f 43 68 tchProc = Tcl_Ch
89b0: 61 6e 6e 65 6c 57 61 74 63 68 50 72 6f 63 28 54 annelWatchProc(T
89c0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 cl_GetChannelTyp
89d0: 65 28 70 61 72 65 6e 74 29 29 3b 0a 09 77 61 74 e(parent));..wat
89e0: 63 68 50 72 6f 63 28 54 63 6c 5f 47 65 74 43 68 chProc(Tcl_GetCh
89f0: 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 annelInstanceDat
8a00: 61 28 70 61 72 65 6e 74 29 2c 20 30 29 3b 0a 09 a(parent), 0);..
8a10: 73 74 61 74 65 50 74 72 2d 3e 77 61 74 63 68 4d statePtr->watchM
8a20: 61 73 6b 20 3d 20 30 3b 0a 09 72 65 74 75 72 6e ask = 0;..return
8a30: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 74 61 ;. }.. sta
8a40: 74 65 50 74 72 2d 3e 77 61 74 63 68 4d 61 73 6b tePtr->watchMask
8a50: 20 3d 20 6d 61 73 6b 3b 0a 0a 20 20 20 20 2f 2a = mask;.. /*
8a60: 0a 20 20 20 20 20 2a 20 4e 6f 20 63 68 61 6e 6e . * No chann
8a70: 65 6c 20 68 61 6e 64 6c 65 72 73 20 61 6e 79 20 el handlers any
8a80: 6d 6f 72 65 2e 20 57 65 20 77 69 6c 6c 20 62 65 more. We will be
8a90: 20 6e 6f 74 69 66 69 65 64 20 61 75 74 6f 6d 61 notified automa
8aa0: 74 69 63 61 6c 6c 79 20 61 62 6f 75 74 0a 20 20 tically about.
8ab0: 20 20 20 2a 20 65 76 65 6e 74 73 20 6f 6e 20 74 * events on t
8ac0: 68 65 20 63 68 61 6e 6e 65 6c 20 62 65 6c 6f 77 he channel below
8ad0: 20 76 69 61 20 61 20 63 61 6c 6c 20 74 6f 20 6f via a call to o
8ae0: 75 72 20 27 54 72 61 6e 73 66 6f 72 6d 4e 6f 74 ur 'TransformNot
8af0: 69 66 79 50 72 6f 63 27 2e 20 42 75 74 0a 20 20 ifyProc'. But.
8b00: 20 20 20 2a 20 77 65 20 68 61 76 65 20 74 6f 20 * we have to
8b10: 70 61 73 73 20 74 68 65 20 69 6e 74 65 72 65 73 pass the interes
8b20: 74 20 64 6f 77 6e 20 6e 6f 77 2e 20 57 65 20 61 t down now. We a
8b30: 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 61 64 re allowed to ad
8b40: 64 20 61 64 64 69 74 69 6f 6e 61 6c 0a 20 20 20 d additional.
8b50: 20 20 2a 20 27 69 6e 74 65 72 65 73 74 27 20 74 * 'interest' t
8b60: 6f 20 74 68 65 20 6d 61 73 6b 20 69 66 20 77 65 o the mask if we
8b70: 20 77 61 6e 74 20 74 6f 2c 20 62 75 74 20 74 68 want to, but th
8b80: 69 73 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f is transformatio
8b90: 6e 20 68 61 73 20 6e 6f 0a 20 20 20 20 20 2a 20 n has no. *
8ba0: 73 75 63 68 20 69 6e 74 65 72 65 73 74 2e 20 49 such interest. I
8bb0: 74 20 6a 75 73 74 20 70 61 73 73 65 73 20 74 68 t just passes th
8bc0: 65 20 72 65 71 75 65 73 74 20 64 6f 77 6e 2c 20 e request down,
8bd0: 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 20 20 20 unchanged..
8be0: 2a 2f 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 */. dprintf("
8bf0: 52 65 67 69 73 74 65 72 69 6e 67 20 6f 75 72 20 Registering our
8c00: 69 6e 74 65 72 65 73 74 20 69 6e 20 74 68 65 20 interest in the
8c10: 6c 6f 77 65 72 20 63 68 61 6e 6e 65 6c 20 28 63 lower channel (c
8c20: 68 61 6e 3d 25 70 29 22 2c 20 28 76 6f 69 64 20 han=%p)", (void
8c30: 2a 29 20 70 61 72 65 6e 74 29 3b 0a 20 20 20 20 *) parent);.
8c40: 77 61 74 63 68 50 72 6f 63 20 3d 20 54 63 6c 5f watchProc = Tcl_
8c50: 43 68 61 6e 6e 65 6c 57 61 74 63 68 50 72 6f 63 ChannelWatchProc
8c60: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 (Tcl_GetChannelT
8c70: 79 70 65 28 70 61 72 65 6e 74 29 29 3b 0a 20 20 ype(parent));.
8c80: 20 20 77 61 74 63 68 50 72 6f 63 28 54 63 6c 5f watchProc(Tcl_
8c90: 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e GetChannelInstan
8ca0: 63 65 44 61 74 61 28 70 61 72 65 6e 74 29 2c 20 ceData(parent),
8cb0: 6d 61 73 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 mask);.. /* D
8cc0: 6f 20 77 65 20 68 61 76 65 20 61 6e 79 20 70 65 o we have any pe
8cd0: 6e 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 nding data */.
8ce0: 20 20 70 65 6e 64 69 6e 67 20 3d 20 28 73 74 61 pending = (sta
8cf0: 74 65 50 74 72 2d 3e 77 61 6e 74 20 7c 7c 20 5c tePtr->want || \
8d00: 0a 09 28 28 6d 61 73 6b 20 26 20 54 43 4c 5f 52 ..((mask & TCL_R
8d10: 45 41 44 41 42 4c 45 29 20 26 26 20 28 28 54 63 EADABLE) && ((Tc
8d20: 6c 5f 49 6e 70 75 74 42 75 66 66 65 72 65 64 28 l_InputBuffered(
8d30: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 20 statePtr->self)
8d40: 3e 20 30 29 20 7c 7c 20 28 42 49 4f 5f 63 74 72 > 0) || (BIO_ctr
8d50: 6c 5f 70 65 6e 64 69 6e 67 28 73 74 61 74 65 50 l_pending(stateP
8d60: 74 72 2d 3e 62 69 6f 29 20 3e 20 30 29 29 29 20 tr->bio) > 0)))
8d70: 7c 7c 0a 09 28 28 6d 61 73 6b 20 26 20 54 43 4c ||..((mask & TCL
8d80: 5f 57 52 49 54 41 42 4c 45 29 20 26 26 20 28 28 _WRITABLE) && ((
8d90: 54 63 6c 5f 4f 75 74 70 75 74 42 75 66 66 65 72 Tcl_OutputBuffer
8da0: 65 64 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c ed(statePtr->sel
8db0: 66 29 20 3e 20 30 29 20 7c 7c 20 28 42 49 4f 5f f) > 0) || (BIO_
8dc0: 63 74 72 6c 5f 77 70 65 6e 64 69 6e 67 28 73 74 ctrl_wpending(st
8dd0: 61 74 65 50 74 72 2d 3e 62 69 6f 29 20 3e 20 30 atePtr->bio) > 0
8de0: 29 29 29 29 3b 0a 0a 20 20 20 20 64 70 72 69 6e ))));.. dprin
8df0: 74 66 28 22 49 4f 20 57 61 6e 74 3d 25 64 2c 20 tf("IO Want=%d,
8e00: 69 6e 70 75 74 20 62 75 66 66 65 72 3d 25 64 2c input buffer=%d,
8e10: 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 3d 25 output buffer=%
8e20: 64 2c 20 42 49 4f 20 70 65 6e 64 69 6e 67 3d 25 d, BIO pending=%
8e30: 7a 64 2c 20 42 49 4f 20 77 70 65 6e 64 69 6e 67 zd, BIO wpending
8e40: 3d 25 7a 64 2c 20 70 65 6e 64 69 6e 67 3d 25 64 =%zd, pending=%d
8e50: 22 2c 20 5c 0a 09 73 74 61 74 65 50 74 72 2d 3e ", \..statePtr->
8e60: 77 61 6e 74 2c 20 54 63 6c 5f 49 6e 70 75 74 42 want, Tcl_InputB
8e70: 75 66 66 65 72 65 64 28 73 74 61 74 65 50 74 72 uffered(statePtr
8e80: 2d 3e 73 65 6c 66 29 2c 20 54 63 6c 5f 4f 75 74 ->self), Tcl_Out
8e90: 70 75 74 42 75 66 66 65 72 65 64 28 73 74 61 74 putBuffered(stat
8ea0: 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 5c 0a 09 ePtr->self), \..
8eb0: 42 49 4f 5f 63 74 72 6c 5f 70 65 6e 64 69 6e 67 BIO_ctrl_pending
8ec0: 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 2c (statePtr->bio),
8ed0: 20 42 49 4f 5f 63 74 72 6c 5f 77 70 65 6e 64 69 BIO_ctrl_wpendi
8ee0: 6e 67 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f ng(statePtr->bio
8ef0: 29 2c 20 70 65 6e 64 69 6e 67 29 3b 0a 0a 20 20 ), pending);..
8f00: 20 20 2f 2a 20 53 63 68 65 64 75 6c 65 20 6e 65 /* Schedule ne
8f10: 78 74 20 65 76 65 6e 74 20 69 66 20 64 61 74 61 xt event if data
8f20: 20 69 73 20 70 65 6e 64 69 6e 67 2c 20 6f 74 68 is pending, oth
8f30: 65 72 77 69 73 65 20 63 65 61 73 65 20 65 76 65 erwise cease eve
8f40: 6e 74 73 20 66 6f 72 20 6e 6f 77 20 2a 2f 0a 20 nts for now */.
8f50: 20 20 20 69 66 20 28 21 28 6d 61 73 6b 20 26 20 if (!(mask &
8f60: 54 43 4c 5f 52 45 41 44 41 42 4c 45 29 20 7c 7c TCL_READABLE) ||
8f70: 20 70 65 6e 64 69 6e 67 20 3d 3d 20 30 29 20 7b pending == 0) {
8f80: 0a 09 2f 2a 20 52 65 6d 6f 76 65 20 74 69 6d 65 ../* Remove time
8f90: 72 2c 20 69 66 20 61 6e 79 20 2a 2f 0a 09 69 66 r, if any */..if
8fa0: 20 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 (statePtr->time
8fb0: 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 r != (Tcl_TimerT
8fc0: 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 20 oken) NULL) {..
8fd0: 20 20 20 64 70 72 69 6e 74 66 28 22 41 20 74 69 dprintf("A ti
8fe0: 6d 65 72 20 77 61 73 20 66 6f 75 6e 64 2c 20 64 mer was found, d
8ff0: 65 6c 65 74 69 6e 67 20 69 74 22 29 3b 0a 09 20 eleting it");..
9000: 20 20 20 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d Tcl_DeleteTim
9010: 65 72 48 61 6e 64 6c 65 72 28 73 74 61 74 65 50 erHandler(stateP
9020: 74 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 20 20 20 tr->timer);..
9030: 20 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 statePtr->timer
9040: 20 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b = (Tcl_TimerTok
9050: 65 6e 29 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 20 20 en) NULL;..}..
9060: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 41 } else {../* A
9070: 64 64 20 74 69 6d 65 72 2c 20 69 66 20 6e 6f 6e dd timer, if non
9080: 65 20 2a 2f 0a 09 69 66 20 28 73 74 61 74 65 50 e */..if (stateP
9090: 74 72 2d 3e 74 69 6d 65 72 20 3d 3d 20 28 54 63 tr->timer == (Tc
90a0: 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 l_TimerToken) NU
90b0: 4c 4c 29 20 7b 0a 09 20 20 20 20 64 70 72 69 6e LL) {.. dprin
90c0: 74 66 28 22 43 72 65 61 74 69 6e 67 20 61 20 6e tf("Creating a n
90d0: 65 77 20 74 69 6d 65 72 20 73 69 6e 63 65 20 64 ew timer since d
90e0: 61 74 61 20 61 70 70 65 61 72 73 20 74 6f 20 62 ata appears to b
90f0: 65 20 77 61 69 74 69 6e 67 22 29 3b 0a 09 20 20 e waiting");..
9100: 20 20 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 statePtr->time
9110: 72 20 3d 20 54 63 6c 5f 43 72 65 61 74 65 54 69 r = Tcl_CreateTi
9120: 6d 65 72 48 61 6e 64 6c 65 72 28 54 4c 53 5f 54 merHandler(TLS_T
9130: 43 4c 5f 44 45 4c 41 59 2c 20 54 6c 73 43 68 61 CL_DELAY, TlsCha
9140: 6e 6e 65 6c 48 61 6e 64 6c 65 72 54 69 6d 65 72 nnelHandlerTimer
9150: 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 , (ClientData) s
9160: 74 61 74 65 50 74 72 29 3b 0a 09 7d 0a 20 20 20 tatePtr);..}.
9170: 20 7d 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d }.}../*. *-----
9180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
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 0a 20 2a 0a 20 2a 20 54 --------. *. * T
91d0: 6c 73 47 65 74 48 61 6e 64 6c 65 50 72 6f 63 20 lsGetHandleProc
91e0: 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 --. *. *.This pr
91f0: 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b ocedure is invok
9200: 65 64 20 62 79 20 74 68 65 20 67 65 6e 65 72 69 ed by the generi
9210: 63 20 49 4f 20 6c 65 76 65 6c 20 74 6f 20 72 65 c IO level to re
9220: 74 72 69 65 76 65 20 61 6e 20 4f 53 0a 20 2a 09 trieve an OS. *.
9230: 73 70 65 63 69 66 69 63 20 68 61 6e 64 6c 65 20 specific handle
9240: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 associated with
9250: 74 68 65 20 63 68 61 6e 6e 65 6c 2e 20 4e 6f 74 the channel. Not
9260: 20 75 73 65 64 20 66 6f 72 20 74 72 61 6e 73 66 used for transf
9270: 6f 72 6d 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 orms.. *. * Resu
9280: 6c 74 73 3a 0a 20 2a 09 54 68 65 20 61 70 70 72 lts:. *.The appr
9290: 6f 70 72 69 61 74 65 20 54 63 6c 5f 46 69 6c 65 opriate Tcl_File
92a0: 20 68 61 6e 64 6c 65 20 6f 72 20 4e 55 4c 4c 20 handle or NULL
92b0: 69 66 20 6e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53 if none.. *. * S
92c0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
92d0: 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d None.. *. *-----
92e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
92f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9320: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 --------. */.sta
9330: 74 69 63 20 69 6e 74 20 54 6c 73 47 65 74 48 61 tic int TlsGetHa
9340: 6e 64 6c 65 50 72 6f 63 28 0a 20 20 20 20 43 6c ndleProc(. Cl
9350: 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 ientData instanc
9360: 65 44 61 74 61 2c 09 2f 2a 20 53 6f 63 6b 65 74 eData,./* Socket
9370: 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 20 20 69 state. */. i
9380: 6e 74 20 64 69 72 65 63 74 69 6f 6e 2c 09 09 2f nt direction,../
9390: 2a 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 20 6f * TCL_READABLE o
93a0: 72 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 20 2a r TCL_WRITABLE *
93b0: 2f 0a 20 20 20 20 43 6c 69 65 6e 74 44 61 74 61 /. ClientData
93c0: 20 2a 68 61 6e 64 6c 65 50 74 72 29 09 2f 2a 20 *handlePtr)./*
93d0: 48 61 6e 64 6c 65 20 61 73 73 6f 63 69 61 74 65 Handle associate
93e0: 64 20 77 69 74 68 20 74 68 65 20 63 68 61 6e 6e d with the chann
93f0: 65 6c 20 2a 2f 0a 7b 0a 20 20 20 20 53 74 61 74 el */.{. Stat
9400: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 e *statePtr = (S
9410: 74 61 74 65 20 2a 29 20 69 6e 73 74 61 6e 63 65 tate *) instance
9420: 44 61 74 61 3b 0a 0a 20 20 20 20 72 65 74 75 72 Data;.. retur
9430: 6e 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c n Tcl_GetChannel
9440: 48 61 6e 64 6c 65 28 54 6c 73 5f 47 65 74 50 61 Handle(Tls_GetPa
9450: 72 65 6e 74 28 73 74 61 74 65 50 74 72 2c 20 54 rent(statePtr, T
9460: 4c 53 5f 54 43 4c 5f 46 41 53 54 50 41 54 48 29 LS_TCL_FASTPATH)
9470: 2c 0a 09 64 69 72 65 63 74 69 6f 6e 2c 20 68 61 ,..direction, ha
9480: 6e 64 6c 65 50 74 72 29 3b 0a 7d 0a 0a 2f 2a 0a ndlePtr);.}../*.
9490: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
94a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
94b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
94c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
94d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
94e0: 20 2a 0a 20 2a 20 54 6c 73 4e 6f 74 69 66 79 50 *. * TlsNotifyP
94f0: 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 roc --. *. *.Thi
9500: 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 s procedure is i
9510: 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20 67 65 nvoked by the ge
9520: 6e 65 72 69 63 20 49 4f 20 6c 65 76 65 6c 20 74 neric IO level t
9530: 6f 20 6e 6f 74 69 66 79 20 74 68 65 20 63 68 61 o notify the cha
9540: 6e 6e 65 6c 0a 20 2a 09 74 68 61 74 20 61 6e 20 nnel. *.that an
9550: 65 76 65 6e 74 20 68 61 73 20 6f 63 63 75 72 72 event has occurr
9560: 65 64 20 6f 6e 20 74 68 65 20 75 6e 64 65 72 6c ed on the underl
9570: 79 69 6e 67 20 63 68 61 6e 6e 65 6c 2e 20 49 74 ying channel. It
9580: 20 69 73 20 75 73 65 64 20 62 79 0a 20 2a 09 73 is used by. *.s
9590: 74 61 63 6b 65 64 20 63 68 61 6e 6e 65 6c 20 64 tacked channel d
95a0: 72 69 76 65 72 73 20 74 68 61 74 20 77 69 73 68 rivers that wish
95b0: 20 74 6f 20 62 65 20 6e 6f 74 69 66 69 65 64 20 to be notified
95c0: 6f 66 20 65 76 65 6e 74 73 20 74 68 61 74 20 6f of events that o
95d0: 63 63 75 72 0a 20 2a 09 6f 6e 20 74 68 65 20 75 ccur. *.on the u
95e0: 6e 64 65 72 6c 79 69 6e 67 20 28 73 74 61 63 6b nderlying (stack
95f0: 65 64 29 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a ed) channel.. *.
9600: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 54 * Results:. *.T
9610: 79 70 65 20 6f 66 20 65 76 65 6e 74 20 6f 72 20 ype of event or
9620: 30 20 69 66 20 66 61 69 6c 65 64 0a 20 2a 0a 20 0 if failed. *.
9630: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
9640: 20 2a 09 4d 61 79 20 70 72 6f 63 65 73 73 20 74 *.May process t
9650: 68 65 20 69 6e 63 6f 6d 69 6e 67 20 65 76 65 6e he incoming even
9660: 74 20 62 79 20 69 74 73 65 6c 66 2e 0a 20 2a 0a t by itself.. *.
9670: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
9680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
96a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
96b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
96c0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 54 */.static int T
96d0: 6c 73 4e 6f 74 69 66 79 50 72 6f 63 28 0a 20 20 lsNotifyProc(.
96e0: 20 20 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 ClientData ins
96f0: 74 61 6e 63 65 44 61 74 61 2c 09 2f 2a 20 53 6f tanceData,./* So
9700: 63 6b 65 74 20 73 74 61 74 65 2e 20 2a 2f 0a 20 cket state. */.
9710: 20 20 20 69 6e 74 20 6d 61 73 6b 29 09 09 09 2f int mask).../
9720: 2a 20 74 79 70 65 20 6f 66 20 65 76 65 6e 74 20 * type of event
9730: 74 68 61 74 20 6f 63 63 75 72 72 65 64 3a 20 4f that occurred: O
9740: 52 2d 65 64 0a 09 09 09 09 20 2a 20 63 6f 6d 62 R-ed..... * comb
9750: 69 6e 61 74 69 6f 6e 20 6f 66 20 54 43 4c 5f 52 ination of TCL_R
9760: 45 41 44 41 42 4c 45 20 6f 72 20 54 43 4c 5f 57 EADABLE or TCL_W
9770: 52 49 54 41 42 4c 45 20 2a 2f 0a 7b 0a 20 20 20 RITABLE */.{.
9780: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 State *statePtr
9790: 20 3d 20 28 53 74 61 74 65 20 2a 29 20 69 6e 73 = (State *) ins
97a0: 74 61 6e 63 65 44 61 74 61 3b 0a 20 20 20 20 69 tanceData;. i
97b0: 6e 74 20 65 72 72 6f 72 43 6f 64 65 20 3d 20 30 nt errorCode = 0
97c0: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
97d0: 43 61 6c 6c 65 64 20 77 69 74 68 20 6d 61 73 6b Called with mask
97e0: 20 30 78 25 30 32 78 22 2c 20 6d 61 73 6b 29 3b 0x%02x", mask);
97f0: 0a 0a 20 20 20 20 2f 2a 20 41 62 6f 72 74 20 69 .. /* Abort i
9800: 66 20 74 68 65 20 75 73 65 72 20 76 65 72 69 66 f the user verif
9810: 79 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 73 74 y callback is st
9820: 69 6c 6c 20 72 75 6e 6e 69 6e 67 20 74 6f 20 61 ill running to a
9830: 76 6f 69 64 20 74 72 69 67 67 65 72 69 6e 67 0a void triggering.
9840: 20 20 20 20 20 2a 20 61 6e 6f 74 68 65 72 20 63 * another c
9850: 61 6c 6c 20 62 65 66 6f 72 65 20 74 68 65 20 63 all before the c
9860: 75 72 72 65 6e 74 20 6f 6e 65 20 69 73 20 63 6f urrent one is co
9870: 6d 70 6c 65 74 65 2e 20 2a 2f 0a 20 20 20 20 69 mplete. */. i
9880: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 f (statePtr->fla
9890: 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f 43 41 4c gs & TLS_TCL_CAL
98a0: 4c 42 41 43 4b 29 20 7b 0a 09 64 70 72 69 6e 74 LBACK) {..dprint
98b0: 66 28 22 43 61 6c 6c 62 61 63 6b 20 69 73 20 6f f("Callback is o
98c0: 6e 2d 67 6f 69 6e 67 2c 20 72 65 74 75 72 6e 69 n-going, returni
98d0: 6e 67 20 66 61 69 6c 65 64 22 29 3b 0a 09 72 65 ng failed");..re
98e0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 turn 0;. }..
98f0: 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e 69 /* If not ini
9900: 74 69 61 6c 69 7a 65 64 2c 20 64 6f 20 63 6f 6e tialized, do con
9910: 6e 65 63 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 nect */. if (
9920: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 statePtr->flags
9930: 26 20 54 4c 53 5f 54 43 4c 5f 49 4e 49 54 29 20 & TLS_TCL_INIT)
9940: 7b 0a 09 69 6e 74 20 74 6c 73 43 6f 6e 6e 65 63 {..int tlsConnec
9950: 74 3b 0a 0a 09 64 70 72 69 6e 74 66 28 22 43 61 t;...dprintf("Ca
9960: 6c 6c 69 6e 67 20 54 6c 73 5f 57 61 69 74 46 6f lling Tls_WaitFo
9970: 72 43 6f 6e 6e 65 63 74 22 29 3b 0a 0a 09 74 6c rConnect");...tl
9980: 73 43 6f 6e 6e 65 63 74 20 3d 20 54 6c 73 5f 57 sConnect = Tls_W
9990: 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 28 73 74 aitForConnect(st
99a0: 61 74 65 50 74 72 2c 20 26 65 72 72 6f 72 43 6f atePtr, &errorCo
99b0: 64 65 2c 20 31 29 3b 0a 09 69 66 20 28 74 6c 73 de, 1);..if (tls
99c0: 43 6f 6e 6e 65 63 74 20 3c 20 31 29 20 7b 0a 09 Connect < 1) {..
99d0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74 dprintf("Got
99e0: 20 61 6e 20 65 72 72 6f 72 20 77 61 69 74 69 6e an error waitin
99f0: 67 20 74 6f 20 63 6f 6e 6e 65 63 74 20 28 74 6c g to connect (tl
9a00: 73 43 6f 6e 6e 65 63 74 20 3d 20 25 69 2c 20 2a sConnect = %i, *
9a10: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 25 errorCodePtr = %
9a20: 69 29 22 2c 20 74 6c 73 43 6f 6e 6e 65 63 74 2c i)", tlsConnect,
9a30: 20 65 72 72 6f 72 43 6f 64 65 29 3b 0a 09 20 20 errorCode);..
9a40: 20 20 69 66 20 28 65 72 72 6f 72 43 6f 64 65 20 if (errorCode
9a50: 3d 3d 20 45 41 47 41 49 4e 29 20 7b 0a 09 09 64 == EAGAIN) {...d
9a60: 70 72 69 6e 74 66 28 22 41 73 79 6e 63 20 66 6c printf("Async fl
9a70: 61 67 20 63 6f 75 6c 64 20 62 65 20 73 65 74 20 ag could be set
9a80: 28 64 69 64 6e 27 74 20 63 68 65 63 6b 29 20 61 (didn't check) a
9a90: 6e 64 20 65 72 72 6f 72 43 6f 64 65 20 3d 3d 20 nd errorCode ==
9aa0: 45 41 47 41 49 4e 3a 20 20 52 65 74 75 72 6e 69 EAGAIN: Returni
9ab0: 6e 67 20 66 61 69 6c 65 64 22 29 3b 0a 0a 09 09 ng failed");....
9ac0: 72 65 74 75 72 6e 20 30 3b 0a 09 20 20 20 20 7d return 0;.. }
9ad0: 0a 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 ... dprintf("
9ae0: 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 Tls_WaitForConne
9af0: 63 74 20 72 65 74 75 72 6e 65 64 20 61 6e 20 65 ct returned an e
9b00: 72 72 6f 72 22 29 3b 0a 09 7d 0a 20 20 20 20 7d rror");..}. }
9b10: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 .. /*. *
9b20: 44 65 6c 65 74 65 20 61 6e 20 65 78 69 73 74 69 Delete an existi
9b30: 6e 67 20 74 69 6d 65 72 2e 20 49 74 20 77 61 73 ng timer. It was
9b40: 20 6e 6f 74 20 66 69 72 65 64 2c 20 79 65 74 20 not fired, yet
9b50: 77 65 20 61 72 65 20 68 65 72 65 2c 20 73 6f 20 we are here, so
9b60: 74 68 65 0a 20 20 20 20 20 2a 20 63 68 61 6e 6e the. * chann
9b70: 65 6c 20 62 65 6c 6f 77 20 67 65 6e 65 72 61 74 el below generat
9b80: 65 64 20 73 75 63 68 20 61 6e 20 65 76 65 6e 74 ed such an event
9b90: 20 61 6e 64 20 77 65 20 64 6f 6e 27 74 20 68 61 and we don't ha
9ba0: 76 65 20 74 6f 2e 20 54 68 65 20 72 65 6e 65 77 ve to. The renew
9bb0: 61 6c 0a 20 20 20 20 20 2a 20 6f 66 20 74 68 65 al. * of the
9bc0: 20 69 6e 74 65 72 65 73 74 20 61 66 74 65 72 20 interest after
9bd0: 74 68 65 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 the execution of
9be0: 20 63 68 61 6e 6e 65 6c 20 68 61 6e 64 6c 65 72 channel handler
9bf0: 73 20 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c s will eventuall
9c00: 79 0a 20 20 20 20 20 2a 20 63 61 75 73 65 20 75 y. * cause u
9c10: 73 20 74 6f 20 72 65 63 72 65 61 74 65 20 74 68 s to recreate th
9c20: 65 20 74 69 6d 65 72 20 28 69 6e 20 54 6c 73 57 e timer (in TlsW
9c30: 61 74 63 68 50 72 6f 63 29 2e 0a 20 20 20 20 20 atchProc)..
9c40: 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 */. if (state
9c50: 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20 28 54 Ptr->timer != (T
9c60: 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e cl_TimerToken) N
9c70: 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 6c 65 ULL) {..Tcl_Dele
9c80: 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 73 teTimerHandler(s
9c90: 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 29 3b tatePtr->timer);
9ca0: 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 ..statePtr->time
9cb0: 72 20 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f r = (Tcl_TimerTo
9cc0: 6b 65 6e 29 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d ken) NULL;. }
9cd0: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 .. /*. *
9ce0: 41 6e 20 65 76 65 6e 74 20 6f 63 63 75 72 72 65 An event occurre
9cf0: 64 20 69 6e 20 74 68 65 20 75 6e 64 65 72 6c 79 d in the underly
9d00: 69 6e 67 20 63 68 61 6e 6e 65 6c 2e 20 54 68 69 ing channel. Thi
9d10: 73 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e s transformation
9d20: 20 64 6f 65 73 6e 27 74 0a 20 20 20 20 20 2a 20 doesn't. *
9d30: 70 72 6f 63 65 73 73 20 73 75 63 68 20 65 76 65 process such eve
9d40: 6e 74 73 20 74 68 75 73 20 72 65 74 75 72 6e 73 nts thus returns
9d50: 20 74 68 65 20 69 6e 63 6f 6d 69 6e 67 20 6d 61 the incoming ma
9d60: 73 6b 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 sk unchanged..
9d70: 20 20 20 2a 2f 0a 20 20 20 20 64 70 72 69 6e 74 */. dprint
9d80: 66 28 22 52 65 74 75 72 6e 69 6e 67 20 25 69 22 f("Returning %i"
9d90: 2c 20 6d 61 73 6b 29 3b 0a 20 20 20 20 72 65 74 , mask);. ret
9da0: 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a urn mask;.}../*.
9db0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
9dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
9e00: 20 2a 0a 20 2a 20 54 6c 73 5f 43 68 61 6e 6e 65 *. * Tls_Channe
9e10: 6c 54 79 70 65 20 2d 2d 0a 20 2a 0a 20 2a 09 44 lType --. *. *.D
9e20: 65 66 69 6e 65 73 20 74 68 65 20 63 6f 72 72 65 efines the corre
9e30: 63 74 20 54 4c 53 20 63 68 61 6e 6e 65 6c 20 64 ct TLS channel d
9e40: 72 69 76 65 72 20 68 61 6e 64 6c 65 72 73 20 66 river handlers f
9e50: 6f 72 20 74 68 69 73 20 63 68 61 6e 6e 65 6c 20 or this channel
9e60: 74 79 70 65 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 type.. *. * Resu
9e70: 6c 74 73 3a 0a 20 2a 09 54 63 6c 5f 43 68 61 6e lts:. *.Tcl_Chan
9e80: 6e 65 6c 54 79 70 65 20 73 74 72 75 63 74 75 72 nelType structur
9e90: 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 e.. *. * Side ef
9ea0: 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a fects:. *.None..
9eb0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
9ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9f00: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f --. */.static co
9f10: 6e 73 74 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 54 nst Tcl_ChannelT
9f20: 79 70 65 20 74 6c 73 43 68 61 6e 6e 65 6c 54 79 ype tlsChannelTy
9f30: 70 65 20 3d 20 7b 0a 20 20 20 20 22 74 6c 73 22 pe = {. "tls"
9f40: 2c 09 09 09 2f 2a 20 54 79 70 65 20 6e 61 6d 65 ,.../* Type name
9f50: 20 2a 2f 0a 20 20 20 20 54 43 4c 5f 43 48 41 4e */. TCL_CHAN
9f60: 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f 35 2c 09 2f NEL_VERSION_5,./
9f70: 2a 20 76 35 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a * v5 channel */.
9f80: 20 20 20 20 54 6c 73 43 6c 6f 73 65 50 72 6f 63 TlsCloseProc
9f90: 2c 09 09 2f 2a 20 43 6c 6f 73 65 20 70 72 6f 63 ,../* Close proc
9fa0: 20 2a 2f 0a 20 20 20 20 54 6c 73 49 6e 70 75 74 */. TlsInput
9fb0: 50 72 6f 63 2c 09 09 2f 2a 20 49 6e 70 75 74 20 Proc,../* Input
9fc0: 70 72 6f 63 20 2a 2f 0a 20 20 20 20 54 6c 73 4f proc */. TlsO
9fd0: 75 74 70 75 74 50 72 6f 63 2c 09 09 2f 2a 20 4f utputProc,../* O
9fe0: 75 74 70 75 74 20 70 72 6f 63 20 2a 2f 0a 20 20 utput proc */.
9ff0: 20 20 4e 55 4c 4c 2c 09 09 09 2f 2a 20 53 65 65 NULL,.../* See
a000: 6b 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20 54 6c k proc */. Tl
a010: 73 53 65 74 4f 70 74 69 6f 6e 50 72 6f 63 2c 09 sSetOptionProc,.
a020: 09 2f 2a 20 53 65 74 20 6f 70 74 69 6f 6e 20 70 ./* Set option p
a030: 72 6f 63 20 2a 2f 0a 20 20 20 20 54 6c 73 47 65 roc */. TlsGe
a040: 74 4f 70 74 69 6f 6e 50 72 6f 63 2c 09 09 2f 2a tOptionProc,../*
a050: 20 47 65 74 20 6f 70 74 69 6f 6e 20 70 72 6f 63 Get option proc
a060: 20 2a 2f 0a 20 20 20 20 54 6c 73 57 61 74 63 68 */. TlsWatch
a070: 50 72 6f 63 2c 09 09 2f 2a 20 49 6e 69 74 69 61 Proc,../* Initia
a080: 6c 69 7a 65 20 6e 6f 74 69 66 69 65 72 20 2a 2f lize notifier */
a090: 0a 20 20 20 20 54 6c 73 47 65 74 48 61 6e 64 6c . TlsGetHandl
a0a0: 65 50 72 6f 63 2c 09 09 2f 2a 20 47 65 74 20 4f eProc,../* Get O
a0b0: 53 20 68 61 6e 64 6c 65 73 20 6f 75 74 20 6f 66 S handles out of
a0c0: 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 channel */.
a0d0: 54 6c 73 43 6c 6f 73 65 32 50 72 6f 63 2c 09 09 TlsClose2Proc,..
a0e0: 2f 2a 20 63 6c 6f 73 65 32 70 72 6f 63 20 2a 2f /* close2proc */
a0f0: 0a 20 20 20 20 54 6c 73 42 6c 6f 63 6b 4d 6f 64 . TlsBlockMod
a100: 65 50 72 6f 63 2c 09 09 2f 2a 20 53 65 74 20 62 eProc,../* Set b
a110: 6c 6f 63 6b 69 6e 67 2f 6e 6f 6e 62 6c 6f 63 6b locking/nonblock
a120: 69 6e 67 20 6d 6f 64 65 2a 2f 0a 20 20 20 20 4e ing mode*/. N
a130: 55 4c 4c 2c 09 09 09 2f 2a 20 46 6c 75 73 68 20 ULL,.../* Flush
a140: 70 72 6f 63 20 2a 2f 0a 20 20 20 20 54 6c 73 4e proc */. TlsN
a150: 6f 74 69 66 79 50 72 6f 63 2c 09 09 2f 2a 20 48 otifyProc,../* H
a160: 61 6e 64 6c 69 6e 67 20 6f 66 20 65 76 65 6e 74 andling of event
a170: 73 20 62 75 62 62 6c 69 6e 67 20 75 70 20 2a 2f s bubbling up */
a180: 0a 20 20 20 20 4e 55 4c 4c 2c 09 09 09 2f 2a 20 . NULL,.../*
a190: 57 69 64 65 20 73 65 65 6b 20 70 72 6f 63 20 2a Wide seek proc *
a1a0: 2f 0a 20 20 20 20 4e 55 4c 4c 2c 09 09 09 2f 2a /. NULL,.../*
a1b0: 20 54 68 72 65 61 64 20 61 63 74 69 6f 6e 20 2a Thread action *
a1c0: 2f 0a 20 20 20 20 4e 55 4c 4c 09 09 09 2f 2a 20 /. NULL.../*
a1d0: 54 72 75 6e 63 61 74 65 20 2a 2f 0a 7d 3b 0a 0a Truncate */.};..
a1e0: 63 6f 6e 73 74 20 54 63 6c 5f 43 68 61 6e 6e 65 const Tcl_Channe
a1f0: 6c 54 79 70 65 20 2a 54 6c 73 5f 43 68 61 6e 6e lType *Tls_Chann
a200: 65 6c 54 79 70 65 28 76 6f 69 64 29 20 7b 0a 20 elType(void) {.
a210: 20 20 20 72 65 74 75 72 6e 20 26 74 6c 73 43 68 return &tlsCh
a220: 61 6e 6e 65 6c 54 79 70 65 3b 0a 7d 0a annelType;.}.