0000: 2f 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20 /*. * Copyright
0010: 28 43 29 20 31 39 39 37 2d 32 30 30 30 20 4d 61 (C) 1997-2000 Ma
0020: 74 74 20 4e 65 77 6d 61 6e 20 3c 6d 61 74 74 40 tt Newman <matt@
0030: 6e 6f 76 61 64 69 67 6d 2e 63 6f 6d 3e 0a 20 2a novadigm.com>. *
0040: 20 43 6f 70 79 72 69 67 68 74 20 28 43 29 20 32 Copyright (C) 2
0050: 30 30 30 20 41 6a 75 62 61 20 53 6f 6c 75 74 69 000 Ajuba Soluti
0060: 6f 6e 73 0a 20 2a 0a 20 2a 20 54 4c 53 20 28 61 ons. *. * TLS (a
0070: 6b 61 20 53 53 4c 29 20 43 68 61 6e 6e 65 6c 20 ka SSL) Channel
0080: 2d 20 63 61 6e 20 62 65 20 6c 61 79 65 72 65 64 - can be layered
0090: 20 6f 6e 20 61 6e 79 20 62 69 2d 64 69 72 65 63 on any bi-direc
00a0: 74 69 6f 6e 61 6c 0a 20 2a 20 54 63 6c 5f 43 68 tional. * Tcl_Ch
00b0: 61 6e 6e 65 6c 20 28 4e 6f 74 65 3a 20 52 65 71 annel (Note: Req
00c0: 75 69 72 65 73 20 54 72 66 20 43 6f 72 65 20 50 uires Trf Core P
00d0: 61 74 63 68 29 0a 20 2a 0a 20 2a 20 54 68 69 73 atch). *. * This
00e0: 20 77 61 73 20 62 75 69 6c 74 20 66 72 6f 6d 20 was built from
00f0: 73 63 72 61 74 63 68 20 62 61 73 65 64 20 75 70 scratch based up
0100: 6f 6e 20 6f 62 73 65 72 76 61 74 69 6f 6e 20 6f on observation o
0110: 66 20 4f 70 65 6e 53 53 4c 20 30 2e 39 2e 32 42 f OpenSSL 0.9.2B
0120: 0a 20 2a 0a 20 2a 20 41 64 64 69 74 69 6f 6e 20 . *. * Addition
0130: 63 72 65 64 69 74 20 69 73 20 64 75 65 20 66 6f credit is due fo
0140: 72 20 41 6e 64 72 65 61 73 20 4b 75 70 72 69 65 r Andreas Kuprie
0150: 73 20 28 61 2e 6b 75 70 72 69 65 73 40 77 65 73 s (a.kupries@wes
0160: 74 65 6e 64 2e 63 6f 6d 29 2c 20 66 6f 72 0a 20 tend.com), for.
0170: 2a 20 70 72 6f 76 69 64 69 6e 67 20 74 68 65 20 * providing the
0180: 54 63 6c 5f 52 65 70 6c 61 63 65 43 68 61 6e 6e Tcl_ReplaceChann
0190: 65 6c 20 6d 65 63 68 61 6e 69 73 6d 20 61 6e 64 el mechanism and
01a0: 20 77 6f 72 6b 69 6e 67 20 63 6c 6f 73 65 6c 79 working closely
01b0: 20 77 69 74 68 20 6d 65 0a 20 2a 20 74 6f 20 65 with me. * to e
01c0: 6e 68 61 6e 63 65 20 69 74 20 74 6f 20 73 75 70 nhance it to sup
01d0: 70 6f 72 74 20 66 75 6c 6c 20 66 69 6c 65 65 76 port full fileev
01e0: 65 6e 74 20 73 65 6d 61 6e 74 69 63 73 2e 0a 20 ent semantics..
01f0: 2a 0a 20 2a 20 41 6c 73 6f 20 77 6f 72 6b 20 64 *. * Also work d
0200: 6f 6e 65 20 62 79 20 74 68 65 20 66 6f 6c 6c 6f one by the follo
0210: 77 20 70 65 6f 70 6c 65 20 70 72 6f 76 69 64 65 w people provide
0220: 64 20 74 68 65 20 69 6d 70 65 74 75 73 20 74 6f d the impetus to
0230: 20 64 6f 20 74 68 69 73 20 22 72 69 67 68 74 22 do this "right"
0240: 3a 0a 20 2a 20 20 20 20 74 63 6c 53 53 4c 20 28 :. * tclSSL (
0250: 43 6f 6c 69 6e 20 4d 63 43 6f 72 6d 61 63 6b 2c Colin McCormack,
0260: 20 53 68 61 72 65 64 20 54 65 63 68 6e 6f 6c 6f Shared Technolo
0270: 67 79 29 0a 20 2a 20 20 20 20 53 53 4c 74 63 6c gy). * SSLtcl
0280: 20 28 50 65 74 65 72 20 41 6e 74 6d 61 6e 29 0a (Peter Antman).
0290: 20 2a 0a 20 2a 2f 0a 0a 23 69 6e 63 6c 75 64 65 *. */..#include
02a0: 20 22 74 6c 73 49 6e 74 2e 68 22 0a 23 69 6e 63 "tlsInt.h".#inc
02b0: 6c 75 64 65 20 3c 65 72 72 6e 6f 2e 68 3e 0a 0a lude <errno.h>..
02c0: 2f 2a 0a 20 2a 20 46 6f 72 77 61 72 64 20 64 65 /*. * Forward de
02d0: 63 6c 61 72 61 74 69 6f 6e 73 0a 20 2a 2f 0a 73 clarations. */.s
02e0: 74 61 74 69 63 20 76 6f 69 64 20 54 6c 73 43 68 tatic void TlsCh
02f0: 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 54 69 6d 65 annelHandlerTime
0300: 72 28 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61 r(void *clientDa
0310: 74 61 29 3b 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ta);../*. *-----
0320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
0360: 2a 0a 20 2a 20 54 6c 73 42 6c 6f 63 6b 4d 6f 64 *. * TlsBlockMod
0370: 65 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 20 20 eProc --. *. *
0380: 20 20 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 This procedure
0390: 20 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 is invoked by t
03a0: 68 65 20 67 65 6e 65 72 69 63 20 49 4f 20 6c 65 he generic IO le
03b0: 76 65 6c 0a 20 2a 20 20 20 20 20 20 20 74 6f 20 vel. * to
03c0: 73 65 74 20 62 6c 6f 63 6b 69 6e 67 20 61 6e 64 set blocking and
03d0: 20 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64 nonblocking mod
03e0: 65 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 es. *. * Results
03f0: 3a 0a 20 2a 20 20 20 20 30 20 69 66 20 73 75 63 :. * 0 if suc
0400: 63 65 73 73 66 75 6c 20 6f 72 20 50 4f 53 49 58 cessful or POSIX
0410: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 66 error code if f
0420: 61 69 6c 65 64 2e 0a 20 2a 0a 20 2a 20 53 69 64 ailed.. *. * Sid
0430: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 20 20 20 e effects:. *
0440: 20 53 65 74 73 20 74 68 65 20 64 65 76 69 63 65 Sets the device
0450: 20 69 6e 74 6f 20 62 6c 6f 63 6b 69 6e 67 20 6f into blocking o
0460: 72 20 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 20 6d 6f r nonblocking mo
0470: 64 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d de.. *. *-------
0480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
04a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
04b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
04c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 54 6c 73 42 .static int TlsB
04d0: 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 28 76 6f 69 lockModeProc(voi
04e0: 64 20 2a 69 6e 73 74 61 6e 63 65 44 61 74 61 2c d *instanceData,
04f0: 20 69 6e 74 20 6d 6f 64 65 29 20 7b 0a 20 20 20 int mode) {.
0500: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 State *statePtr
0510: 20 3d 20 28 53 74 61 74 65 20 2a 29 20 69 6e 73 = (State *) ins
0520: 74 61 6e 63 65 44 61 74 61 3b 0a 0a 20 20 20 20 tanceData;..
0530: 69 66 20 28 6d 6f 64 65 20 3d 3d 20 54 43 4c 5f if (mode == TCL_
0540: 4d 4f 44 45 5f 4e 4f 4e 42 4c 4f 43 4b 49 4e 47 MODE_NONBLOCKING
0550: 29 20 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 ) {..statePtr->f
0560: 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f lags |= TLS_TCL_
0570: 41 53 59 4e 43 3b 0a 20 20 20 20 7d 20 65 6c 73 ASYNC;. } els
0580: 65 20 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 e {..statePtr->f
0590: 6c 61 67 73 20 26 3d 20 7e 28 54 4c 53 5f 54 43 lags &= ~(TLS_TC
05a0: 4c 5f 41 53 59 4e 43 29 3b 0a 20 20 20 20 7d 0a L_ASYNC);. }.
05b0: 20 20 20 20 72 65 74 75 72 6e 28 30 29 3b 0a 7d return(0);.}
05c0: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
05d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
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 0a 20 2a 0a 20 2a ----------. *. *
0610: 20 54 6c 73 43 6c 6f 73 65 50 72 6f 63 20 2d 2d TlsCloseProc --
0620: 0a 20 2a 0a 20 2a 20 20 20 20 54 68 69 73 20 70 . *. * This p
0630: 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f rocedure is invo
0640: 6b 65 64 20 62 79 20 74 68 65 20 67 65 6e 65 72 ked by the gener
0650: 69 63 20 49 4f 20 6c 65 76 65 6c 20 74 6f 20 70 ic IO level to p
0660: 65 72 66 6f 72 6d 0a 20 2a 20 20 20 20 63 68 61 erform. * cha
0670: 6e 6e 65 6c 2d 74 79 70 65 2d 73 70 65 63 69 66 nnel-type-specif
0680: 69 63 20 63 6c 65 61 6e 75 70 20 77 68 65 6e 20 ic cleanup when
0690: 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 a SSL socket bas
06a0: 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 20 20 20 ed channel. *
06b0: 20 69 73 20 63 6c 6f 73 65 64 2e 0a 20 2a 0a 20 is closed.. *.
06c0: 2a 20 20 20 20 4e 6f 74 65 3a 20 77 65 20 6c 65 * Note: we le
06d0: 61 76 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 ave the underlyi
06e0: 6e 67 20 73 6f 63 6b 65 74 20 61 6c 6f 6e 65 2c ng socket alone,
06f0: 20 69 73 20 74 68 69 73 20 72 69 67 68 74 3f 0a is this right?.
0700: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
0710: 2a 20 20 20 20 30 20 69 66 20 73 75 63 63 65 73 * 0 if succes
0720: 73 66 75 6c 20 6f 72 20 50 4f 53 49 58 20 65 72 sful or POSIX er
0730: 72 6f 72 20 63 6f 64 65 20 69 66 20 66 61 69 6c ror code if fail
0740: 65 64 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 ed.. *. * Side e
0750: 66 66 65 63 74 73 3a 0a 20 2a 20 20 20 20 43 6c ffects:. * Cl
0760: 6f 73 65 73 20 74 68 65 20 73 6f 63 6b 65 74 20 oses the socket
0770: 6f 66 20 74 68 65 20 63 68 61 6e 6e 65 6c 2e 0a of the channel..
0780: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
0790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
07a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
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 0a 20 2a 2f 0a 73 74 61 --------. */.sta
07d0: 74 69 63 20 69 6e 74 20 54 6c 73 43 6c 6f 73 65 tic int TlsClose
07e0: 50 72 6f 63 28 0a 20 20 20 20 76 6f 69 64 20 2a Proc(. void *
07f0: 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 0a 20 20 instanceData,.
0800: 20 20 54 43 4c 5f 55 4e 55 53 45 44 28 54 63 6c TCL_UNUSED(Tcl
0810: 5f 49 6e 74 65 72 70 20 2a 29 29 0a 7b 0a 20 20 _Interp *)).{.
0820: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 State *statePt
0830: 72 20 3d 20 28 53 74 61 74 65 20 2a 29 69 6e 73 r = (State *)ins
0840: 74 61 6e 63 65 44 61 74 61 3b 0a 0a 20 20 20 20 tanceData;..
0850: 64 70 72 69 6e 74 66 28 22 54 6c 73 43 6c 6f 73 dprintf("TlsClos
0860: 65 50 72 6f 63 28 25 70 29 22 2c 20 73 74 61 74 eProc(%p)", stat
0870: 65 50 74 72 29 3b 0a 0a 20 20 20 20 54 6c 73 5f ePtr);.. Tls_
0880: 43 6c 65 61 6e 28 73 74 61 74 65 50 74 72 29 3b Clean(statePtr);
0890: 0a 20 20 20 20 54 63 6c 5f 45 76 65 6e 74 75 61 . Tcl_Eventua
08a0: 6c 6c 79 46 72 65 65 28 73 74 61 74 65 50 74 72 llyFree(statePtr
08b0: 2c 20 54 6c 73 5f 46 72 65 65 29 3b 0a 20 20 20 , Tls_Free);.
08c0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a return TCL_OK;.
08d0: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 54 6c }..static int Tl
08e0: 73 43 6c 6f 73 65 32 50 72 6f 63 28 0a 20 20 20 sClose2Proc(.
08f0: 20 76 6f 69 64 20 2a 69 6e 73 74 61 6e 63 65 44 void *instanceD
0900: 61 74 61 2c 20 20 20 20 2f 2a 20 54 68 65 20 73 ata, /* The s
0910: 6f 63 6b 65 74 20 73 74 61 74 65 2e 20 2a 2f 0a ocket state. */.
0920: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a Tcl_Interp *
0930: 69 6e 74 65 72 70 2c 09 09 2f 2a 20 46 6f 72 20 interp,../* For
0940: 65 72 72 6f 72 73 20 2d 20 63 61 6e 20 62 65 20 errors - can be
0950: 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 NULL. */. int
0960: 20 66 6c 61 67 73 29 09 09 09 2f 2a 20 46 6c 61 flags).../* Fla
0970: 67 73 20 74 6f 20 63 6c 6f 73 65 20 72 65 61 64 gs to close read
0980: 20 61 6e 64 2f 6f 72 20 77 72 69 74 65 20 73 69 and/or write si
0990: 64 65 20 6f 66 20 63 68 61 6e 6e 65 6c 20 2a 2f de of channel */
09a0: 0a 7b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 .{. dprintf("
09b0: 54 6c 73 43 6c 6f 73 65 32 50 72 6f 63 28 25 70 TlsClose2Proc(%p
09c0: 29 22 2c 20 69 6e 73 74 61 6e 63 65 44 61 74 61 )", instanceData
09d0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 21 28 66 6c );.. if (!(fl
09e0: 61 67 73 20 26 20 28 54 43 4c 5f 43 4c 4f 53 45 ags & (TCL_CLOSE
09f0: 5f 52 45 41 44 7c 54 43 4c 5f 43 4c 4f 53 45 5f _READ|TCL_CLOSE_
0a00: 57 52 49 54 45 29 29 29 20 7b 0a 09 72 65 74 75 WRITE))) {..retu
0a10: 72 6e 20 54 6c 73 43 6c 6f 73 65 50 72 6f 63 28 rn TlsCloseProc(
0a20: 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 69 6e instanceData, in
0a30: 74 65 72 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 terp);. }.
0a40: 20 72 65 74 75 72 6e 20 45 49 4e 56 41 4c 3b 0a return EINVAL;.
0a50: 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d }../*. *--------
0a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a --------------*.
0a90: 20 2a 0a 20 2a 20 54 6c 73 5f 57 61 69 74 46 6f *. * Tls_WaitFo
0aa0: 72 43 6f 6e 6e 65 63 74 20 2d 2d 0a 20 2a 0a 20 rConnect --. *.
0ab0: 2a 20 52 65 73 75 6c 74 3a 0a 20 2a 20 20 20 20 * Result:. *
0ac0: 30 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 0 if successful,
0ad0: 20 2d 31 20 69 66 20 66 61 69 6c 65 64 2e 0a 20 -1 if failed..
0ae0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
0af0: 73 3a 0a 20 2a 20 20 20 20 49 73 73 75 65 73 20 s:. * Issues
0b00: 53 53 4c 5f 61 63 63 65 70 74 20 6f 72 20 53 53 SSL_accept or SS
0b10: 4c 5f 63 6f 6e 6e 65 63 74 0a 20 2a 0a 20 2a 2d L_connect. *. *-
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 2a 0a 20 2a 2f 0a 69 6e 74 20 54 -----*. */.int T
0b60: 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 ls_WaitForConnec
0b70: 74 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 t(State *statePt
0b80: 72 2c 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 r, int *errorCod
0b90: 65 50 74 72 2c 20 69 6e 74 20 68 61 6e 64 73 68 ePtr, int handsh
0ba0: 61 6b 65 46 61 69 6c 75 72 65 49 73 50 65 72 6d akeFailureIsPerm
0bb0: 61 6e 65 6e 74 29 20 7b 0a 20 20 20 20 75 6e 73 anent) {. uns
0bc0: 69 67 6e 65 64 20 6c 6f 6e 67 20 62 61 63 6b 69 igned long backi
0bd0: 6e 67 45 72 72 6f 72 3b 0a 20 20 20 20 69 6e 74 ngError;. int
0be0: 20 65 72 72 2c 20 72 63 3b 0a 20 20 20 20 69 6e err, rc;. in
0bf0: 74 20 62 69 6f 53 68 6f 75 6c 64 52 65 74 72 79 t bioShouldRetry
0c00: 3b 0a 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 ;. *errorCode
0c10: 50 74 72 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 Ptr = 0;.. dp
0c20: 72 69 6e 74 66 28 22 57 61 69 74 46 6f 72 43 6f rintf("WaitForCo
0c30: 6e 6e 65 63 74 28 25 70 29 22 2c 20 73 74 61 74 nnect(%p)", stat
0c40: 65 50 74 72 29 3b 0a 20 20 20 20 64 70 72 69 6e ePtr);. dprin
0c50: 74 46 6c 61 67 73 28 73 74 61 74 65 50 74 72 29 tFlags(statePtr)
0c60: 3b 0a 0a 20 20 20 20 69 66 20 28 21 28 73 74 61 ;.. if (!(sta
0c70: 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 tePtr->flags & T
0c80: 4c 53 5f 54 43 4c 5f 49 4e 49 54 29 29 20 7b 0a LS_TCL_INIT)) {.
0c90: 09 64 70 72 69 6e 74 66 28 22 54 6c 73 5f 57 61 .dprintf("Tls_Wa
0ca0: 69 74 46 6f 72 43 6f 6e 6e 65 63 74 20 63 61 6c itForConnect cal
0cb0: 6c 65 64 20 6f 6e 20 61 6c 72 65 61 64 79 20 69 led on already i
0cc0: 6e 69 74 69 61 6c 69 7a 65 64 20 63 68 61 6e 6e nitialized chann
0cd0: 65 6c 20 2d 2d 20 72 65 74 75 72 6e 69 6e 67 20 el -- returning
0ce0: 77 69 74 68 20 69 6d 6d 65 64 69 61 74 65 20 73 with immediate s
0cf0: 75 63 63 65 73 73 22 29 3b 0a 09 72 65 74 75 72 uccess");..retur
0d00: 6e 28 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 n(0);. }..
0d10: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 66 if (statePtr->f
0d20: 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f 48 lags & TLS_TCL_H
0d30: 41 4e 44 53 48 41 4b 45 5f 46 41 49 4c 45 44 29 ANDSHAKE_FAILED)
0d40: 20 7b 0a 09 2f 2a 0a 09 20 2a 20 44 69 66 66 65 {../*.. * Diffe
0d50: 72 65 6e 74 20 74 79 70 65 73 20 6f 66 20 6f 70 rent types of op
0d60: 65 72 61 74 69 6f 6e 73 20 68 61 76 65 20 64 69 erations have di
0d70: 66 66 65 72 65 6e 74 20 72 65 71 75 69 72 65 6d fferent requirem
0d80: 65 6e 74 73 0a 09 20 2a 20 53 53 4c 20 62 65 69 ents.. * SSL bei
0d90: 6e 67 20 65 73 74 61 62 6c 69 73 68 65 64 0a 09 ng established..
0da0: 20 2a 2f 0a 09 69 66 20 28 68 61 6e 64 73 68 61 */..if (handsha
0db0: 6b 65 46 61 69 6c 75 72 65 49 73 50 65 72 6d 61 keFailureIsPerma
0dc0: 6e 65 6e 74 29 20 7b 0a 09 20 20 20 20 64 70 72 nent) {.. dpr
0dd0: 69 6e 74 66 28 22 41 73 6b 65 64 20 74 6f 20 77 intf("Asked to w
0de0: 61 69 74 20 66 6f 72 20 61 20 54 4c 53 20 68 61 ait for a TLS ha
0df0: 6e 64 73 68 61 6b 65 20 74 68 61 74 20 68 61 73 ndshake that has
0e00: 20 61 6c 72 65 61 64 79 20 66 61 69 6c 65 64 2e already failed.
0e10: 20 20 52 65 74 75 72 6e 69 6e 67 20 66 61 74 61 Returning fata
0e20: 6c 20 65 72 72 6f 72 22 29 3b 0a 09 20 20 20 20 l error");..
0e30: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 *errorCodePtr =
0e40: 45 43 4f 4e 4e 41 42 4f 52 54 45 44 3b 0a 09 7d ECONNABORTED;..}
0e50: 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 64 70 72 else {.. dpr
0e60: 69 6e 74 66 28 22 41 73 6b 65 64 20 74 6f 20 77 intf("Asked to w
0e70: 61 69 74 20 66 6f 72 20 61 20 54 4c 53 20 68 61 ait for a TLS ha
0e80: 6e 64 73 68 61 6b 65 20 74 68 61 74 20 68 61 73 ndshake that has
0e90: 20 61 6c 72 65 61 64 79 20 66 61 69 6c 65 64 2e already failed.
0ea0: 20 20 52 65 74 75 72 6e 69 6e 67 20 73 6f 66 74 Returning soft
0eb0: 20 65 72 72 6f 72 22 29 3b 0a 09 20 20 20 20 2a error");.. *
0ec0: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 errorCodePtr = E
0ed0: 43 4f 4e 4e 52 45 53 45 54 3b 0a 09 7d 0a 09 54 CONNRESET;..}..T
0ee0: 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 ls_Error(statePt
0ef0: 72 2c 20 22 57 61 69 74 20 66 6f 72 20 66 61 69 r, "Wait for fai
0f00: 6c 65 64 20 68 61 6e 64 73 68 61 6b 65 22 29 3b led handshake");
0f10: 0a 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 20 20 ..return(-1);.
0f20: 20 20 7d 0a 0a 20 20 20 20 66 6f 72 20 28 3b 3b }.. for (;;
0f30: 29 20 7b 0a 09 45 52 52 5f 63 6c 65 61 72 5f 65 ) {..ERR_clear_e
0f40: 72 72 6f 72 28 29 3b 0a 0a 09 2f 2a 20 4e 6f 74 rror();.../* Not
0f50: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 79 65 74 initialized yet
0f60: 21 20 41 6c 73 6f 20 63 61 6c 6c 73 20 53 53 4c ! Also calls SSL
0f70: 5f 64 6f 5f 68 61 6e 64 73 68 61 6b 65 2e 20 2a _do_handshake. *
0f80: 2f 0a 09 69 66 20 28 73 74 61 74 65 50 74 72 2d /..if (statePtr-
0f90: 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c >flags & TLS_TCL
0fa0: 5f 53 45 52 56 45 52 29 20 7b 0a 09 20 20 20 20 _SERVER) {..
0fb0: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 69 6e 67 dprintf("Calling
0fc0: 20 53 53 4c 5f 61 63 63 65 70 74 28 29 22 29 3b SSL_accept()");
0fd0: 0a 09 20 20 20 20 65 72 72 20 3d 20 53 53 4c 5f .. err = SSL_
0fe0: 61 63 63 65 70 74 28 73 74 61 74 65 50 74 72 2d accept(statePtr-
0ff0: 3e 73 73 6c 29 3b 0a 09 7d 20 65 6c 73 65 20 7b >ssl);..} else {
1000: 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
1010: 61 6c 6c 69 6e 67 20 53 53 4c 5f 63 6f 6e 6e 65 alling SSL_conne
1020: 63 74 28 29 22 29 3b 0a 09 20 20 20 20 65 72 72 ct()");.. err
1030: 20 3d 20 53 53 4c 5f 63 6f 6e 6e 65 63 74 28 73 = SSL_connect(s
1040: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 tatePtr->ssl);..
1050: 7d 0a 0a 09 69 66 20 28 65 72 72 20 3e 20 30 29 }...if (err > 0)
1060: 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 {.. dprintf(
1070: 22 41 63 63 65 70 74 20 6f 72 20 63 6f 6e 6e 65 "Accept or conne
1080: 63 74 20 77 61 73 20 73 75 63 63 65 73 73 66 75 ct was successfu
1090: 6c 22 29 3b 0a 0a 09 20 20 20 20 65 72 72 20 3d l");... err =
10a0: 20 42 49 4f 5f 66 6c 75 73 68 28 73 74 61 74 65 BIO_flush(state
10b0: 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 20 20 20 20 Ptr->bio);..
10c0: 69 66 20 28 65 72 72 20 3c 3d 20 30 29 20 7b 0a if (err <= 0) {.
10d0: 09 09 64 70 72 69 6e 74 66 28 22 46 6c 75 73 68 ..dprintf("Flush
10e0: 69 6e 67 20 74 68 65 20 6c 6f 77 65 72 20 6c 61 ing the lower la
10f0: 79 65 72 73 20 66 61 69 6c 65 64 2c 20 74 68 69 yers failed, thi
1100: 73 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20 s will probably
1110: 74 65 72 6d 69 6e 61 74 65 20 74 68 69 73 20 73 terminate this s
1120: 65 73 73 69 6f 6e 22 29 3b 0a 09 20 20 20 20 7d ession");.. }
1130: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 ..} else {..
1140: 64 70 72 69 6e 74 66 28 22 41 63 63 65 70 74 20 dprintf("Accept
1150: 6f 72 20 63 6f 6e 6e 65 63 74 20 66 61 69 6c 65 or connect faile
1160: 64 22 29 3b 0a 09 7d 0a 0a 09 72 63 20 3d 20 53 d");..}...rc = S
1170: 53 4c 5f 67 65 74 5f 65 72 72 6f 72 28 73 74 61 SL_get_error(sta
1180: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 65 72 72 29 tePtr->ssl, err)
1190: 3b 0a 09 62 61 63 6b 69 6e 67 45 72 72 6f 72 20 ;..backingError
11a0: 3d 20 45 52 52 5f 67 65 74 5f 65 72 72 6f 72 28 = ERR_get_error(
11b0: 29 3b 0a 09 69 66 20 28 72 63 20 21 3d 20 53 53 );..if (rc != SS
11c0: 4c 5f 45 52 52 4f 52 5f 4e 4f 4e 45 29 20 7b 0a L_ERROR_NONE) {.
11d0: 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 47 6f . dprintf("Go
11e0: 74 20 65 72 72 6f 72 3a 20 25 69 20 28 72 63 20 t error: %i (rc
11f0: 3d 20 25 69 29 22 2c 20 65 72 72 2c 20 72 63 29 = %i)", err, rc)
1200: 3b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
1210: 47 6f 74 20 65 72 72 6f 72 3a 20 25 73 22 2c 20 Got error: %s",
1220: 45 52 52 5f 72 65 61 73 6f 6e 5f 65 72 72 6f 72 ERR_reason_error
1230: 5f 73 74 72 69 6e 67 28 62 61 63 6b 69 6e 67 45 _string(backingE
1240: 72 72 6f 72 29 29 3b 0a 09 7d 0a 0a 09 62 69 6f rror));..}...bio
1250: 53 68 6f 75 6c 64 52 65 74 72 79 20 3d 20 30 3b ShouldRetry = 0;
1260: 0a 09 69 66 20 28 65 72 72 20 3c 3d 20 30 29 20 ..if (err <= 0)
1270: 7b 0a 09 20 20 20 20 69 66 20 28 72 63 20 3d 3d {.. if (rc ==
1280: 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f SSL_ERROR_WANT_
1290: 43 4f 4e 4e 45 43 54 20 7c 7c 20 72 63 20 3d 3d CONNECT || rc ==
12a0: 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f SSL_ERROR_WANT_
12b0: 41 43 43 45 50 54 20 7c 7c 20 72 63 20 3d 3d 20 ACCEPT || rc ==
12c0: 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 52 SSL_ERROR_WANT_R
12d0: 45 41 44 20 7c 7c 20 72 63 20 3d 3d 20 53 53 4c EAD || rc == SSL
12e0: 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 57 52 49 54 _ERROR_WANT_WRIT
12f0: 45 29 20 7b 0a 09 09 62 69 6f 53 68 6f 75 6c 64 E) {...bioShould
1300: 52 65 74 72 79 20 3d 20 31 3b 0a 09 20 20 20 20 Retry = 1;..
1310: 7d 20 65 6c 73 65 20 69 66 20 28 42 49 4f 5f 73 } else if (BIO_s
1320: 68 6f 75 6c 64 5f 72 65 74 72 79 28 73 74 61 74 hould_retry(stat
1330: 65 50 74 72 2d 3e 62 69 6f 29 29 20 7b 0a 09 09 ePtr->bio)) {...
1340: 62 69 6f 53 68 6f 75 6c 64 52 65 74 72 79 20 3d bioShouldRetry =
1350: 20 31 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 1;.. } else
1360: 69 66 20 28 72 63 20 3d 3d 20 53 53 4c 5f 45 52 if (rc == SSL_ER
1370: 52 4f 52 5f 53 59 53 43 41 4c 4c 20 26 26 20 54 ROR_SYSCALL && T
1380: 63 6c 5f 47 65 74 45 72 72 6e 6f 28 29 20 3d 3d cl_GetErrno() ==
1390: 20 45 41 47 41 49 4e 29 20 7b 0a 09 09 62 69 6f EAGAIN) {...bio
13a0: 53 68 6f 75 6c 64 52 65 74 72 79 20 3d 20 31 3b ShouldRetry = 1;
13b0: 0a 09 20 20 20 20 7d 0a 09 7d 20 65 6c 73 65 20 .. }..} else
13c0: 7b 0a 09 20 20 20 20 69 66 20 28 21 53 53 4c 5f {.. if (!SSL_
13d0: 69 73 5f 69 6e 69 74 5f 66 69 6e 69 73 68 65 64 is_init_finished
13e0: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 29 (statePtr->ssl))
13f0: 20 7b 0a 09 09 62 69 6f 53 68 6f 75 6c 64 52 65 {...bioShouldRe
1400: 74 72 79 20 3d 20 31 3b 0a 09 20 20 20 20 7d 0a try = 1;.. }.
1410: 09 7d 0a 0a 09 69 66 20 28 62 69 6f 53 68 6f 75 .}...if (bioShou
1420: 6c 64 52 65 74 72 79 29 20 7b 0a 09 20 20 20 20 ldRetry) {..
1430: 64 70 72 69 6e 74 66 28 22 54 68 65 20 49 2f 4f dprintf("The I/O
1440: 20 64 69 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 did not complet
1450: 65 20 2d 2d 20 62 75 74 20 77 65 20 73 68 6f 75 e -- but we shou
1460: 6c 64 20 74 72 79 20 69 74 20 61 67 61 69 6e 22 ld try it again"
1470: 29 3b 0a 0a 09 20 20 20 20 69 66 20 28 73 74 61 );... if (sta
1480: 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 tePtr->flags & T
1490: 4c 53 5f 54 43 4c 5f 41 53 59 4e 43 29 20 7b 0a LS_TCL_ASYNC) {.
14a0: 09 09 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 ..dprintf("Retur
14b0: 6e 69 6e 67 20 45 41 47 41 49 4e 20 73 6f 20 74 ning EAGAIN so t
14c0: 68 61 74 20 69 74 20 63 61 6e 20 62 65 20 72 65 hat it can be re
14d0: 74 72 69 65 64 20 6c 61 74 65 72 22 29 3b 0a 09 tried later");..
14e0: 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d .*errorCodePtr =
14f0: 20 45 41 47 41 49 4e 3b 0a 09 09 54 6c 73 5f 45 EAGAIN;...Tls_E
1500: 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20 22 rror(statePtr, "
1510: 48 61 6e 64 73 68 61 6b 65 20 6e 6f 74 20 63 6f Handshake not co
1520: 6d 70 6c 65 74 65 2c 20 77 69 6c 6c 20 72 65 74 mplete, will ret
1530: 72 79 20 6c 61 74 65 72 22 29 3b 0a 09 09 72 65 ry later");...re
1540: 74 75 72 6e 28 2d 31 29 3b 0a 09 20 20 20 20 7d turn(-1);.. }
1550: 20 65 6c 73 65 20 7b 0a 09 09 64 70 72 69 6e 74 else {...dprint
1560: 66 28 22 44 6f 69 6e 67 20 73 6f 20 6e 6f 77 22 f("Doing so now"
1570: 29 3b 0a 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 );...continue;..
1580: 20 20 20 20 7d 0a 09 7d 0a 0a 09 64 70 72 69 6e }..}...dprin
1590: 74 66 28 22 57 65 20 68 61 76 65 20 65 69 74 68 tf("We have eith
15a0: 65 72 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 73 er completely es
15b0: 74 61 62 6c 69 73 68 65 64 20 74 68 65 20 73 65 tablished the se
15c0: 73 73 69 6f 6e 20 6f 72 20 63 6f 6d 70 6c 65 74 ssion or complet
15d0: 65 6c 79 20 66 61 69 6c 65 64 20 69 74 20 2d 2d ely failed it --
15e0: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 6f 72 there is no mor
15f0: 65 20 6e 65 65 64 20 74 6f 20 65 76 65 72 20 72 e need to ever r
1600: 65 74 72 79 20 69 74 20 74 68 6f 75 67 68 22 29 etry it though")
1610: 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a ;..break;. }.
1620: 0a 20 20 20 20 73 77 69 74 63 68 20 28 72 63 29 . switch (rc)
1630: 20 7b 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52 {..case SSL_ERR
1640: 4f 52 5f 4e 4f 4e 45 3a 0a 09 20 20 20 20 2f 2a OR_NONE:.. /*
1650: 20 54 68 65 20 54 4c 53 2f 53 53 4c 20 49 2f 4f The TLS/SSL I/O
1660: 20 6f 70 65 72 61 74 69 6f 6e 20 63 6f 6d 70 6c operation compl
1670: 65 74 65 64 20 2a 2f 0a 09 20 20 20 20 64 70 72 eted */.. dpr
1680: 69 6e 74 66 28 22 54 68 65 20 63 6f 6e 6e 65 63 intf("The connec
1690: 74 69 6f 6e 20 69 73 20 67 6f 6f 64 22 29 3b 0a tion is good");.
16a0: 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 . *errorCodeP
16b0: 74 72 20 3d 20 30 3b 0a 09 20 20 20 20 62 72 65 tr = 0;.. bre
16c0: 61 6b 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45 ak;...case SSL_E
16d0: 52 52 4f 52 5f 5a 45 52 4f 5f 52 45 54 55 52 4e RROR_ZERO_RETURN
16e0: 3a 0a 09 20 20 20 20 2f 2a 20 54 68 65 20 54 4c :.. /* The TL
16f0: 53 2f 53 53 4c 20 70 65 65 72 20 68 61 73 20 63 S/SSL peer has c
1700: 6c 6f 73 65 64 20 74 68 65 20 63 6f 6e 6e 65 63 losed the connec
1710: 74 69 6f 6e 20 66 6f 72 20 77 72 69 74 69 6e 67 tion for writing
1720: 20 62 79 20 73 65 6e 64 69 6e 67 20 74 68 65 20 by sending the
1730: 63 6c 6f 73 65 5f 6e 6f 74 69 66 79 20 61 6c 65 close_notify ale
1740: 72 74 20 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e rt */.. dprin
1750: 74 66 28 22 53 53 4c 5f 45 52 52 4f 52 5f 5a 45 tf("SSL_ERROR_ZE
1760: 52 4f 5f 52 45 54 55 52 4e 3a 20 43 6f 6e 6e 65 RO_RETURN: Conne
1770: 63 74 20 72 65 74 75 72 6e 65 64 20 61 6e 20 69 ct returned an i
1780: 6e 76 61 6c 69 64 20 76 61 6c 75 65 2e 2e 2e 22 nvalid value..."
1790: 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f );.. *errorCo
17a0: 64 65 50 74 72 20 3d 20 45 49 4e 56 41 4c 3b 0a dePtr = EINVAL;.
17b0: 09 20 20 20 20 54 6c 73 5f 45 72 72 6f 72 28 73 . Tls_Error(s
17c0: 74 61 74 65 50 74 72 2c 20 22 50 65 65 72 20 68 tatePtr, "Peer h
17d0: 61 73 20 63 6c 6f 73 65 64 20 74 68 65 20 63 6f as closed the co
17e0: 6e 6e 65 63 74 69 6f 6e 20 66 6f 72 20 77 72 69 nnection for wri
17f0: 74 69 6e 67 20 62 79 20 73 65 6e 64 69 6e 67 20 ting by sending
1800: 74 68 65 20 63 6c 6f 73 65 5f 6e 6f 74 69 66 79 the close_notify
1810: 20 61 6c 65 72 74 22 29 3b 0a 09 20 20 20 20 72 alert");.. r
1820: 65 74 75 72 6e 28 2d 31 29 3b 0a 0a 09 63 61 73 eturn(-1);...cas
1830: 65 20 53 53 4c 5f 45 52 52 4f 52 5f 53 59 53 43 e SSL_ERROR_SYSC
1840: 41 4c 4c 3a 0a 09 20 20 20 20 2f 2a 20 53 6f 6d ALL:.. /* Som
1850: 65 20 6e 6f 6e 2d 72 65 63 6f 76 65 72 61 62 6c e non-recoverabl
1860: 65 2c 20 66 61 74 61 6c 20 49 2f 4f 20 65 72 72 e, fatal I/O err
1870: 6f 72 20 6f 63 63 75 72 72 65 64 20 2a 2f 0a 09 or occurred */..
1880: 20 20 20 20 64 70 72 69 6e 74 66 28 22 53 53 4c dprintf("SSL
1890: 5f 45 52 52 4f 52 5f 53 59 53 43 41 4c 4c 22 29 _ERROR_SYSCALL")
18a0: 3b 0a 0a 09 20 20 20 20 69 66 20 28 62 61 63 6b ;... if (back
18b0: 69 6e 67 45 72 72 6f 72 20 3d 3d 20 30 20 26 26 ingError == 0 &&
18c0: 20 65 72 72 20 3d 3d 20 30 29 20 7b 0a 09 09 64 err == 0) {...d
18d0: 70 72 69 6e 74 66 28 22 45 4f 46 20 72 65 61 63 printf("EOF reac
18e0: 68 65 64 22 29 0a 09 09 2a 65 72 72 6f 72 43 6f hed")...*errorCo
18f0: 64 65 50 74 72 20 3d 20 45 43 4f 4e 4e 52 45 53 dePtr = ECONNRES
1900: 45 54 3b 0a 09 09 54 6c 73 5f 45 72 72 6f 72 28 ET;...Tls_Error(
1910: 73 74 61 74 65 50 74 72 2c 20 22 28 75 6e 65 78 statePtr, "(unex
1920: 70 65 63 74 65 64 29 20 45 4f 46 20 72 65 61 63 pected) EOF reac
1930: 68 65 64 22 29 3b 0a 0a 09 20 20 20 20 7d 20 65 hed");... } e
1940: 6c 73 65 20 69 66 20 28 62 61 63 6b 69 6e 67 45 lse if (backingE
1950: 72 72 6f 72 20 3d 3d 20 30 20 26 26 20 65 72 72 rror == 0 && err
1960: 20 3d 3d 20 2d 31 29 20 7b 0a 09 09 64 70 72 69 == -1) {...dpri
1970: 6e 74 66 28 22 49 2f 4f 20 65 72 72 6f 72 20 6f ntf("I/O error o
1980: 63 63 75 72 72 65 64 20 28 65 72 72 6e 6f 20 3d ccurred (errno =
1990: 20 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 %lu)", (unsigne
19a0: 64 20 6c 6f 6e 67 29 20 54 63 6c 5f 47 65 74 45 d long) Tcl_GetE
19b0: 72 72 6e 6f 28 29 29 3b 0a 09 09 2a 65 72 72 6f rrno());...*erro
19c0: 72 43 6f 64 65 50 74 72 20 3d 20 54 63 6c 5f 47 rCodePtr = Tcl_G
19d0: 65 74 45 72 72 6e 6f 28 29 3b 0a 09 09 69 66 20 etErrno();...if
19e0: 28 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d (*errorCodePtr =
19f0: 3d 20 45 43 4f 4e 4e 52 45 53 45 54 29 20 7b 0a = ECONNRESET) {.
1a00: 09 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 .. *errorCode
1a10: 50 74 72 20 3d 20 45 43 4f 4e 4e 41 42 4f 52 54 Ptr = ECONNABORT
1a20: 45 44 3b 0a 09 09 7d 0a 09 09 54 6c 73 5f 45 72 ED;...}...Tls_Er
1a30: 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20 28 63 ror(statePtr, (c
1a40: 68 61 72 20 2a 29 20 54 63 6c 5f 45 72 72 6e 6f har *) Tcl_Errno
1a50: 4d 73 67 28 2a 65 72 72 6f 72 43 6f 64 65 50 74 Msg(*errorCodePt
1a60: 72 29 29 3b 0a 0a 09 20 20 20 20 7d 20 65 6c 73 r));... } els
1a70: 65 20 7b 0a 09 09 64 70 72 69 6e 74 66 28 22 49 e {...dprintf("I
1a80: 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 /O error occurre
1a90: 64 20 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 20 d (backingError
1aa0: 3d 20 25 6c 75 29 22 2c 20 62 61 63 6b 69 6e 67 = %lu)", backing
1ab0: 45 72 72 6f 72 29 3b 0a 09 09 2a 65 72 72 6f 72 Error);...*error
1ac0: 43 6f 64 65 50 74 72 20 3d 20 54 63 6c 5f 47 65 CodePtr = Tcl_Ge
1ad0: 74 45 72 72 6e 6f 28 29 3b 0a 09 09 69 66 20 28 tErrno();...if (
1ae0: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 3d *errorCodePtr ==
1af0: 20 45 43 4f 4e 4e 52 45 53 45 54 29 20 7b 0a 09 ECONNRESET) {..
1b00: 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 . *errorCodeP
1b10: 74 72 20 3d 20 45 43 4f 4e 4e 41 42 4f 52 54 45 tr = ECONNABORTE
1b20: 44 3b 0a 09 09 7d 0a 09 09 54 6c 73 5f 45 72 72 D;...}...Tls_Err
1b30: 6f 72 28 73 74 61 74 65 50 74 72 2c 20 28 63 68 or(statePtr, (ch
1b40: 61 72 20 2a 29 20 45 52 52 5f 72 65 61 73 6f 6e ar *) ERR_reason
1b50: 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 62 61 _error_string(ba
1b60: 63 6b 69 6e 67 45 72 72 6f 72 29 29 3b 0a 09 20 ckingError));..
1b70: 20 20 20 7d 0a 0a 09 20 20 20 20 73 74 61 74 65 }... state
1b80: 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c Ptr->flags |= TL
1b90: 53 5f 54 43 4c 5f 48 41 4e 44 53 48 41 4b 45 5f S_TCL_HANDSHAKE_
1ba0: 46 41 49 4c 45 44 3b 0a 09 20 20 20 20 72 65 74 FAILED;.. ret
1bb0: 75 72 6e 28 2d 31 29 3b 0a 0a 09 63 61 73 65 20 urn(-1);...case
1bc0: 53 53 4c 5f 45 52 52 4f 52 5f 53 53 4c 3a 0a 09 SSL_ERROR_SSL:..
1bd0: 20 20 20 20 2f 2a 20 41 20 6e 6f 6e 2d 72 65 63 /* A non-rec
1be0: 6f 76 65 72 61 62 6c 65 2c 20 66 61 74 61 6c 20 overable, fatal
1bf0: 65 72 72 6f 72 20 69 6e 20 74 68 65 20 53 53 4c error in the SSL
1c00: 20 6c 69 62 72 61 72 79 20 6f 63 63 75 72 72 65 library occurre
1c10: 64 2c 20 75 73 75 61 6c 6c 79 20 61 20 70 72 6f d, usually a pro
1c20: 74 6f 63 6f 6c 20 65 72 72 6f 72 20 2a 2f 0a 09 tocol error */..
1c30: 20 20 20 20 64 70 72 69 6e 74 66 28 22 53 53 4c dprintf("SSL
1c40: 5f 45 52 52 4f 52 5f 53 53 4c 3a 20 47 6f 74 20 _ERROR_SSL: Got
1c50: 70 65 72 6d 61 6e 65 6e 74 20 66 61 74 61 6c 20 permanent fatal
1c60: 53 53 4c 20 65 72 72 6f 72 2c 20 61 62 6f 72 74 SSL error, abort
1c70: 69 6e 67 20 69 6d 6d 65 64 69 61 74 65 6c 79 22 ing immediately"
1c80: 29 3b 0a 09 20 20 20 20 69 66 20 28 53 53 4c 5f );.. if (SSL_
1c90: 67 65 74 5f 76 65 72 69 66 79 5f 72 65 73 75 6c get_verify_resul
1ca0: 74 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 t(statePtr->ssl)
1cb0: 20 21 3d 20 58 35 30 39 5f 56 5f 4f 4b 29 20 7b != X509_V_OK) {
1cc0: 0a 09 09 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 ...Tls_Error(sta
1cd0: 74 65 50 74 72 2c 20 28 63 68 61 72 20 2a 29 20 tePtr, (char *)
1ce0: 58 35 30 39 5f 76 65 72 69 66 79 5f 63 65 72 74 X509_verify_cert
1cf0: 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 53 53 _error_string(SS
1d00: 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 72 65 73 L_get_verify_res
1d10: 75 6c 74 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ult(statePtr->ss
1d20: 6c 29 29 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 l)));.. }..
1d30: 20 20 69 66 20 28 62 61 63 6b 69 6e 67 45 72 72 if (backingErr
1d40: 6f 72 20 21 3d 20 30 29 20 7b 0a 09 09 54 6c 73 or != 0) {...Tls
1d50: 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c _Error(statePtr,
1d60: 20 28 63 68 61 72 20 2a 29 20 45 52 52 5f 72 65 (char *) ERR_re
1d70: 61 73 6f 6e 5f 65 72 72 6f 72 5f 73 74 72 69 6e ason_error_strin
1d80: 67 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 29 29 g(backingError))
1d90: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 73 74 ;.. }.. st
1da0: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d atePtr->flags |=
1db0: 20 54 4c 53 5f 54 43 4c 5f 48 41 4e 44 53 48 41 TLS_TCL_HANDSHA
1dc0: 4b 45 5f 46 41 49 4c 45 44 3b 0a 09 20 20 20 20 KE_FAILED;..
1dd0: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 *errorCodePtr =
1de0: 45 43 4f 4e 4e 41 42 4f 52 54 45 44 3b 0a 09 20 ECONNABORTED;..
1df0: 20 20 20 72 65 74 75 72 6e 28 2d 31 29 3b 0a 0a return(-1);..
1e00: 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f .case SSL_ERROR_
1e10: 57 41 4e 54 5f 52 45 41 44 3a 0a 09 63 61 73 65 WANT_READ:..case
1e20: 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f SSL_ERROR_WANT_
1e30: 57 52 49 54 45 3a 0a 09 63 61 73 65 20 53 53 4c WRITE:..case SSL
1e40: 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 58 35 30 39 _ERROR_WANT_X509
1e50: 5f 4c 4f 4f 4b 55 50 3a 0a 09 63 61 73 65 20 53 _LOOKUP:..case S
1e60: 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 43 4f SL_ERROR_WANT_CO
1e70: 4e 4e 45 43 54 3a 0a 09 63 61 73 65 20 53 53 4c NNECT:..case SSL
1e80: 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 41 43 43 45 _ERROR_WANT_ACCE
1e90: 50 54 3a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 PT:..case SSL_ER
1ea0: 52 4f 52 5f 57 41 4e 54 5f 41 53 59 4e 43 3a 0a ROR_WANT_ASYNC:.
1eb0: 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f .case SSL_ERROR_
1ec0: 57 41 4e 54 5f 41 53 59 4e 43 5f 4a 4f 42 3a 0a WANT_ASYNC_JOB:.
1ed0: 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f .case SSL_ERROR_
1ee0: 57 41 4e 54 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c WANT_CLIENT_HELL
1ef0: 4f 5f 43 42 3a 0a 09 64 65 66 61 75 6c 74 3a 0a O_CB:..default:.
1f00: 09 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 65 72 . /* The oper
1f10: 61 74 69 6f 6e 20 64 69 64 20 6e 6f 74 20 63 6f ation did not co
1f20: 6d 70 6c 65 74 65 20 61 6e 64 20 73 68 6f 75 6c mplete and shoul
1f30: 64 20 62 65 20 72 65 74 72 69 65 64 20 6c 61 74 d be retried lat
1f40: 65 72 2e 20 2a 2f 0a 09 20 20 20 20 64 70 72 69 er. */.. dpri
1f50: 6e 74 66 28 22 4f 70 65 72 61 74 69 6f 6e 20 64 ntf("Operation d
1f60: 69 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 2c id not complete,
1f70: 20 63 61 6c 6c 20 66 75 6e 63 74 69 6f 6e 20 61 call function a
1f80: 67 61 69 6e 20 6c 61 74 65 72 3a 20 25 69 22 2c gain later: %i",
1f90: 20 72 63 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f rc);.. *erro
1fa0: 72 43 6f 64 65 50 74 72 20 3d 20 45 41 47 41 49 rCodePtr = EAGAI
1fb0: 4e 3b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 N;.. dprintf(
1fc0: 22 45 52 52 28 25 64 2c 20 25 64 29 20 22 2c 20 "ERR(%d, %d) ",
1fd0: 72 63 2c 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 rc, *errorCodePt
1fe0: 72 29 3b 0a 09 20 20 20 20 54 6c 73 5f 45 72 72 r);.. Tls_Err
1ff0: 6f 72 28 73 74 61 74 65 50 74 72 2c 20 22 4f 70 or(statePtr, "Op
2000: 65 72 61 74 69 6f 6e 20 64 69 64 20 6e 6f 74 20 eration did not
2010: 63 6f 6d 70 6c 65 74 65 2c 20 63 61 6c 6c 20 66 complete, call f
2020: 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 20 6c 61 unction again la
2030: 74 65 72 22 29 3b 0a 09 20 20 20 20 72 65 74 75 ter");.. retu
2040: 72 6e 28 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 rn(-1);. }..
2050: 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 6d 6f dprintf("Remo
2060: 76 69 6e 67 20 74 68 65 20 5c 22 54 4c 53 5f 54 ving the \"TLS_T
2070: 43 4c 5f 49 4e 49 54 5c 22 20 66 6c 61 67 20 73 CL_INIT\" flag s
2080: 69 6e 63 65 20 77 65 20 68 61 76 65 20 63 6f 6d ince we have com
2090: 70 6c 65 74 65 64 20 74 68 65 20 68 61 6e 64 73 pleted the hands
20a0: 68 61 6b 65 22 29 3b 0a 20 20 20 20 73 74 61 74 hake");. stat
20b0: 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 3d 20 7e ePtr->flags &= ~
20c0: 54 4c 53 5f 54 43 4c 5f 49 4e 49 54 3b 0a 0a 20 TLS_TCL_INIT;..
20d0: 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 75 dprintf("Retu
20e0: 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73 rning in success
20f0: 22 29 3b 0a 20 20 20 20 2a 65 72 72 6f 72 43 6f ");. *errorCo
2100: 64 65 50 74 72 20 3d 20 30 3b 0a 20 20 20 20 72 dePtr = 0;. r
2110: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 20 eturn 0;.}../*.
2120: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
2130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2160: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 49 6e ----. *. * TlsIn
2170: 70 75 74 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a putProc --. *. *
2180: 20 20 20 20 54 68 69 73 20 70 72 6f 63 65 64 75 This procedu
2190: 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 re is invoked by
21a0: 20 74 68 65 20 67 65 6e 65 72 69 63 20 49 4f 20 the generic IO
21b0: 6c 65 76 65 6c 0a 20 2a 20 20 20 20 20 20 20 74 level. * t
21c0: 6f 20 72 65 61 64 20 69 6e 70 75 74 20 66 72 6f o read input fro
21d0: 6d 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 m a SSL socket b
21e0: 61 73 65 64 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a ased channel.. *
21f0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 20 . * Results:. *
2200: 20 20 20 52 65 74 75 72 6e 73 20 74 68 65 20 6e Returns the n
2210: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 umber of bytes r
2220: 65 61 64 20 6f 72 20 2d 31 20 6f 6e 20 65 72 72 ead or -1 on err
2230: 6f 72 2e 20 53 65 74 73 20 65 72 72 6f 72 43 6f or. Sets errorCo
2240: 64 65 50 74 72 0a 20 2a 20 20 20 20 74 6f 20 61 dePtr. * to a
2250: 20 50 4f 53 49 58 20 65 72 72 6f 72 20 63 6f 64 POSIX error cod
2260: 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 e if an error oc
2270: 63 75 72 72 65 64 2c 20 6f 72 20 30 20 69 66 20 curred, or 0 if
2280: 6e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 none.. *. * Side
2290: 20 65 66 66 65 63 74 73 3a 0a 20 2a 20 20 20 20 effects:. *
22a0: 52 65 61 64 73 20 69 6e 70 75 74 20 66 72 6f 6d Reads input from
22b0: 20 74 68 65 20 69 6e 70 75 74 20 64 65 76 69 63 the input devic
22c0: 65 20 6f 66 20 74 68 65 20 63 68 61 6e 6e 65 6c e of the channel
22d0: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d .. *. *---------
22e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
22f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a ----------. */..
2320: 73 74 61 74 69 63 20 69 6e 74 20 54 6c 73 49 6e static int TlsIn
2330: 70 75 74 50 72 6f 63 28 0a 20 20 20 20 76 6f 69 putProc(. voi
2340: 64 20 2a 69 6e 73 74 61 6e 63 65 44 61 74 61 2c d *instanceData,
2350: 0a 20 20 20 20 63 68 61 72 20 2a 62 75 66 2c 0a . char *buf,.
2360: 20 20 20 20 69 6e 74 20 62 75 66 53 69 7a 65 2c int bufSize,
2370: 0a 20 20 20 20 69 6e 74 20 2a 65 72 72 6f 72 43 . int *errorC
2380: 6f 64 65 50 74 72 29 0a 7b 0a 20 20 20 20 75 6e odePtr).{. un
2390: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 62 61 63 6b signed long back
23a0: 69 6e 67 45 72 72 6f 72 3b 0a 20 20 20 20 53 74 ingError;. St
23b0: 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 ate *statePtr =
23c0: 28 53 74 61 74 65 20 2a 29 20 69 6e 73 74 61 6e (State *) instan
23d0: 63 65 44 61 74 61 3b 0a 20 20 20 20 69 6e 74 20 ceData;. int
23e0: 62 79 74 65 73 52 65 61 64 3b 0a 20 20 20 20 69 bytesRead;. i
23f0: 6e 74 20 74 6c 73 43 6f 6e 6e 65 63 74 3b 0a 20 nt tlsConnect;.
2400: 20 20 20 69 6e 74 20 65 72 72 3b 0a 0a 20 20 20 int err;..
2410: 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d *errorCodePtr =
2420: 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 0;.. dprintf
2430: 28 22 42 49 4f 5f 72 65 61 64 28 25 64 29 22 2c ("BIO_read(%d)",
2440: 20 62 75 66 53 69 7a 65 29 3b 0a 0a 20 20 20 20 bufSize);..
2450: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 66 6c if (statePtr->fl
2460: 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f 43 41 ags & TLS_TCL_CA
2470: 4c 4c 42 41 43 4b 29 20 7b 0a 09 2f 2a 20 64 6f LLBACK) {../* do
2480: 6e 27 74 20 70 72 6f 63 65 73 73 20 61 6e 79 20 n't process any
2490: 62 79 74 65 73 20 77 68 69 6c 65 20 76 65 72 69 bytes while veri
24a0: 66 79 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 72 fy callback is r
24b0: 75 6e 6e 69 6e 67 20 2a 2f 0a 09 64 70 72 69 6e unning */..dprin
24c0: 74 66 28 22 43 61 6c 6c 62 61 63 6b 20 69 73 20 tf("Callback is
24d0: 72 75 6e 6e 69 6e 67 2c 20 72 65 61 64 69 6e 67 running, reading
24e0: 20 30 20 62 79 74 65 73 22 29 3b 0a 09 72 65 74 0 bytes");..ret
24f0: 75 72 6e 28 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 urn(0);. }..
2500: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
2510: 69 6e 67 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 ing Tls_WaitForC
2520: 6f 6e 6e 65 63 74 22 29 3b 0a 20 20 20 20 74 6c onnect");. tl
2530: 73 43 6f 6e 6e 65 63 74 20 3d 20 54 6c 73 5f 57 sConnect = Tls_W
2540: 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 28 73 74 aitForConnect(st
2550: 61 74 65 50 74 72 2c 20 65 72 72 6f 72 43 6f 64 atePtr, errorCod
2560: 65 50 74 72 2c 20 30 29 3b 0a 20 20 20 20 69 66 ePtr, 0);. if
2570: 20 28 74 6c 73 43 6f 6e 6e 65 63 74 20 3c 20 30 (tlsConnect < 0
2580: 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 47 6f ) {..dprintf("Go
2590: 74 20 61 6e 20 65 72 72 6f 72 20 77 61 69 74 69 t an error waiti
25a0: 6e 67 20 74 6f 20 63 6f 6e 6e 65 63 74 20 28 74 ng to connect (t
25b0: 6c 73 43 6f 6e 6e 65 63 74 20 3d 20 25 69 2c 20 lsConnect = %i,
25c0: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 *errorCodePtr =
25d0: 25 69 29 22 2c 20 74 6c 73 43 6f 6e 6e 65 63 74 %i)", tlsConnect
25e0: 2c 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29 , *errorCodePtr)
25f0: 3b 0a 09 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 ;..Tls_Error(sta
2600: 74 65 50 74 72 2c 20 73 74 72 65 72 72 6f 72 28 tePtr, strerror(
2610: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29 29 3b *errorCodePtr));
2620: 0a 0a 09 62 79 74 65 73 52 65 61 64 20 3d 20 2d ...bytesRead = -
2630: 31 3b 0a 09 69 66 20 28 2a 65 72 72 6f 72 43 6f 1;..if (*errorCo
2640: 64 65 50 74 72 20 3d 3d 20 45 43 4f 4e 4e 52 45 dePtr == ECONNRE
2650: 53 45 54 29 20 7b 0a 09 20 20 20 20 64 70 72 69 SET) {.. dpri
2660: 6e 74 66 28 22 47 6f 74 20 63 6f 6e 6e 65 63 74 ntf("Got connect
2670: 69 6f 6e 20 72 65 73 65 74 22 29 3b 0a 09 20 20 ion reset");..
2680: 20 20 2f 2a 20 53 6f 66 74 20 45 4f 46 20 2a 2f /* Soft EOF */
2690: 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 .. *errorCode
26a0: 50 74 72 20 3d 20 30 3b 0a 09 20 20 20 20 62 79 Ptr = 0;.. by
26b0: 74 65 73 52 65 61 64 20 3d 20 30 3b 0a 09 7d 0a tesRead = 0;..}.
26c0: 09 72 65 74 75 72 6e 28 62 79 74 65 73 52 65 61 .return(bytesRea
26d0: 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f d);. }.. /
26e0: 2a 0a 20 20 20 20 20 2a 20 57 65 20 6e 65 65 64 *. * We need
26f0: 20 74 6f 20 63 6c 65 61 72 20 74 68 65 20 53 53 to clear the SS
2700: 4c 20 65 72 72 6f 72 20 73 74 61 63 6b 20 6e 6f L error stack no
2710: 77 20 62 65 63 61 75 73 65 20 77 65 20 73 6f 6d w because we som
2720: 65 74 69 6d 65 73 20 72 65 61 63 68 0a 20 20 20 etimes reach.
2730: 20 20 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f * this functio
2740: 6e 20 77 69 74 68 20 6c 65 66 74 6f 76 65 72 20 n with leftover
2750: 65 72 72 6f 72 73 20 69 6e 20 74 68 65 20 73 74 errors in the st
2760: 61 63 6b 2e 20 20 49 66 20 42 49 4f 5f 72 65 61 ack. If BIO_rea
2770: 64 0a 20 20 20 20 20 2a 20 72 65 74 75 72 6e 73 d. * returns
2780: 20 2d 31 20 61 6e 64 20 69 6e 74 65 6e 64 73 20 -1 and intends
2790: 45 41 47 41 49 4e 2c 20 74 68 65 72 65 20 69 73 EAGAIN, there is
27a0: 20 61 20 6c 65 66 74 6f 76 65 72 20 65 72 72 6f a leftover erro
27b0: 72 2c 20 69 74 20 77 69 6c 6c 20 62 65 0a 20 20 r, it will be.
27c0: 20 20 20 2a 20 6d 69 73 63 6f 6e 73 74 72 75 65 * misconstrue
27d0: 64 20 61 73 20 61 6e 20 65 72 72 6f 72 2c 20 6e d as an error, n
27e0: 6f 74 20 45 41 47 41 49 4e 2e 0a 20 20 20 20 20 ot EAGAIN..
27f0: 2a 0a 20 20 20 20 20 2a 20 41 6c 74 65 72 6e 61 *. * Alterna
2800: 74 69 76 65 6c 79 2c 20 77 65 20 6d 61 79 20 77 tively, we may w
2810: 61 6e 74 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 ant to handle th
2820: 65 20 3c 30 20 72 65 74 75 72 6e 20 63 6f 64 65 e <0 return code
2830: 73 20 66 72 6f 6d 0a 20 20 20 20 20 2a 20 42 49 s from. * BI
2840: 4f 5f 72 65 61 64 20 73 70 65 63 69 61 6c 6c 79 O_read specially
2850: 20 28 61 73 20 61 64 76 69 73 65 64 20 69 6e 20 (as advised in
2860: 74 68 65 20 52 53 41 20 64 6f 63 73 29 2e 20 20 the RSA docs).
2870: 54 4c 53 27 73 20 6c 6f 77 65 72 20 6c 65 76 65 TLS's lower leve
2880: 6c 20 42 49 4f 0a 20 20 20 20 20 2a 20 66 75 6e l BIO. * fun
2890: 63 74 69 6f 6e 73 20 70 6c 61 79 20 77 69 74 68 ctions play with
28a0: 20 74 68 65 20 72 65 74 72 79 20 66 6c 61 67 73 the retry flags
28b0: 20 74 68 6f 75 67 68 2c 20 61 6e 64 20 74 68 69 though, and thi
28c0: 73 20 73 65 65 6d 73 20 74 6f 20 77 6f 72 6b 0a s seems to work.
28d0: 20 20 20 20 20 2a 20 63 6f 72 72 65 63 74 6c 79 * correctly
28e0: 2e 20 20 53 69 6d 69 6c 61 72 20 66 69 78 20 69 . Similar fix i
28f0: 6e 20 54 6c 73 4f 75 74 70 75 74 50 72 6f 63 2e n TlsOutputProc.
2900: 20 2d 20 68 6f 62 62 73 0a 20 20 20 20 20 2a 2f - hobbs. */
2910: 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 . ERR_clear_e
2920: 72 72 6f 72 28 29 3b 0a 20 20 20 20 62 79 74 65 rror();. byte
2930: 73 52 65 61 64 20 3d 20 42 49 4f 5f 72 65 61 64 sRead = BIO_read
2940: 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 2c 20 (statePtr->bio,
2950: 62 75 66 2c 20 62 75 66 53 69 7a 65 29 3b 0a 20 buf, bufSize);.
2960: 20 20 20 64 70 72 69 6e 74 66 28 22 42 49 4f 5f dprintf("BIO_
2970: 72 65 61 64 20 2d 3e 20 25 64 22 2c 20 62 79 74 read -> %d", byt
2980: 65 73 52 65 61 64 29 3b 0a 0a 20 20 20 20 65 72 esRead);.. er
2990: 72 20 3d 20 53 53 4c 5f 67 65 74 5f 65 72 72 6f r = SSL_get_erro
29a0: 72 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c r(statePtr->ssl,
29b0: 20 62 79 74 65 73 52 65 61 64 29 3b 0a 20 20 20 bytesRead);.
29c0: 20 62 61 63 6b 69 6e 67 45 72 72 6f 72 20 3d 20 backingError =
29d0: 45 52 52 5f 67 65 74 5f 65 72 72 6f 72 28 29 3b ERR_get_error();
29e0: 0a 0a 23 69 66 20 30 0a 20 20 20 20 69 66 20 28 ..#if 0. if (
29f0: 62 79 74 65 73 52 65 61 64 20 3c 3d 20 30 29 20 bytesRead <= 0)
2a00: 7b 0a 09 69 66 20 28 42 49 4f 5f 73 68 6f 75 6c {..if (BIO_shoul
2a10: 64 5f 72 65 74 72 79 28 73 74 61 74 65 50 74 72 d_retry(statePtr
2a20: 2d 3e 62 69 6f 29 29 20 7b 0a 09 20 20 20 20 64 ->bio)) {.. d
2a30: 70 72 69 6e 74 66 28 22 49 2f 4f 20 66 61 69 6c printf("I/O fail
2a40: 65 64 2c 20 77 69 6c 6c 20 72 65 74 72 79 20 62 ed, will retry b
2a50: 61 73 65 64 20 6f 6e 20 45 41 47 41 49 4e 22 29 ased on EAGAIN")
2a60: 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 ;.. *errorCod
2a70: 65 50 74 72 20 3d 20 45 41 47 41 49 4e 3b 0a 09 ePtr = EAGAIN;..
2a80: 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a }. }.#endif..
2a90: 20 20 20 20 73 77 69 74 63 68 20 28 65 72 72 29 switch (err)
2aa0: 20 7b 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52 {..case SSL_ERR
2ab0: 4f 52 5f 4e 4f 4e 45 3a 0a 09 20 20 20 20 64 70 OR_NONE:.. dp
2ac0: 72 69 6e 74 42 75 66 66 65 72 28 62 75 66 2c 20 rintBuffer(buf,
2ad0: 62 79 74 65 73 52 65 61 64 29 3b 0a 09 20 20 20 bytesRead);..
2ae0: 20 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20 53 break;...case S
2af0: 53 4c 5f 45 52 52 4f 52 5f 53 53 4c 3a 0a 09 20 SL_ERROR_SSL:..
2b00: 20 20 20 2f 2a 20 41 20 6e 6f 6e 2d 72 65 63 6f /* A non-reco
2b10: 76 65 72 61 62 6c 65 2c 20 66 61 74 61 6c 20 65 verable, fatal e
2b20: 72 72 6f 72 20 69 6e 20 74 68 65 20 53 53 4c 20 rror in the SSL
2b30: 6c 69 62 72 61 72 79 20 6f 63 63 75 72 72 65 64 library occurred
2b40: 2c 20 75 73 75 61 6c 6c 79 20 61 20 70 72 6f 74 , usually a prot
2b50: 6f 63 6f 6c 20 65 72 72 6f 72 20 2a 2f 0a 09 20 ocol error */..
2b60: 20 20 20 64 70 72 69 6e 74 66 28 22 53 53 4c 20 dprintf("SSL
2b70: 65 72 72 6f 72 2c 20 69 6e 64 69 63 61 74 69 6e error, indicatin
2b80: 67 20 74 68 61 74 20 74 68 65 20 63 6f 6e 6e 65 g that the conne
2b90: 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 61 ction has been a
2ba0: 62 6f 72 74 65 64 22 29 3b 0a 09 20 20 20 20 69 borted");.. i
2bb0: 66 20 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 20 f (backingError
2bc0: 21 3d 20 30 29 20 7b 0a 09 09 54 6c 73 5f 45 72 != 0) {...Tls_Er
2bd0: 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20 28 63 ror(statePtr, (c
2be0: 68 61 72 20 2a 29 20 45 52 52 5f 72 65 61 73 6f har *) ERR_reaso
2bf0: 6e 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 62 n_error_string(b
2c00: 61 63 6b 69 6e 67 45 72 72 6f 72 29 29 3b 0a 09 ackingError));..
2c10: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 53 } else if (S
2c20: 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 72 65 SL_get_verify_re
2c30: 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d 3e 73 sult(statePtr->s
2c40: 73 6c 29 20 21 3d 20 58 35 30 39 5f 56 5f 4f 4b sl) != X509_V_OK
2c50: 29 20 7b 0a 09 09 54 6c 73 5f 45 72 72 6f 72 28 ) {...Tls_Error(
2c60: 73 74 61 74 65 50 74 72 2c 20 28 63 68 61 72 20 statePtr, (char
2c70: 2a 29 20 58 35 30 39 5f 76 65 72 69 66 79 5f 63 *) X509_verify_c
2c80: 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 ert_error_string
2c90: 28 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f (SSL_get_verify_
2ca0: 72 65 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d result(statePtr-
2cb0: 3e 73 73 6c 29 29 29 3b 0a 09 20 20 20 20 7d 20 >ssl)));.. }
2cc0: 65 6c 73 65 20 7b 0a 09 09 54 6c 73 5f 45 72 72 else {...Tls_Err
2cd0: 6f 72 28 73 74 61 74 65 50 74 72 2c 20 22 55 6e or(statePtr, "Un
2ce0: 6b 6e 6f 77 6e 20 53 53 4c 20 65 72 72 6f 72 22 known SSL error"
2cf0: 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 2a );.. }.. *
2d00: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 errorCodePtr = E
2d10: 43 4f 4e 4e 41 42 4f 52 54 45 44 3b 0a 09 20 20 CONNABORTED;..
2d20: 20 20 62 79 74 65 73 52 65 61 64 20 3d 20 2d 31 bytesRead = -1
2d30: 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 ;..#if OPENSSL_V
2d40: 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d ERSION_NUMBER >=
2d50: 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 20 20 0x30000000L..
2d60: 20 20 2f 2a 20 55 6e 65 78 70 65 63 74 65 64 20 /* Unexpected
2d70: 45 4f 46 20 66 72 6f 6d 20 74 68 65 20 70 65 65 EOF from the pee
2d80: 72 20 66 6f 72 20 4f 70 65 6e 53 53 4c 20 33 2e r for OpenSSL 3.
2d90: 30 2b 20 2a 2f 0a 09 20 20 20 20 69 66 20 28 45 0+ */.. if (E
2da0: 52 52 5f 47 45 54 5f 52 45 41 53 4f 4e 28 62 61 RR_GET_REASON(ba
2db0: 63 6b 69 6e 67 45 72 72 6f 72 29 20 3d 3d 20 53 ckingError) == S
2dc0: 53 4c 5f 52 5f 55 4e 45 58 50 45 43 54 45 44 5f SL_R_UNEXPECTED_
2dd0: 45 4f 46 5f 57 48 49 4c 45 5f 52 45 41 44 49 4e EOF_WHILE_READIN
2de0: 47 29 20 7b 0a 09 09 64 70 72 69 6e 74 66 28 22 G) {...dprintf("
2df0: 28 55 6e 65 78 70 65 63 74 65 64 29 20 45 4f 46 (Unexpected) EOF
2e00: 20 72 65 61 63 68 65 64 22 29 0a 09 09 2a 65 72 reached")...*er
2e10: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a rorCodePtr = 0;.
2e20: 09 09 62 79 74 65 73 52 65 61 64 20 3d 20 30 3b ..bytesRead = 0;
2e30: 0a 09 09 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 ...Tls_Error(sta
2e40: 74 65 50 74 72 2c 20 22 45 4f 46 20 72 65 61 63 tePtr, "EOF reac
2e50: 68 65 64 22 29 3b 0a 09 20 20 20 20 7d 0a 23 65 hed");.. }.#e
2e60: 6e 64 69 66 0a 09 20 20 20 20 62 72 65 61 6b 3b ndif.. break;
2e70: 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f ...case SSL_ERRO
2e80: 52 5f 53 59 53 43 41 4c 4c 3a 0a 09 20 20 20 20 R_SYSCALL:..
2e90: 2f 2a 20 53 6f 6d 65 20 6e 6f 6e 2d 72 65 63 6f /* Some non-reco
2ea0: 76 65 72 61 62 6c 65 2c 20 66 61 74 61 6c 20 49 verable, fatal I
2eb0: 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 /O error occurre
2ec0: 64 20 2a 2f 0a 0a 09 20 20 20 20 69 66 20 28 62 d */... if (b
2ed0: 61 63 6b 69 6e 67 45 72 72 6f 72 20 3d 3d 20 30 ackingError == 0
2ee0: 20 26 26 20 62 79 74 65 73 52 65 61 64 20 3d 3d && bytesRead ==
2ef0: 20 30 29 20 7b 0a 09 09 2f 2a 20 55 6e 65 78 70 0) {.../* Unexp
2f00: 65 63 74 65 64 20 45 4f 46 20 66 72 6f 6d 20 74 ected EOF from t
2f10: 68 65 20 70 65 65 72 20 66 6f 72 20 4f 70 65 6e he peer for Open
2f20: 53 53 4c 20 31 2e 31 20 2a 2f 0a 09 09 64 70 72 SSL 1.1 */...dpr
2f30: 69 6e 74 66 28 22 28 55 6e 65 78 70 65 63 74 65 intf("(Unexpecte
2f40: 64 29 20 45 4f 46 20 72 65 61 63 68 65 64 22 29 d) EOF reached")
2f50: 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 ...*errorCodePtr
2f60: 20 3d 20 30 3b 0a 09 09 62 79 74 65 73 52 65 61 = 0;...bytesRea
2f70: 64 20 3d 20 30 3b 0a 09 09 54 6c 73 5f 45 72 72 d = 0;...Tls_Err
2f80: 6f 72 28 73 74 61 74 65 50 74 72 2c 20 22 45 4f or(statePtr, "EO
2f90: 46 20 72 65 61 63 68 65 64 22 29 3b 0a 0a 09 20 F reached");...
2fa0: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 62 61 } else if (ba
2fb0: 63 6b 69 6e 67 45 72 72 6f 72 20 3d 3d 20 30 20 ckingError == 0
2fc0: 26 26 20 62 79 74 65 73 52 65 61 64 20 3d 3d 20 && bytesRead ==
2fd0: 2d 31 29 20 7b 0a 09 09 64 70 72 69 6e 74 66 28 -1) {...dprintf(
2fe0: 22 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 "I/O error occur
2ff0: 72 65 64 20 28 65 72 72 6e 6f 20 3d 20 25 6c 75 red (errno = %lu
3000: 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f )", (unsigned lo
3010: 6e 67 29 20 54 63 6c 5f 47 65 74 45 72 72 6e 6f ng) Tcl_GetErrno
3020: 28 29 29 3b 0a 09 09 2a 65 72 72 6f 72 43 6f 64 ());...*errorCod
3030: 65 50 74 72 20 3d 20 54 63 6c 5f 47 65 74 45 72 ePtr = Tcl_GetEr
3040: 72 6e 6f 28 29 3b 0a 09 09 62 79 74 65 73 52 65 rno();...bytesRe
3050: 61 64 20 3d 20 2d 31 3b 0a 09 09 54 6c 73 5f 45 ad = -1;...Tls_E
3060: 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20 28 rror(statePtr, (
3070: 63 68 61 72 20 2a 29 20 54 63 6c 5f 45 72 72 6e char *) Tcl_Errn
3080: 6f 4d 73 67 28 2a 65 72 72 6f 72 43 6f 64 65 50 oMsg(*errorCodeP
3090: 74 72 29 29 3b 0a 0a 09 20 20 20 20 7d 20 65 6c tr));... } el
30a0: 73 65 20 7b 0a 09 09 64 70 72 69 6e 74 66 28 22 se {...dprintf("
30b0: 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 72 I/O error occurr
30c0: 65 64 20 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 ed (backingError
30d0: 20 3d 20 25 6c 75 29 22 2c 20 62 61 63 6b 69 6e = %lu)", backin
30e0: 67 45 72 72 6f 72 29 3b 0a 09 09 2a 65 72 72 6f gError);...*erro
30f0: 72 43 6f 64 65 50 74 72 20 3d 20 54 63 6c 5f 47 rCodePtr = Tcl_G
3100: 65 74 45 72 72 6e 6f 28 29 3b 0a 09 09 62 79 74 etErrno();...byt
3110: 65 73 52 65 61 64 20 3d 20 2d 31 3b 0a 09 09 54 esRead = -1;...T
3120: 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 ls_Error(statePt
3130: 72 2c 20 28 63 68 61 72 20 2a 29 20 45 52 52 5f r, (char *) ERR_
3140: 72 65 61 73 6f 6e 5f 65 72 72 6f 72 5f 73 74 72 reason_error_str
3150: 69 6e 67 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 ing(backingError
3160: 29 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 ));.. }..
3170: 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20 53 53 break;...case SS
3180: 4c 5f 45 52 52 4f 52 5f 5a 45 52 4f 5f 52 45 54 L_ERROR_ZERO_RET
3190: 55 52 4e 3a 0a 09 20 20 20 20 64 70 72 69 6e 74 URN:.. dprint
31a0: 66 28 22 47 6f 74 20 53 53 4c 5f 45 52 52 4f 52 f("Got SSL_ERROR
31b0: 5f 5a 45 52 4f 5f 52 45 54 55 52 4e 2c 20 74 68 _ZERO_RETURN, th
31c0: 69 73 20 6d 65 61 6e 73 20 61 6e 20 45 4f 46 20 is means an EOF
31d0: 68 61 73 20 62 65 65 6e 20 72 65 61 63 68 65 64 has been reached
31e0: 22 29 3b 0a 09 20 20 20 20 62 79 74 65 73 52 65 ");.. bytesRe
31f0: 61 64 20 3d 20 30 3b 0a 09 20 20 20 20 2a 65 72 ad = 0;.. *er
3200: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a rorCodePtr = 0;.
3210: 09 20 20 20 20 54 6c 73 5f 45 72 72 6f 72 28 73 . Tls_Error(s
3220: 74 61 74 65 50 74 72 2c 20 22 50 65 65 72 20 68 tatePtr, "Peer h
3230: 61 73 20 63 6c 6f 73 65 64 20 74 68 65 20 63 6f as closed the co
3240: 6e 6e 65 63 74 69 6f 6e 20 66 6f 72 20 77 72 69 nnection for wri
3250: 74 69 6e 67 20 62 79 20 73 65 6e 64 69 6e 67 20 ting by sending
3260: 74 68 65 20 63 6c 6f 73 65 5f 6e 6f 74 69 66 79 the close_notify
3270: 20 61 6c 65 72 74 22 29 3b 0a 09 20 20 20 20 62 alert");.. b
3280: 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20 53 53 4c reak;...case SSL
3290: 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 52 45 41 44 _ERROR_WANT_READ
32a0: 3a 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 :.. dprintf("
32b0: 47 6f 74 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 Got SSL_ERROR_WA
32c0: 4e 54 5f 52 45 41 44 2c 20 6d 61 70 70 69 6e 67 NT_READ, mapping
32d0: 20 74 68 69 73 20 74 6f 20 45 41 47 41 49 4e 22 this to EAGAIN"
32e0: 29 3b 0a 09 20 20 20 20 62 79 74 65 73 52 65 61 );.. bytesRea
32f0: 64 20 3d 20 2d 31 3b 0a 09 20 20 20 20 2a 65 72 d = -1;.. *er
3300: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 41 47 rorCodePtr = EAG
3310: 41 49 4e 3b 0a 09 20 20 20 20 54 6c 73 5f 45 72 AIN;.. Tls_Er
3320: 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20 22 53 ror(statePtr, "S
3330: 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 52 45 SL_ERROR_WANT_RE
3340: 41 44 22 29 3b 0a 09 20 20 20 20 62 72 65 61 6b AD");.. break
3350: 3b 0a 0a 09 64 65 66 61 75 6c 74 3a 0a 09 20 20 ;...default:..
3360: 20 20 64 70 72 69 6e 74 66 28 22 55 6e 6b 6e 6f dprintf("Unkno
3370: 77 6e 20 65 72 72 6f 72 20 28 65 72 72 20 3d 20 wn error (err =
3380: 25 69 29 2c 20 6d 61 70 70 69 6e 67 20 74 6f 20 %i), mapping to
3390: 45 4f 46 22 2c 20 65 72 72 29 3b 0a 09 20 20 20 EOF", err);..
33a0: 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d *errorCodePtr =
33b0: 20 30 3b 0a 09 20 20 20 20 62 79 74 65 73 52 65 0;.. bytesRe
33c0: 61 64 20 3d 20 30 3b 0a 09 20 20 20 20 54 6c 73 ad = 0;.. Tls
33d0: 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c _Error(statePtr,
33e0: 20 22 55 6e 6b 6e 6f 77 6e 20 65 72 72 6f 72 22 "Unknown error"
33f0: 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 20 );.. break;.
3400: 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 }.. dprint
3410: 66 28 22 49 6e 70 75 74 28 25 64 29 20 2d 3e 20 f("Input(%d) ->
3420: 25 64 20 5b 25 64 5d 22 2c 20 62 75 66 53 69 7a %d [%d]", bufSiz
3430: 65 2c 20 62 79 74 65 73 52 65 61 64 2c 20 2a 65 e, bytesRead, *e
3440: 72 72 6f 72 43 6f 64 65 50 74 72 29 3b 0a 20 20 rrorCodePtr);.
3450: 20 20 72 65 74 75 72 6e 20 62 79 74 65 73 52 65 return bytesRe
3460: 61 64 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d ad;.}../*. *----
3470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
34a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
34b0: 20 2a 0a 20 2a 20 54 6c 73 4f 75 74 70 75 74 50 *. * TlsOutputP
34c0: 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 20 20 20 20 roc --. *. *
34d0: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 This procedure i
34e0: 73 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 s invoked by the
34f0: 20 67 65 6e 65 72 69 63 20 49 4f 20 6c 65 76 65 generic IO leve
3500: 6c 0a 20 2a 20 20 20 20 20 20 20 74 6f 20 77 72 l. * to wr
3510: 69 74 65 20 6f 75 74 70 75 74 20 74 6f 20 61 20 ite output to a
3520: 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64 SSL socket based
3530: 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 channel.. *. *
3540: 52 65 73 75 6c 74 73 3a 0a 20 2a 20 20 20 20 52 Results:. * R
3550: 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 eturns the numbe
3560: 72 20 6f 66 20 62 79 74 65 73 20 77 72 69 74 74 r of bytes writt
3570: 65 6e 20 6f 72 20 2d 31 20 6f 6e 20 65 72 72 6f en or -1 on erro
3580: 72 2e 20 53 65 74 73 20 65 72 72 6f 72 43 6f 64 r. Sets errorCod
3590: 65 50 74 72 0a 20 2a 20 20 20 20 74 6f 20 61 20 ePtr. * to a
35a0: 50 4f 53 49 58 20 65 72 72 6f 72 20 63 6f 64 65 POSIX error code
35b0: 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 if an error occ
35c0: 75 72 72 65 64 2c 20 6f 72 20 30 20 69 66 20 6e urred, or 0 if n
35d0: 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 one.. *. * Side
35e0: 65 66 66 65 63 74 73 3a 0a 20 2a 20 20 20 20 57 effects:. * W
35f0: 72 69 74 65 73 20 6f 75 74 70 75 74 20 6f 6e 20 rites output on
3600: 74 68 65 20 6f 75 74 70 75 74 20 64 65 76 69 63 the output devic
3610: 65 20 6f 66 20 74 68 65 20 63 68 61 6e 6e 65 6c e of the channel
3620: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d .. *. *---------
3630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a ----------. */..
3670: 73 74 61 74 69 63 20 69 6e 74 20 54 6c 73 4f 75 static int TlsOu
3680: 74 70 75 74 50 72 6f 63 28 0a 20 20 20 20 76 6f tputProc(. vo
3690: 69 64 20 2a 69 6e 73 74 61 6e 63 65 44 61 74 61 id *instanceData
36a0: 2c 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 ,. const char
36b0: 20 2a 62 75 66 2c 0a 20 20 20 20 69 6e 74 20 74 *buf,. int t
36c0: 6f 57 72 69 74 65 2c 0a 20 20 20 20 69 6e 74 20 oWrite,. int
36d0: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29 0a 7b *errorCodePtr).{
36e0: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f . unsigned lo
36f0: 6e 67 20 62 61 63 6b 69 6e 67 45 72 72 6f 72 3b ng backingError;
3700: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
3710: 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 ePtr = (State *)
3720: 20 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 20 instanceData;.
3730: 20 20 20 69 6e 74 20 77 72 69 74 74 65 6e 2c 20 int written,
3740: 65 72 72 3b 0a 20 20 20 20 69 6e 74 20 74 6c 73 err;. int tls
3750: 43 6f 6e 6e 65 63 74 3b 0a 0a 20 20 20 20 2a 65 Connect;.. *e
3760: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 30 3b rrorCodePtr = 0;
3770: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 42 .. dprintf("B
3780: 49 4f 5f 77 72 69 74 65 28 25 70 2c 20 25 64 29 IO_write(%p, %d)
3790: 22 2c 20 28 76 6f 69 64 20 2a 29 20 73 74 61 74 ", (void *) stat
37a0: 65 50 74 72 2c 20 74 6f 57 72 69 74 65 29 3b 0a ePtr, toWrite);.
37b0: 20 20 20 20 64 70 72 69 6e 74 42 75 66 66 65 72 dprintBuffer
37c0: 28 62 75 66 2c 20 74 6f 57 72 69 74 65 29 3b 0a (buf, toWrite);.
37d0: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
37e0: 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 r->flags & TLS_T
37f0: 43 4c 5f 43 41 4c 4c 42 41 43 4b 29 20 7b 0a 09 CL_CALLBACK) {..
3800: 64 70 72 69 6e 74 66 28 22 44 6f 6e 27 74 20 70 dprintf("Don't p
3810: 72 6f 63 65 73 73 20 6f 75 74 70 75 74 20 77 68 rocess output wh
3820: 69 6c 65 20 63 61 6c 6c 62 61 63 6b 73 20 61 72 ile callbacks ar
3830: 65 20 72 75 6e 6e 69 6e 67 22 29 3b 0a 09 77 72 e running");..wr
3840: 69 74 74 65 6e 20 3d 20 2d 31 3b 0a 09 2a 65 72 itten = -1;..*er
3850: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 41 47 rorCodePtr = EAG
3860: 41 49 4e 3b 0a 09 72 65 74 75 72 6e 28 2d 31 29 AIN;..return(-1)
3870: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 ;. }.. dpr
3880: 69 6e 74 66 28 22 43 61 6c 6c 69 6e 67 20 54 6c intf("Calling Tl
3890: 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 s_WaitForConnect
38a0: 22 29 3b 0a 20 20 20 20 74 6c 73 43 6f 6e 6e 65 ");. tlsConne
38b0: 63 74 20 3d 20 54 6c 73 5f 57 61 69 74 46 6f 72 ct = Tls_WaitFor
38c0: 43 6f 6e 6e 65 63 74 28 73 74 61 74 65 50 74 72 Connect(statePtr
38d0: 2c 20 65 72 72 6f 72 43 6f 64 65 50 74 72 2c 20 , errorCodePtr,
38e0: 31 29 3b 0a 20 20 20 20 69 66 20 28 74 6c 73 43 1);. if (tlsC
38f0: 6f 6e 6e 65 63 74 20 3c 20 30 29 20 7b 0a 09 64 onnect < 0) {..d
3900: 70 72 69 6e 74 66 28 22 47 6f 74 20 61 6e 20 65 printf("Got an e
3910: 72 72 6f 72 20 77 61 69 74 69 6e 67 20 74 6f 20 rror waiting to
3920: 63 6f 6e 6e 65 63 74 20 28 74 6c 73 43 6f 6e 6e connect (tlsConn
3930: 65 63 74 20 3d 20 25 69 2c 20 2a 65 72 72 6f 72 ect = %i, *error
3940: 43 6f 64 65 50 74 72 20 3d 20 25 69 29 22 2c 20 CodePtr = %i)",
3950: 74 6c 73 43 6f 6e 6e 65 63 74 2c 20 2a 65 72 72 tlsConnect, *err
3960: 6f 72 43 6f 64 65 50 74 72 29 3b 0a 09 54 6c 73 orCodePtr);..Tls
3970: 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c _Error(statePtr,
3980: 20 73 74 72 65 72 72 6f 72 28 2a 65 72 72 6f 72 strerror(*error
3990: 43 6f 64 65 50 74 72 29 29 3b 0a 0a 09 77 72 69 CodePtr));...wri
39a0: 74 74 65 6e 20 3d 20 2d 31 3b 0a 09 69 66 20 28 tten = -1;..if (
39b0: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 3d *errorCodePtr ==
39c0: 20 45 43 4f 4e 4e 52 45 53 45 54 29 20 7b 0a 09 ECONNRESET) {..
39d0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74 dprintf("Got
39e0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 72 65 73 65 connection rese
39f0: 74 22 29 3b 0a 09 20 20 20 20 2f 2a 20 53 6f 66 t");.. /* Sof
3a00: 74 20 45 4f 46 20 2a 2f 0a 09 20 20 20 20 2a 65 t EOF */.. *e
3a10: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 30 3b rrorCodePtr = 0;
3a20: 0a 09 20 20 20 20 77 72 69 74 74 65 6e 20 3d 20 .. written =
3a30: 30 3b 0a 09 7d 0a 09 72 65 74 75 72 6e 28 77 72 0;..}..return(wr
3a40: 69 74 74 65 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20 itten);. }..
3a50: 20 20 20 69 66 20 28 74 6f 57 72 69 74 65 20 3d if (toWrite =
3a60: 3d 20 30 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 = 0) {..dprintf(
3a70: 22 7a 65 72 6f 2d 77 72 69 74 65 22 29 3b 0a 09 "zero-write");..
3a80: 65 72 72 20 3d 20 42 49 4f 5f 66 6c 75 73 68 28 err = BIO_flush(
3a90: 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a statePtr->bio);.
3aa0: 0a 09 69 66 20 28 65 72 72 20 3c 3d 20 30 29 20 ..if (err <= 0)
3ab0: 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 {.. dprintf("
3ac0: 46 6c 75 73 68 69 6e 67 20 66 61 69 6c 65 64 22 Flushing failed"
3ad0: 29 3b 0a 09 20 20 20 20 54 6c 73 5f 45 72 72 6f );.. Tls_Erro
3ae0: 72 28 73 74 61 74 65 50 74 72 2c 20 22 46 6c 75 r(statePtr, "Flu
3af0: 73 68 20 66 61 69 6c 65 64 22 29 3b 0a 0a 09 20 sh failed");...
3b00: 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 *errorCodePtr
3b10: 20 3d 20 45 49 4f 3b 0a 09 20 20 20 20 77 72 69 = EIO;.. wri
3b20: 74 74 65 6e 20 3d 20 30 3b 0a 09 20 20 20 20 72 tten = 0;.. r
3b30: 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 eturn(-1);..}...
3b40: 77 72 69 74 74 65 6e 20 3d 20 30 3b 0a 09 2a 65 written = 0;..*e
3b50: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 30 3b rrorCodePtr = 0;
3b60: 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 20 20 20 ..return(0);.
3b70: 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 }.. /*.
3b80: 2a 20 57 65 20 6e 65 65 64 20 74 6f 20 63 6c 65 * We need to cle
3b90: 61 72 20 74 68 65 20 53 53 4c 20 65 72 72 6f 72 ar the SSL error
3ba0: 20 73 74 61 63 6b 20 6e 6f 77 20 62 65 63 61 75 stack now becau
3bb0: 73 65 20 77 65 20 73 6f 6d 65 74 69 6d 65 73 20 se we sometimes
3bc0: 72 65 61 63 68 0a 20 20 20 20 20 2a 20 74 68 69 reach. * thi
3bd0: 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 s function with
3be0: 6c 65 66 74 6f 76 65 72 20 65 72 72 6f 72 73 20 leftover errors
3bf0: 69 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 49 in the stack. I
3c00: 66 20 42 49 4f 5f 77 72 69 74 65 0a 20 20 20 20 f BIO_write.
3c10: 20 2a 20 72 65 74 75 72 6e 73 20 2d 31 20 61 6e * returns -1 an
3c20: 64 20 69 6e 74 65 6e 64 73 20 45 41 47 41 49 4e d intends EAGAIN
3c30: 2c 20 74 68 65 72 65 20 69 73 20 61 20 6c 65 66 , there is a lef
3c40: 74 6f 76 65 72 20 65 72 72 6f 72 2c 20 69 74 20 tover error, it
3c50: 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 2a 20 6d will be. * m
3c60: 69 73 63 6f 6e 73 74 72 75 65 64 20 61 73 20 61 isconstrued as a
3c70: 6e 20 65 72 72 6f 72 2c 20 6e 6f 74 20 45 41 47 n error, not EAG
3c80: 41 49 4e 2e 0a 20 20 20 20 20 2a 0a 20 20 20 20 AIN.. *.
3c90: 20 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 6c 79 * Alternatively
3ca0: 2c 20 77 65 20 6d 61 79 20 77 61 6e 74 20 74 6f , we may want to
3cb0: 20 68 61 6e 64 6c 65 20 74 68 65 20 3c 30 20 72 handle the <0 r
3cc0: 65 74 75 72 6e 20 63 6f 64 65 73 20 66 72 6f 6d eturn codes from
3cd0: 0a 20 20 20 20 20 2a 20 42 49 4f 5f 77 72 69 74 . * BIO_writ
3ce0: 65 20 73 70 65 63 69 61 6c 6c 79 20 28 61 73 20 e specially (as
3cf0: 61 64 76 69 73 65 64 20 69 6e 20 74 68 65 20 52 advised in the R
3d00: 53 41 20 64 6f 63 73 29 2e 20 20 54 4c 53 27 73 SA docs). TLS's
3d10: 20 6c 6f 77 65 72 20 6c 65 76 65 6c 0a 20 20 20 lower level.
3d20: 20 20 2a 20 42 49 4f 20 66 75 6e 63 74 69 6f 6e * BIO function
3d30: 73 20 70 6c 61 79 20 77 69 74 68 20 74 68 65 20 s play with the
3d40: 72 65 74 72 79 20 66 6c 61 67 73 20 74 68 6f 75 retry flags thou
3d50: 67 68 2c 20 61 6e 64 20 74 68 69 73 20 73 65 65 gh, and this see
3d60: 6d 73 20 74 6f 0a 20 20 20 20 20 2a 20 77 6f 72 ms to. * wor
3d70: 6b 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 53 69 k correctly. Si
3d80: 6d 69 6c 61 72 20 66 69 78 20 69 6e 20 54 6c 73 milar fix in Tls
3d90: 49 6e 70 75 74 50 72 6f 63 2e 20 2d 20 68 6f 62 InputProc. - hob
3da0: 62 73 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 45 bs. */. E
3db0: 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 RR_clear_error()
3dc0: 3b 0a 20 20 20 20 77 72 69 74 74 65 6e 20 3d 20 ;. written =
3dd0: 42 49 4f 5f 77 72 69 74 65 28 73 74 61 74 65 50 BIO_write(stateP
3de0: 74 72 2d 3e 62 69 6f 2c 20 62 75 66 2c 20 74 6f tr->bio, buf, to
3df0: 57 72 69 74 65 29 3b 0a 20 20 20 20 64 70 72 69 Write);. dpri
3e00: 6e 74 66 28 22 42 49 4f 5f 77 72 69 74 65 28 25 ntf("BIO_write(%
3e10: 70 2c 20 25 64 29 20 2d 3e 20 5b 25 64 5d 22 2c p, %d) -> [%d]",
3e20: 20 28 76 6f 69 64 20 2a 29 20 73 74 61 74 65 50 (void *) stateP
3e30: 74 72 2c 20 74 6f 57 72 69 74 65 2c 20 77 72 69 tr, toWrite, wri
3e40: 74 74 65 6e 29 3b 0a 0a 20 20 20 20 65 72 72 20 tten);.. err
3e50: 3d 20 53 53 4c 5f 67 65 74 5f 65 72 72 6f 72 28 = SSL_get_error(
3e60: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 77 statePtr->ssl, w
3e70: 72 69 74 74 65 6e 29 3b 0a 20 20 20 20 62 61 63 ritten);. bac
3e80: 6b 69 6e 67 45 72 72 6f 72 20 3d 20 45 52 52 5f kingError = ERR_
3e90: 67 65 74 5f 65 72 72 6f 72 28 29 3b 0a 20 20 20 get_error();.
3ea0: 20 73 77 69 74 63 68 20 28 65 72 72 29 20 7b 0a switch (err) {.
3eb0: 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f .case SSL_ERROR_
3ec0: 4e 4f 4e 45 3a 0a 09 20 20 20 20 69 66 20 28 77 NONE:.. if (w
3ed0: 72 69 74 74 65 6e 20 3c 20 30 29 20 7b 0a 09 09 ritten < 0) {...
3ee0: 77 72 69 74 74 65 6e 20 3d 20 30 3b 0a 09 20 20 written = 0;..
3ef0: 20 20 7d 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a }.. break;.
3f00: 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f .case SSL_ERROR_
3f10: 57 41 4e 54 5f 57 52 49 54 45 3a 0a 09 20 20 20 WANT_WRITE:..
3f20: 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20 53 53 dprintf("Got SS
3f30: 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 57 52 49 L_ERROR_WANT_WRI
3f40: 54 45 2c 20 6d 61 70 70 69 6e 67 20 69 74 20 74 TE, mapping it t
3f50: 6f 20 45 41 47 41 49 4e 22 29 3b 0a 09 20 20 20 o EAGAIN");..
3f60: 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d *errorCodePtr =
3f70: 20 45 41 47 41 49 4e 3b 0a 09 20 20 20 20 77 72 EAGAIN;.. wr
3f80: 69 74 74 65 6e 20 3d 20 2d 31 3b 0a 09 20 20 20 itten = -1;..
3f90: 20 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 Tls_Error(state
3fa0: 50 74 72 2c 20 22 53 53 4c 5f 45 52 52 4f 52 5f Ptr, "SSL_ERROR_
3fb0: 57 41 4e 54 5f 57 52 49 54 45 22 29 3b 0a 09 20 WANT_WRITE");..
3fc0: 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 break;..case
3fd0: 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 52 SSL_ERROR_WANT_R
3fe0: 45 41 44 3a 0a 09 20 20 20 20 64 70 72 69 6e 74 EAD:.. dprint
3ff0: 66 28 22 20 77 72 69 74 65 20 52 20 42 4c 4f 43 f(" write R BLOC
4000: 4b 22 29 3b 0a 09 20 20 20 20 54 6c 73 5f 45 72 K");.. Tls_Er
4010: 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20 22 53 ror(statePtr, "S
4020: 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 52 45 SL_ERROR_WANT_RE
4030: 41 44 22 29 3b 0a 09 20 20 20 20 62 72 65 61 6b AD");.. break
4040: 3b 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f ;..case SSL_ERRO
4050: 52 5f 57 41 4e 54 5f 58 35 30 39 5f 4c 4f 4f 4b R_WANT_X509_LOOK
4060: 55 50 3a 0a 09 20 20 20 20 64 70 72 69 6e 74 66 UP:.. dprintf
4070: 28 22 20 77 72 69 74 65 20 58 20 42 4c 4f 43 4b (" write X BLOCK
4080: 22 29 3b 0a 09 20 20 20 20 54 6c 73 5f 45 72 72 ");.. Tls_Err
4090: 6f 72 28 73 74 61 74 65 50 74 72 2c 20 22 53 53 or(statePtr, "SS
40a0: 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 58 35 30 L_ERROR_WANT_X50
40b0: 39 5f 4c 4f 4f 4b 55 50 22 29 3b 0a 09 20 20 20 9_LOOKUP");..
40c0: 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 53 53 break;..case SS
40d0: 4c 5f 45 52 52 4f 52 5f 5a 45 52 4f 5f 52 45 54 L_ERROR_ZERO_RET
40e0: 55 52 4e 3a 0a 09 20 20 20 20 64 70 72 69 6e 74 URN:.. dprint
40f0: 66 28 22 20 63 6c 6f 73 65 64 22 29 3b 0a 09 20 f(" closed");..
4100: 20 20 20 77 72 69 74 74 65 6e 20 3d 20 30 3b 0a written = 0;.
4110: 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 . *errorCodeP
4120: 74 72 20 3d 20 30 3b 0a 09 20 20 20 20 54 6c 73 tr = 0;.. Tls
4130: 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c _Error(statePtr,
4140: 20 22 50 65 65 72 20 68 61 73 20 63 6c 6f 73 65 "Peer has close
4150: 64 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e d the connection
4160: 20 66 6f 72 20 77 72 69 74 69 6e 67 20 62 79 20 for writing by
4170: 73 65 6e 64 69 6e 67 20 74 68 65 20 63 6c 6f 73 sending the clos
4180: 65 5f 6e 6f 74 69 66 79 20 61 6c 65 72 74 22 29 e_notify alert")
4190: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 ;.. break;..c
41a0: 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 53 59 ase SSL_ERROR_SY
41b0: 53 43 41 4c 4c 3a 0a 09 20 20 20 20 2f 2a 20 53 SCALL:.. /* S
41c0: 6f 6d 65 20 6e 6f 6e 2d 72 65 63 6f 76 65 72 61 ome non-recovera
41d0: 62 6c 65 2c 20 66 61 74 61 6c 20 49 2f 4f 20 65 ble, fatal I/O e
41e0: 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 2a 2f rror occurred */
41f0: 0a 0a 09 20 20 20 20 69 66 20 28 62 61 63 6b 69 ... if (backi
4200: 6e 67 45 72 72 6f 72 20 3d 3d 20 30 20 26 26 20 ngError == 0 &&
4210: 77 72 69 74 74 65 6e 20 3d 3d 20 30 29 20 7b 0a written == 0) {.
4220: 09 09 64 70 72 69 6e 74 66 28 22 45 4f 46 20 72 ..dprintf("EOF r
4230: 65 61 63 68 65 64 22 29 0a 09 09 2a 65 72 72 6f eached")...*erro
4240: 72 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a 09 09 rCodePtr = 0;...
4250: 77 72 69 74 74 65 6e 20 3d 20 30 3b 0a 09 09 54 written = 0;...T
4260: 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 ls_Error(statePt
4270: 72 2c 20 22 45 4f 46 20 72 65 61 63 68 65 64 22 r, "EOF reached"
4280: 29 3b 0a 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 );... } else
4290: 69 66 20 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 if (backingError
42a0: 20 3d 3d 20 30 20 26 26 20 77 72 69 74 74 65 6e == 0 && written
42b0: 20 3d 3d 20 2d 31 29 20 7b 0a 09 09 64 70 72 69 == -1) {...dpri
42c0: 6e 74 66 28 22 49 2f 4f 20 65 72 72 6f 72 20 6f ntf("I/O error o
42d0: 63 63 75 72 72 65 64 20 28 65 72 72 6e 6f 20 3d ccurred (errno =
42e0: 20 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 %lu)", (unsigne
42f0: 64 20 6c 6f 6e 67 29 20 54 63 6c 5f 47 65 74 45 d long) Tcl_GetE
4300: 72 72 6e 6f 28 29 29 3b 0a 09 09 2a 65 72 72 6f rrno());...*erro
4310: 72 43 6f 64 65 50 74 72 20 3d 20 54 63 6c 5f 47 rCodePtr = Tcl_G
4320: 65 74 45 72 72 6e 6f 28 29 3b 0a 09 09 77 72 69 etErrno();...wri
4330: 74 74 65 6e 20 3d 20 2d 31 3b 0a 09 09 54 6c 73 tten = -1;...Tls
4340: 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c _Error(statePtr,
4350: 20 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 45 72 (char *) Tcl_Er
4360: 72 6e 6f 4d 73 67 28 2a 65 72 72 6f 72 43 6f 64 rnoMsg(*errorCod
4370: 65 50 74 72 29 29 3b 0a 0a 09 20 20 20 20 7d 20 ePtr));... }
4380: 65 6c 73 65 20 7b 0a 09 09 64 70 72 69 6e 74 66 else {...dprintf
4390: 28 22 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 ("I/O error occu
43a0: 72 72 65 64 20 28 62 61 63 6b 69 6e 67 45 72 72 rred (backingErr
43b0: 6f 72 20 3d 20 25 6c 75 29 22 2c 20 62 61 63 6b or = %lu)", back
43c0: 69 6e 67 45 72 72 6f 72 29 3b 0a 09 09 2a 65 72 ingError);...*er
43d0: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 54 63 6c rorCodePtr = Tcl
43e0: 5f 47 65 74 45 72 72 6e 6f 28 29 3b 0a 09 09 77 _GetErrno();...w
43f0: 72 69 74 74 65 6e 20 3d 20 2d 31 3b 0a 09 09 54 ritten = -1;...T
4400: 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 ls_Error(statePt
4410: 72 2c 20 28 63 68 61 72 20 2a 29 20 45 52 52 5f r, (char *) ERR_
4420: 72 65 61 73 6f 6e 5f 65 72 72 6f 72 5f 73 74 72 reason_error_str
4430: 69 6e 67 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 ing(backingError
4440: 29 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 ));.. }..
4450: 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20 53 53 break;...case SS
4460: 4c 5f 45 52 52 4f 52 5f 53 53 4c 3a 0a 09 20 20 L_ERROR_SSL:..
4470: 20 20 2f 2a 20 41 20 6e 6f 6e 2d 72 65 63 6f 76 /* A non-recov
4480: 65 72 61 62 6c 65 2c 20 66 61 74 61 6c 20 65 72 erable, fatal er
4490: 72 6f 72 20 69 6e 20 74 68 65 20 53 53 4c 20 6c ror in the SSL l
44a0: 69 62 72 61 72 79 20 6f 63 63 75 72 72 65 64 2c ibrary occurred,
44b0: 20 75 73 75 61 6c 6c 79 20 61 20 70 72 6f 74 6f usually a proto
44c0: 63 6f 6c 20 65 72 72 6f 72 20 2a 2f 0a 09 20 20 col error */..
44d0: 20 20 64 70 72 69 6e 74 66 28 22 53 53 4c 20 65 dprintf("SSL e
44e0: 72 72 6f 72 2c 20 69 6e 64 69 63 61 74 69 6e 67 rror, indicating
44f0: 20 74 68 61 74 20 74 68 65 20 63 6f 6e 6e 65 63 that the connec
4500: 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 61 62 tion has been ab
4510: 6f 72 74 65 64 22 29 3b 0a 09 20 20 20 20 69 66 orted");.. if
4520: 20 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 20 21 (backingError !
4530: 3d 20 30 29 20 7b 0a 09 09 54 6c 73 5f 45 72 72 = 0) {...Tls_Err
4540: 6f 72 28 73 74 61 74 65 50 74 72 2c 20 28 63 68 or(statePtr, (ch
4550: 61 72 20 2a 29 20 45 52 52 5f 72 65 61 73 6f 6e ar *) ERR_reason
4560: 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 62 61 _error_string(ba
4570: 63 6b 69 6e 67 45 72 72 6f 72 29 29 3b 0a 09 20 ckingError));..
4580: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 53 53 } else if (SS
4590: 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 72 65 73 L_get_verify_res
45a0: 75 6c 74 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ult(statePtr->ss
45b0: 6c 29 20 21 3d 20 58 35 30 39 5f 56 5f 4f 4b 29 l) != X509_V_OK)
45c0: 20 7b 0a 09 09 54 6c 73 5f 45 72 72 6f 72 28 73 {...Tls_Error(s
45d0: 74 61 74 65 50 74 72 2c 20 28 63 68 61 72 20 2a tatePtr, (char *
45e0: 29 20 58 35 30 39 5f 76 65 72 69 66 79 5f 63 65 ) X509_verify_ce
45f0: 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 rt_error_string(
4600: 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 72 SSL_get_verify_r
4610: 65 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d 3e esult(statePtr->
4620: 73 73 6c 29 29 29 3b 0a 09 20 20 20 20 7d 20 65 ssl)));.. } e
4630: 6c 73 65 20 7b 0a 09 09 54 6c 73 5f 45 72 72 6f lse {...Tls_Erro
4640: 72 28 73 74 61 74 65 50 74 72 2c 20 22 55 6e 6b r(statePtr, "Unk
4650: 6e 6f 77 6e 20 53 53 4c 20 65 72 72 6f 72 22 29 nown SSL error")
4660: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 2a 65 ;.. }.. *e
4670: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 43 rrorCodePtr = EC
4680: 4f 4e 4e 41 42 4f 52 54 45 44 3b 0a 09 20 20 20 ONNABORTED;..
4690: 20 77 72 69 74 74 65 6e 20 3d 20 2d 31 3b 0a 09 written = -1;..
46a0: 20 20 20 20 62 72 65 61 6b 3b 0a 09 64 65 66 61 break;..defa
46b0: 75 6c 74 3a 0a 09 20 20 20 20 64 70 72 69 6e 74 ult:.. dprint
46c0: 66 28 22 75 6e 6b 6e 6f 77 6e 20 65 72 72 6f 72 f("unknown error
46d0: 3a 20 25 64 22 2c 20 65 72 72 29 3b 0a 09 20 20 : %d", err);..
46e0: 20 20 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 Tls_Error(stat
46f0: 65 50 74 72 2c 20 22 55 6e 6b 6e 6f 77 6e 20 65 ePtr, "Unknown e
4700: 72 72 6f 72 22 29 3b 0a 09 20 20 20 20 62 72 65 rror");.. bre
4710: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 ak;. }.. d
4720: 70 72 69 6e 74 66 28 22 4f 75 74 70 75 74 28 25 printf("Output(%
4730: 64 29 20 2d 3e 20 25 64 22 2c 20 74 6f 57 72 69 d) -> %d", toWri
4740: 74 65 2c 20 77 72 69 74 74 65 6e 29 3b 0a 20 20 te, written);.
4750: 20 20 72 65 74 75 72 6e 28 77 72 69 74 74 65 6e return(written
4760: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d );.}../*. *-----
4770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
47a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
47b0: 2a 0a 20 2a 20 54 6c 73 53 65 74 4f 70 74 69 6f *. * TlsSetOptio
47c0: 6e 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 20 20 nProc --. *. *
47d0: 20 20 53 65 74 73 20 61 6e 20 6f 70 74 69 6f 6e Sets an option
47e0: 20 76 61 6c 75 65 20 66 6f 72 20 61 20 53 53 4c value for a SSL
47f0: 20 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63 68 socket based ch
4800: 61 6e 6e 65 6c 2c 20 6f 72 20 61 0a 20 2a 20 20 annel, or a. *
4810: 20 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 6f 70 list of all op
4820: 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 69 72 20 tions and their
4830: 76 61 6c 75 65 73 2e 0a 20 2a 0a 20 2a 20 52 65 values.. *. * Re
4840: 73 75 6c 74 73 3a 0a 20 2a 20 20 20 20 54 43 4c sults:. * TCL
4850: 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 _OK if successfu
4860: 6c 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 20 69 l or TCL_ERROR i
4870: 66 20 66 61 69 6c 65 64 2e 0a 20 2a 0a 20 2a 20 f failed.. *. *
4880: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
4890: 20 20 20 20 55 70 64 61 74 65 73 20 63 68 61 6e Updates chan
48a0: 6e 65 6c 20 6f 70 74 69 6f 6e 20 74 6f 20 6e 65 nel option to ne
48b0: 77 20 76 61 6c 75 65 2e 0a 20 2a 0a 20 2a 2d 2d w value.. *. *--
48c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
48d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
48e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
48f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4900: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 -. */.static int
4910: 0a 54 6c 73 53 65 74 4f 70 74 69 6f 6e 50 72 6f .TlsSetOptionPro
4920: 63 28 76 6f 69 64 20 2a 69 6e 73 74 61 6e 63 65 c(void *instance
4930: 44 61 74 61 2c 20 20 20 20 2f 2a 20 53 6f 63 6b Data, /* Sock
4940: 65 74 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 20 et state. */.
4950: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
4960: 65 72 70 2c 09 09 2f 2a 20 46 6f 72 20 65 72 72 erp,../* For err
4970: 6f 72 73 20 2d 20 63 61 6e 20 62 65 20 4e 55 4c ors - can be NUL
4980: 4c 2e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 L. */. const
4990: 63 68 61 72 20 2a 6f 70 74 69 6f 6e 4e 61 6d 65 char *optionName
49a0: 2c 09 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 ,./* Name of the
49b0: 20 6f 70 74 69 6f 6e 20 74 6f 20 73 65 74 20 74 option to set t
49c0: 68 65 20 76 61 6c 75 65 20 66 6f 72 2c 20 6f 72 he value for, or
49d0: 0a 09 09 09 09 20 2a 20 4e 55 4c 4c 20 74 6f 20 ..... * NULL to
49e0: 67 65 74 20 61 6c 6c 20 6f 70 74 69 6f 6e 73 20 get all options
49f0: 61 6e 64 20 74 68 65 69 72 20 76 61 6c 75 65 73 and their values
4a00: 2e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 . */. const c
4a10: 68 61 72 20 2a 6f 70 74 69 6f 6e 56 61 6c 75 65 har *optionValue
4a20: 29 09 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 6f )./* Value for o
4a30: 70 74 69 6f 6e 2e 20 2a 2f 0a 7b 0a 20 20 20 20 ption. */.{.
4a40: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 State *statePtr
4a50: 3d 20 28 53 74 61 74 65 20 2a 29 20 69 6e 73 74 = (State *) inst
4a60: 61 6e 63 65 44 61 74 61 3b 0a 0a 20 20 20 20 54 anceData;.. T
4a70: 63 6c 5f 43 68 61 6e 6e 65 6c 20 64 6f 77 6e 43 cl_Channel downC
4a80: 68 61 6e 20 3d 20 54 6c 73 5f 47 65 74 50 61 72 han = Tls_GetPar
4a90: 65 6e 74 28 73 74 61 74 65 50 74 72 2c 20 54 4c ent(statePtr, TL
4aa0: 53 5f 54 43 4c 5f 46 41 53 54 50 41 54 48 29 3b S_TCL_FASTPATH);
4ab0: 0a 20 20 20 20 54 63 6c 5f 44 72 69 76 65 72 53 . Tcl_DriverS
4ac0: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 2a 73 65 etOptionProc *se
4ad0: 74 4f 70 74 69 6f 6e 50 72 6f 63 3b 0a 0a 20 20 tOptionProc;..
4ae0: 20 20 73 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 setOptionProc
4af0: 3d 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 53 65 74 = Tcl_ChannelSet
4b00: 4f 70 74 69 6f 6e 50 72 6f 63 28 54 63 6c 5f 47 OptionProc(Tcl_G
4b10: 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 64 6f etChannelType(do
4b20: 77 6e 43 68 61 6e 29 29 3b 0a 20 20 20 20 69 66 wnChan));. if
4b30: 20 28 73 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 (setOptionProc
4b40: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 != NULL) {..retu
4b50: 72 6e 20 28 2a 73 65 74 4f 70 74 69 6f 6e 50 72 rn (*setOptionPr
4b60: 6f 63 29 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e oc)(Tcl_GetChann
4b70: 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 64 elInstanceData(d
4b80: 6f 77 6e 43 68 61 6e 29 2c 20 69 6e 74 65 72 70 ownChan), interp
4b90: 2c 20 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20 6f 70 , optionName, op
4ba0: 74 69 6f 6e 56 61 6c 75 65 29 3b 0a 20 20 20 20 tionValue);.
4bb0: 7d 20 65 6c 73 65 20 69 66 20 28 6f 70 74 69 6f } else if (optio
4bc0: 6e 4e 61 6d 65 20 3d 3d 20 28 63 68 61 72 2a 29 nName == (char*)
4bd0: 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 0a 09 20 2a NULL) {../*.. *
4be0: 20 52 65 71 75 65 73 74 20 69 73 20 71 75 65 72 Request is quer
4bf0: 79 20 66 6f 72 20 61 6c 6c 20 6f 70 74 69 6f 6e y for all option
4c00: 73 2c 20 74 68 69 73 20 69 73 20 6f 6b 2e 0a 09 s, this is ok...
4c10: 20 2a 2f 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f */..return TCL_
4c20: 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a OK;. }. /*
4c30: 0a 20 20 20 20 20 2a 20 52 65 71 75 65 73 74 20 . * Request
4c40: 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 6f for a specific o
4c50: 70 74 69 6f 6e 20 68 61 73 20 74 6f 20 66 61 69 ption has to fai
4c60: 6c 2c 20 77 65 20 64 6f 6e 27 74 20 68 61 76 65 l, we don't have
4c70: 20 61 6e 79 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 any.. */.
4c80: 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 42 61 64 return Tcl_Bad
4c90: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e ChannelOption(in
4ca0: 74 65 72 70 2c 20 6f 70 74 69 6f 6e 4e 61 6d 65 terp, optionName
4cb0: 2c 20 22 22 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d , "");.}../*. *-
4cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4d00: 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 47 65 74 4f --. *. * TlsGetO
4d10: 70 74 69 6f 6e 50 72 6f 63 20 2d 2d 0a 20 2a 0a ptionProc --. *.
4d20: 20 2a 20 20 20 20 47 65 74 73 20 61 6e 20 6f 70 * Gets an op
4d30: 74 69 6f 6e 20 76 61 6c 75 65 20 66 6f 72 20 61 tion value for a
4d40: 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 SSL socket base
4d50: 64 20 63 68 61 6e 6e 65 6c 2c 20 6f 72 20 61 0a d channel, or a.
4d60: 20 2a 20 20 20 20 6c 69 73 74 20 6f 66 20 61 6c * list of al
4d70: 6c 20 6f 70 74 69 6f 6e 73 20 61 6e 64 20 74 68 l options and th
4d80: 65 69 72 20 76 61 6c 75 65 73 2e 0a 20 2a 0a 20 eir values.. *.
4d90: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 20 20 20 * Results:. *
4da0: 20 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 A standard Tcl
4db0: 72 65 73 75 6c 74 2e 20 54 68 65 20 76 61 6c 75 result. The valu
4dc0: 65 20 6f 66 20 74 68 65 20 73 70 65 63 69 66 69 e of the specifi
4dd0: 65 64 20 6f 70 74 69 6f 6e 20 6f 72 20 61 0a 20 ed option or a.
4de0: 2a 20 20 20 20 6c 69 73 74 20 6f 66 20 61 6c 6c * list of all
4df0: 20 6f 70 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 options and the
4e00: 69 72 20 76 61 6c 75 65 73 20 69 73 20 72 65 74 ir values is ret
4e10: 75 72 6e 65 64 20 69 6e 20 74 68 65 0a 20 2a 20 urned in the. *
4e20: 20 20 20 73 75 70 70 6c 69 65 64 20 44 53 74 72 supplied DStr
4e30: 69 6e 67 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 ing.. *. * Side
4e40: 65 66 66 65 63 74 73 3a 0a 20 2a 20 20 20 20 4e effects:. * N
4e50: 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d one.. *. *------
4e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
4ea0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 54 6c 73 /.static int.Tls
4eb0: 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63 28 0a 20 GetOptionProc(.
4ec0: 20 20 20 76 6f 69 64 20 2a 69 6e 73 74 61 6e 63 void *instanc
4ed0: 65 44 61 74 61 2c 09 2f 2a 20 53 6f 63 6b 65 74 eData,./* Socket
4ee0: 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 20 20 54 state. */. T
4ef0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
4f00: 70 2c 09 09 2f 2a 20 46 6f 72 20 65 72 72 6f 72 p,../* For error
4f10: 73 20 2d 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e s - can be NULL.
4f20: 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 */. const ch
4f30: 61 72 20 2a 6f 70 74 69 6f 6e 4e 61 6d 65 2c 09 ar *optionName,.
4f40: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f /* Name of the o
4f50: 70 74 69 6f 6e 20 74 6f 20 72 65 74 72 69 65 76 ption to retriev
4f60: 65 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 2c e the value for,
4f70: 20 6f 72 0a 09 09 09 09 20 2a 20 4e 55 4c 4c 20 or..... * NULL
4f80: 74 6f 20 67 65 74 20 61 6c 6c 20 6f 70 74 69 6f to get all optio
4f90: 6e 73 20 61 6e 64 20 74 68 65 69 72 20 76 61 6c ns and their val
4fa0: 75 65 73 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f ues. */. Tcl_
4fb0: 44 53 74 72 69 6e 67 20 2a 6f 70 74 69 6f 6e 56 DString *optionV
4fc0: 61 6c 75 65 29 09 2f 2a 20 57 68 65 72 65 20 74 alue)./* Where t
4fd0: 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f 6d 70 o store the comp
4fe0: 75 74 65 64 20 76 61 6c 75 65 20 69 6e 69 74 69 uted value initi
4ff0: 61 6c 69 7a 65 64 20 62 79 20 63 61 6c 6c 65 72 alized by caller
5000: 2e 20 2a 2f 0a 7b 0a 20 20 20 20 53 74 61 74 65 . */.{. State
5010: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 *statePtr = (St
5020: 61 74 65 20 2a 29 20 69 6e 73 74 61 6e 63 65 44 ate *) instanceD
5030: 61 74 61 3b 0a 0a 20 20 20 20 54 63 6c 5f 43 68 ata;.. Tcl_Ch
5040: 61 6e 6e 65 6c 20 64 6f 77 6e 43 68 61 6e 20 3d annel downChan =
5050: 20 54 6c 73 5f 47 65 74 50 61 72 65 6e 74 28 73 Tls_GetParent(s
5060: 74 61 74 65 50 74 72 2c 20 54 4c 53 5f 54 43 4c tatePtr, TLS_TCL
5070: 5f 46 41 53 54 50 41 54 48 29 3b 0a 20 20 20 20 _FASTPATH);.
5080: 54 63 6c 5f 44 72 69 76 65 72 47 65 74 4f 70 74 Tcl_DriverGetOpt
5090: 69 6f 6e 50 72 6f 63 20 2a 67 65 74 4f 70 74 69 ionProc *getOpti
50a0: 6f 6e 50 72 6f 63 3b 0a 0a 20 20 20 20 67 65 74 onProc;.. get
50b0: 4f 70 74 69 6f 6e 50 72 6f 63 20 3d 20 54 63 6c OptionProc = Tcl
50c0: 5f 43 68 61 6e 6e 65 6c 47 65 74 4f 70 74 69 6f _ChannelGetOptio
50d0: 6e 50 72 6f 63 28 54 63 6c 5f 47 65 74 43 68 61 nProc(Tcl_GetCha
50e0: 6e 6e 65 6c 54 79 70 65 28 64 6f 77 6e 43 68 61 nnelType(downCha
50f0: 6e 29 29 3b 0a 20 20 20 20 69 66 20 28 67 65 74 n));. if (get
5100: 4f 70 74 69 6f 6e 50 72 6f 63 20 21 3d 20 4e 55 OptionProc != NU
5110: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 28 2a LL) {..return (*
5120: 67 65 74 4f 70 74 69 6f 6e 50 72 6f 63 29 28 54 getOptionProc)(T
5130: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 cl_GetChannelIns
5140: 74 61 6e 63 65 44 61 74 61 28 64 6f 77 6e 43 68 tanceData(downCh
5150: 61 6e 29 2c 20 69 6e 74 65 72 70 2c 20 6f 70 74 an), interp, opt
5160: 69 6f 6e 4e 61 6d 65 2c 20 6f 70 74 69 6f 6e 56 ionName, optionV
5170: 61 6c 75 65 29 3b 0a 20 20 20 20 7d 20 65 6c 73 alue);. } els
5180: 65 20 69 66 20 28 6f 70 74 69 6f 6e 4e 61 6d 65 e if (optionName
5190: 20 3d 3d 20 28 63 68 61 72 2a 29 20 4e 55 4c 4c == (char*) NULL
51a0: 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 52 65 71 75 ) {../*.. * Requ
51b0: 65 73 74 20 69 73 20 71 75 65 72 79 20 66 6f 72 est is query for
51c0: 20 61 6c 6c 20 6f 70 74 69 6f 6e 73 2c 20 74 68 all options, th
51d0: 69 73 20 69 73 20 6f 6b 2e 0a 09 20 2a 2f 0a 09 is is ok... */..
51e0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 return TCL_OK;.
51f0: 20 20 20 7d 0a 20 20 20 20 2f 2a 0a 20 20 20 20 }. /*.
5200: 20 2a 20 52 65 71 75 65 73 74 20 66 6f 72 20 61 * Request for a
5210: 20 73 70 65 63 69 66 69 63 20 6f 70 74 69 6f 6e specific option
5220: 20 68 61 73 20 74 6f 20 66 61 69 6c 2c 20 77 65 has to fail, we
5230: 20 64 6f 6e 27 74 20 68 61 76 65 20 61 6e 79 2e don't have any.
5240: 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 74 . */. ret
5250: 75 72 6e 20 54 63 6c 5f 42 61 64 43 68 61 6e 6e urn Tcl_BadChann
5260: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c elOption(interp,
5270: 20 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20 22 22 29 optionName, "")
5280: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
52d0: 0a 20 2a 20 54 6c 73 57 61 74 63 68 50 72 6f 63 . * TlsWatchProc
52e0: 20 2d 2d 0a 20 2a 0a 20 2a 20 20 20 20 49 6e 69 --. *. * Ini
52f0: 74 69 61 6c 69 7a 65 20 74 68 65 20 6e 6f 74 69 tialize the noti
5300: 66 69 65 72 20 74 6f 20 77 61 74 63 68 20 54 63 fier to watch Tc
5310: 6c 5f 46 69 6c 65 73 20 66 72 6f 6d 20 74 68 69 l_Files from thi
5320: 73 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a s channel.. *. *
5330: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 20 20 20 20 Results:. *
5340: 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 None.. *. * Side
5350: 20 65 66 66 65 63 74 73 3a 0a 20 2a 20 20 20 20 effects:. *
5360: 53 65 74 73 20 75 70 20 74 68 65 20 6e 6f 74 69 Sets up the noti
5370: 66 69 65 72 20 73 6f 20 74 68 61 74 20 61 20 66 fier so that a f
5380: 75 74 75 72 65 20 65 76 65 6e 74 20 6f 6e 20 74 uture event on t
5390: 68 65 20 63 68 61 6e 6e 65 6c 0a 20 2a 20 20 20 he channel. *
53a0: 20 77 69 6c 6c 20 62 65 20 73 65 65 6e 20 62 79 will be seen by
53b0: 20 54 63 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d Tcl.. *. *-----
53c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
53d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
53e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
53f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
5400: 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a */..static void.
5410: 54 6c 73 57 61 74 63 68 50 72 6f 63 28 0a 20 20 TlsWatchProc(.
5420: 20 20 76 6f 69 64 20 2a 69 6e 73 74 61 6e 63 65 void *instance
5430: 44 61 74 61 2c 20 20 20 20 2f 2a 20 54 68 65 20 Data, /* The
5440: 73 6f 63 6b 65 74 20 73 74 61 74 65 2e 20 2a 2f socket state. */
5450: 0a 20 20 20 20 69 6e 74 20 6d 61 73 6b 29 09 09 . int mask)..
5460: 09 2f 2a 20 45 76 65 6e 74 73 20 6f 66 20 69 6e ./* Events of in
5470: 74 65 72 65 73 74 3b 20 61 6e 20 4f 52 2d 65 64 terest; an OR-ed
5480: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 0a combination of.
5490: 09 09 09 09 20 2a 20 54 43 4c 5f 52 45 41 44 41 .... * TCL_READA
54a0: 42 4c 45 2c 20 54 43 4c 5f 57 52 49 54 41 42 4c BLE, TCL_WRITABL
54b0: 45 20 61 6e 64 20 54 43 4c 5f 45 58 43 45 50 54 E and TCL_EXCEPT
54c0: 49 4f 4e 2e 20 2a 2f 0a 7b 0a 20 20 20 20 54 63 ION. */.{. Tc
54d0: 6c 5f 43 68 61 6e 6e 65 6c 20 20 20 20 20 64 6f l_Channel do
54e0: 77 6e 43 68 61 6e 3b 0a 20 20 20 20 53 74 61 74 wnChan;. Stat
54f0: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 e *statePtr = (S
5500: 74 61 74 65 20 2a 29 20 69 6e 73 74 61 6e 63 65 tate *) instance
5510: 44 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f 44 72 Data;. Tcl_Dr
5520: 69 76 65 72 57 61 74 63 68 50 72 6f 63 20 2a 77 iverWatchProc *w
5530: 61 74 63 68 50 72 6f 63 3b 0a 0a 20 20 20 20 64 atchProc;.. d
5540: 70 72 69 6e 74 66 28 22 54 6c 73 57 61 74 63 68 printf("TlsWatch
5550: 50 72 6f 63 28 30 78 25 78 29 22 2c 20 6d 61 73 Proc(0x%x)", mas
5560: 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 65 74 k);.. /* Pret
5570: 65 6e 64 20 74 6f 20 62 65 20 64 65 61 64 20 61 end to be dead a
5580: 73 20 6c 6f 6e 67 20 61 73 20 74 68 65 20 76 65 s long as the ve
5590: 72 69 66 79 20 63 61 6c 6c 62 61 63 6b 20 69 73 rify callback is
55a0: 20 72 75 6e 6e 69 6e 67 2e 0a 20 20 20 20 20 2a running.. *
55b0: 20 4f 74 68 65 72 77 69 73 65 20 74 68 61 74 20 Otherwise that
55c0: 63 61 6c 6c 62 61 63 6b 20 63 6f 75 6c 64 20 62 callback could b
55d0: 65 20 69 6e 76 6f 6b 65 64 20 72 65 63 75 72 73 e invoked recurs
55e0: 69 76 65 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66 ively. */. if
55f0: 20 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 (statePtr->flag
5600: 73 20 26 20 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c s & TLS_TCL_CALL
5610: 42 41 43 4b 29 20 7b 0a 09 64 70 72 69 6e 74 66 BACK) {..dprintf
5620: 28 22 43 61 6c 6c 62 61 63 6b 20 69 73 20 6f 6e ("Callback is on
5630: 2d 67 6f 69 6e 67 2c 20 64 6f 69 6e 67 20 6e 6f -going, doing no
5640: 74 68 69 6e 67 22 29 3b 0a 09 72 65 74 75 72 6e thing");..return
5650: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 ;. }.. dpr
5660: 69 6e 74 46 6c 61 67 73 28 73 74 61 74 65 50 74 intFlags(statePt
5670: 72 29 3b 0a 0a 20 20 20 20 64 6f 77 6e 43 68 61 r);.. downCha
5680: 6e 20 3d 20 54 6c 73 5f 47 65 74 50 61 72 65 6e n = Tls_GetParen
5690: 74 28 73 74 61 74 65 50 74 72 2c 20 54 4c 53 5f t(statePtr, TLS_
56a0: 54 43 4c 5f 46 41 53 54 50 41 54 48 29 3b 0a 0a TCL_FASTPATH);..
56b0: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
56c0: 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 ->flags & TLS_TC
56d0: 4c 5f 48 41 4e 44 53 48 41 4b 45 5f 46 41 49 4c L_HANDSHAKE_FAIL
56e0: 45 44 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 ED) {..dprintf("
56f0: 41 73 6b 65 64 20 74 6f 20 77 61 74 63 68 20 61 Asked to watch a
5700: 20 73 6f 63 6b 65 74 20 77 69 74 68 20 61 20 66 socket with a f
5710: 61 69 6c 65 64 20 68 61 6e 64 73 68 61 6b 65 20 ailed handshake
5720: 2d 2d 20 6e 6f 74 68 69 6e 67 20 63 61 6e 20 68 -- nothing can h
5730: 61 70 70 65 6e 20 68 65 72 65 22 29 3b 0a 09 64 appen here");..d
5740: 70 72 69 6e 74 66 28 22 55 6e 72 65 67 69 73 74 printf("Unregist
5750: 65 72 69 6e 67 20 69 6e 74 65 72 65 73 74 20 69 ering interest i
5760: 6e 20 74 68 65 20 6c 6f 77 65 72 20 63 68 61 6e n the lower chan
5770: 6e 65 6c 22 29 3b 0a 0a 09 77 61 74 63 68 50 72 nel");...watchPr
5780: 6f 63 20 3d 20 54 63 6c 5f 43 68 61 6e 6e 65 6c oc = Tcl_Channel
5790: 57 61 74 63 68 50 72 6f 63 28 54 63 6c 5f 47 65 WatchProc(Tcl_Ge
57a0: 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 64 6f 77 tChannelType(dow
57b0: 6e 43 68 61 6e 29 29 3b 0a 09 77 61 74 63 68 50 nChan));..watchP
57c0: 72 6f 63 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e roc(Tcl_GetChann
57d0: 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 64 elInstanceData(d
57e0: 6f 77 6e 43 68 61 6e 29 2c 20 30 29 3b 0a 09 73 ownChan), 0);..s
57f0: 74 61 74 65 50 74 72 2d 3e 77 61 74 63 68 4d 61 tatePtr->watchMa
5800: 73 6b 20 3d 20 30 3b 0a 09 72 65 74 75 72 6e 3b sk = 0;..return;
5810: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 74 61 74 . }.. stat
5820: 65 50 74 72 2d 3e 77 61 74 63 68 4d 61 73 6b 20 ePtr->watchMask
5830: 3d 20 6d 61 73 6b 3b 0a 0a 20 20 20 20 2f 2a 20 = mask;.. /*
5840: 4e 6f 20 63 68 61 6e 6e 65 6c 20 68 61 6e 64 6c No channel handl
5850: 65 72 73 20 61 6e 79 20 6d 6f 72 65 2e 20 57 65 ers any more. We
5860: 20 77 69 6c 6c 20 62 65 20 6e 6f 74 69 66 69 65 will be notifie
5870: 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a d automatically.
5880: 20 20 20 20 20 2a 20 61 62 6f 75 74 20 65 76 65 * about eve
5890: 6e 74 73 20 6f 6e 20 74 68 65 20 63 68 61 6e 6e nts on the chann
58a0: 65 6c 20 62 65 6c 6f 77 20 76 69 61 20 61 20 63 el below via a c
58b0: 61 6c 6c 20 74 6f 20 6f 75 72 0a 20 20 20 20 20 all to our.
58c0: 2a 20 27 54 72 61 6e 73 66 6f 72 6d 4e 6f 74 69 * 'TransformNoti
58d0: 66 79 50 72 6f 63 27 2e 20 42 75 74 20 77 65 20 fyProc'. But we
58e0: 68 61 76 65 20 74 6f 20 70 61 73 73 20 74 68 65 have to pass the
58f0: 20 69 6e 74 65 72 65 73 74 20 64 6f 77 6e 20 6e interest down n
5900: 6f 77 2e 0a 20 20 20 20 20 2a 20 57 65 20 61 72 ow.. * We ar
5910: 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 61 64 64 e allowed to add
5920: 20 61 64 64 69 74 69 6f 6e 61 6c 20 27 69 6e 74 additional 'int
5930: 65 72 65 73 74 27 20 74 6f 20 74 68 65 20 6d 61 erest' to the ma
5940: 73 6b 20 69 66 20 77 65 20 77 61 6e 74 0a 20 20 sk if we want.
5950: 20 20 20 2a 20 74 6f 2e 20 42 75 74 20 74 68 69 * to. But thi
5960: 73 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e s transformation
5970: 20 68 61 73 20 6e 6f 20 73 75 63 68 20 69 6e 74 has no such int
5980: 65 72 65 73 74 2e 20 49 74 20 6a 75 73 74 20 70 erest. It just p
5990: 61 73 73 65 73 0a 20 20 20 20 20 2a 20 74 68 65 asses. * the
59a0: 20 72 65 71 75 65 73 74 20 64 6f 77 6e 2c 20 75 request down, u
59b0: 6e 63 68 61 6e 67 65 64 2e 0a 20 20 20 20 20 2a nchanged.. *
59c0: 2f 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 /. dprintf("R
59d0: 65 67 69 73 74 65 72 69 6e 67 20 6f 75 72 20 69 egistering our i
59e0: 6e 74 65 72 65 73 74 20 69 6e 20 74 68 65 20 6c nterest in the l
59f0: 6f 77 65 72 20 63 68 61 6e 6e 65 6c 20 28 63 68 ower channel (ch
5a00: 61 6e 3d 25 70 29 22 2c 20 28 76 6f 69 64 20 2a an=%p)", (void *
5a10: 29 20 64 6f 77 6e 43 68 61 6e 29 3b 0a 20 20 20 ) downChan);.
5a20: 20 77 61 74 63 68 50 72 6f 63 20 3d 20 54 63 6c watchProc = Tcl
5a30: 5f 43 68 61 6e 6e 65 6c 57 61 74 63 68 50 72 6f _ChannelWatchPro
5a40: 63 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c c(Tcl_GetChannel
5a50: 54 79 70 65 28 64 6f 77 6e 43 68 61 6e 29 29 3b Type(downChan));
5a60: 0a 20 20 20 20 77 61 74 63 68 50 72 6f 63 28 54 . watchProc(T
5a70: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 cl_GetChannelIns
5a80: 74 61 6e 63 65 44 61 74 61 28 64 6f 77 6e 43 68 tanceData(downCh
5a90: 61 6e 29 2c 20 6d 61 73 6b 29 3b 0a 0a 0a 20 20 an), mask);...
5aa0: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 4d 61 6e 61 /*. * Mana
5ab0: 67 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 69 6e gement of the in
5ac0: 74 65 72 6e 61 6c 20 74 69 6d 65 72 2e 0a 20 20 ternal timer..
5ad0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 */. if (st
5ae0: 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d atePtr->timer !=
5af0: 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e (Tcl_TimerToken
5b00: 29 20 4e 55 4c 4c 29 20 7b 0a 09 64 70 72 69 6e ) NULL) {..dprin
5b10: 74 66 28 22 41 20 74 69 6d 65 72 20 77 61 73 20 tf("A timer was
5b20: 66 6f 75 6e 64 2c 20 64 65 6c 65 74 69 6e 67 20 found, deleting
5b30: 69 74 22 29 3b 0a 09 54 63 6c 5f 44 65 6c 65 74 it");..Tcl_Delet
5b40: 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 73 74 eTimerHandler(st
5b50: 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 29 3b 0a atePtr->timer);.
5b60: 09 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 .statePtr->timer
5b70: 20 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b = (Tcl_TimerTok
5b80: 65 6e 29 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a en) NULL;. }.
5b90: 0a 20 20 20 20 69 66 20 28 28 6d 61 73 6b 20 26 . if ((mask &
5ba0: 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 29 20 26 TCL_READABLE) &
5bb0: 26 0a 09 28 28 54 63 6c 5f 49 6e 70 75 74 42 75 &..((Tcl_InputBu
5bc0: 66 66 65 72 65 64 28 73 74 61 74 65 50 74 72 2d ffered(statePtr-
5bd0: 3e 73 65 6c 66 29 20 3e 20 30 29 20 7c 7c 20 28 >self) > 0) || (
5be0: 42 49 4f 5f 63 74 72 6c 5f 70 65 6e 64 69 6e 67 BIO_ctrl_pending
5bf0: 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 20 (statePtr->bio)
5c00: 3e 20 30 29 29 29 20 7b 0a 09 2f 2a 0a 09 20 2a > 0))) {../*.. *
5c10: 20 54 68 65 72 65 20 69 73 20 69 6e 74 65 72 65 There is intere
5c20: 73 74 20 69 6e 20 72 65 61 64 61 62 6c 65 20 65 st in readable e
5c30: 76 65 6e 74 73 20 61 6e 64 20 77 65 20 61 63 74 vents and we act
5c40: 75 61 6c 6c 79 20 68 61 76 65 0a 09 20 2a 20 64 ually have.. * d
5c50: 61 74 61 20 77 61 69 74 69 6e 67 2c 20 73 6f 20 ata waiting, so
5c60: 67 65 6e 65 72 61 74 65 20 61 20 74 69 6d 65 72 generate a timer
5c70: 20 74 6f 20 66 6c 75 73 68 20 74 68 61 74 2e 0a to flush that..
5c80: 09 20 2a 2f 0a 09 64 70 72 69 6e 74 66 28 22 43 . */..dprintf("C
5c90: 72 65 61 74 69 6e 67 20 61 20 6e 65 77 20 74 69 reating a new ti
5ca0: 6d 65 72 20 73 69 6e 63 65 20 64 61 74 61 20 61 mer since data a
5cb0: 70 70 65 61 72 73 20 74 6f 20 62 65 20 77 61 69 ppears to be wai
5cc0: 74 69 6e 67 22 29 3b 0a 09 73 74 61 74 65 50 74 ting");..statePt
5cd0: 72 2d 3e 74 69 6d 65 72 20 3d 20 54 63 6c 5f 43 r->timer = Tcl_C
5ce0: 72 65 61 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 reateTimerHandle
5cf0: 72 28 54 4c 53 5f 54 43 4c 5f 44 45 4c 41 59 2c r(TLS_TCL_DELAY,
5d00: 20 54 6c 73 43 68 61 6e 6e 65 6c 48 61 6e 64 6c TlsChannelHandl
5d10: 65 72 54 69 6d 65 72 2c 20 73 74 61 74 65 50 74 erTimer, statePt
5d20: 72 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 2f 2a 0a r);. }.}../*.
5d30: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
5d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5d70: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 47 -----. *. * TlsG
5d80: 65 74 48 61 6e 64 6c 65 50 72 6f 63 20 2d 2d 0a etHandleProc --.
5d90: 20 2a 0a 20 2a 20 20 20 20 43 61 6c 6c 65 64 20 *. * Called
5da0: 66 72 6f 6d 20 54 63 6c 5f 47 65 74 43 68 61 6e from Tcl_GetChan
5db0: 6e 65 6c 46 69 6c 65 20 74 6f 20 72 65 74 72 69 nelFile to retri
5dc0: 65 76 65 20 6f 2f 73 20 66 69 6c 65 20 68 61 6e eve o/s file han
5dd0: 64 6c 65 72 0a 20 2a 20 20 20 20 66 72 6f 6d 20 dler. * from
5de0: 74 68 65 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 the SSL socket b
5df0: 61 73 65 64 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a ased channel.. *
5e00: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 20 . * Results:. *
5e10: 20 20 20 54 68 65 20 61 70 70 72 6f 70 72 69 61 The appropria
5e20: 74 65 20 54 63 6c 5f 46 69 6c 65 20 68 61 6e 64 te Tcl_File hand
5e30: 6c 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f le or NULL if no
5e40: 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 ne.. *. * Side e
5e50: 66 66 65 63 74 73 3a 0a 20 2a 20 20 20 20 4e 6f ffects:. * No
5e60: 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ne.. *. *-------
5e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
5eb0: 0a 73 74 61 74 69 63 20 69 6e 74 20 54 6c 73 47 .static int TlsG
5ec0: 65 74 48 61 6e 64 6c 65 50 72 6f 63 28 0a 20 20 etHandleProc(.
5ed0: 20 20 76 6f 69 64 20 2a 69 6e 73 74 61 6e 63 65 void *instance
5ee0: 44 61 74 61 2c 20 20 20 20 2f 2a 20 53 6f 63 6b Data, /* Sock
5ef0: 65 74 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 20 et state. */.
5f00: 20 69 6e 74 20 64 69 72 65 63 74 69 6f 6e 2c 09 int direction,.
5f10: 09 2f 2a 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 ./* TCL_READABLE
5f20: 20 6f 72 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 or TCL_WRITABLE
5f30: 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 2a 68 */. void **h
5f40: 61 6e 64 6c 65 50 74 72 29 09 2f 2a 20 48 61 6e andlePtr)./* Han
5f50: 64 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 dle associated w
5f60: 69 74 68 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 ith the channel
5f70: 2a 2f 0a 7b 0a 20 20 20 20 53 74 61 74 65 20 2a */.{. State *
5f80: 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 statePtr = (Stat
5f90: 65 20 2a 29 69 6e 73 74 61 6e 63 65 44 61 74 61 e *)instanceData
5fa0: 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 28 54 63 ;.. return(Tc
5fb0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 48 61 6e 64 l_GetChannelHand
5fc0: 6c 65 28 54 6c 73 5f 47 65 74 50 61 72 65 6e 74 le(Tls_GetParent
5fd0: 28 73 74 61 74 65 50 74 72 2c 20 54 4c 53 5f 54 (statePtr, TLS_T
5fe0: 43 4c 5f 46 41 53 54 50 41 54 48 29 2c 20 64 69 CL_FASTPATH), di
5ff0: 72 65 63 74 69 6f 6e 2c 20 68 61 6e 64 6c 65 50 rection, handleP
6000: 74 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d tr));.}../*. *--
6010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6050: 2d 0a 20 2a 0a 20 2a 20 54 6c 73 4e 6f 74 69 66 -. *. * TlsNotif
6060: 79 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 20 20 yProc --. *. *
6070: 20 20 48 61 6e 64 6c 65 72 20 63 61 6c 6c 65 64 Handler called
6080: 20 62 79 20 54 63 6c 20 74 6f 20 69 6e 66 6f 72 by Tcl to infor
6090: 6d 20 75 73 20 6f 66 20 61 63 74 69 76 69 74 79 m us of activity
60a0: 0a 20 2a 20 20 20 20 6f 6e 20 74 68 65 20 75 6e . * on the un
60b0: 64 65 72 6c 79 69 6e 67 20 63 68 61 6e 6e 65 6c derlying channel
60c0: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
60d0: 0a 20 2a 20 20 20 20 54 79 70 65 20 6f 66 20 65 . * Type of e
60e0: 76 65 6e 74 20 6f 72 20 30 20 69 66 20 66 61 69 vent or 0 if fai
60f0: 6c 65 64 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 led. *. * Side e
6100: 66 66 65 63 74 73 3a 0a 20 2a 20 20 20 20 4d 61 ffects:. * Ma
6110: 79 20 70 72 6f 63 65 73 73 20 74 68 65 20 69 6e y process the in
6120: 63 6f 6d 69 6e 67 20 65 76 65 6e 74 20 62 79 20 coming event by
6130: 69 74 73 65 6c 66 2e 0a 20 2a 0a 20 2a 2d 2d 2d itself.. *. *---
6140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6180: 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 . */..static int
6190: 20 54 6c 73 4e 6f 74 69 66 79 50 72 6f 63 28 0a TlsNotifyProc(.
61a0: 20 20 20 20 76 6f 69 64 20 2a 69 6e 73 74 61 6e void *instan
61b0: 63 65 44 61 74 61 2c 20 20 20 20 2f 2a 20 53 6f ceData, /* So
61c0: 63 6b 65 74 20 73 74 61 74 65 2e 20 2a 2f 0a 20 cket state. */.
61d0: 20 20 20 69 6e 74 20 6d 61 73 6b 29 09 09 09 2f int mask).../
61e0: 2a 20 74 79 70 65 20 6f 66 20 65 76 65 6e 74 20 * type of event
61f0: 74 68 61 74 20 6f 63 63 75 72 72 65 64 3a 0a 09 that occurred:..
6200: 09 09 09 20 2a 20 4f 52 2d 65 64 20 63 6f 6d 62 ... * OR-ed comb
6210: 69 6e 61 74 69 6f 6e 20 6f 66 20 54 43 4c 5f 52 ination of TCL_R
6220: 45 41 44 41 42 4c 45 20 6f 72 20 54 43 4c 5f 57 EADABLE or TCL_W
6230: 52 49 54 41 42 4c 45 20 2a 2f 0a 7b 0a 20 20 20 RITABLE */.{.
6240: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 State *statePtr
6250: 20 3d 20 28 53 74 61 74 65 20 2a 29 69 6e 73 74 = (State *)inst
6260: 61 6e 63 65 44 61 74 61 3b 0a 20 20 20 20 69 6e anceData;. in
6270: 74 20 65 72 72 6f 72 43 6f 64 65 3b 0a 0a 20 20 t errorCode;..
6280: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 41 6e 20 65 /*. * An e
6290: 76 65 6e 74 20 6f 63 63 75 72 72 65 64 20 69 6e vent occurred in
62a0: 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 the underlying
62b0: 63 68 61 6e 6e 65 6c 2e 20 20 54 68 69 73 0a 20 channel. This.
62c0: 20 20 20 20 2a 20 74 72 61 6e 73 66 6f 72 6d 61 * transforma
62d0: 74 69 6f 6e 20 64 6f 65 73 6e 27 74 20 70 72 6f tion doesn't pro
62e0: 63 65 73 73 20 73 75 63 68 20 65 76 65 6e 74 73 cess such events
62f0: 20 74 68 75 73 20 72 65 74 75 72 6e 73 20 74 68 thus returns th
6300: 65 0a 20 20 20 20 20 2a 20 69 6e 63 6f 6d 69 6e e. * incomin
6310: 67 20 6d 61 73 6b 20 75 6e 63 68 61 6e 67 65 64 g mask unchanged
6320: 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 .. */. if
6330: 20 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 (statePtr->time
6340: 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 r != (Tcl_TimerT
6350: 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 2f oken) NULL) {../
6360: 2a 0a 09 20 2a 20 44 65 6c 65 74 65 20 61 6e 20 *.. * Delete an
6370: 65 78 69 73 74 69 6e 67 20 74 69 6d 65 72 2e 20 existing timer.
6380: 49 74 20 77 61 73 20 6e 6f 74 20 66 69 72 65 64 It was not fired
6390: 2c 20 79 65 74 20 77 65 20 61 72 65 0a 09 20 2a , yet we are.. *
63a0: 20 68 65 72 65 2c 20 73 6f 20 74 68 65 20 63 68 here, so the ch
63b0: 61 6e 6e 65 6c 20 62 65 6c 6f 77 20 67 65 6e 65 annel below gene
63c0: 72 61 74 65 64 20 73 75 63 68 20 61 6e 20 65 76 rated such an ev
63d0: 65 6e 74 20 61 6e 64 20 77 65 0a 09 20 2a 20 64 ent and we.. * d
63e0: 6f 6e 27 74 20 68 61 76 65 20 74 6f 2e 20 54 68 on't have to. Th
63f0: 65 20 72 65 6e 65 77 61 6c 20 6f 66 20 74 68 65 e renewal of the
6400: 20 69 6e 74 65 72 65 73 74 20 61 66 74 65 72 20 interest after
6410: 74 68 65 0a 09 20 2a 20 65 78 65 63 75 74 69 6f the.. * executio
6420: 6e 20 6f 66 20 63 68 61 6e 6e 65 6c 20 68 61 6e n of channel han
6430: 64 6c 65 72 73 20 77 69 6c 6c 20 65 76 65 6e 74 dlers will event
6440: 75 61 6c 6c 79 20 63 61 75 73 65 20 75 73 20 74 ually cause us t
6450: 6f 0a 09 20 2a 20 72 65 63 72 65 61 74 65 20 74 o.. * recreate t
6460: 68 65 20 74 69 6d 65 72 20 28 69 6e 20 57 61 74 he timer (in Wat
6470: 63 68 50 72 6f 63 29 2e 0a 09 20 2a 2f 0a 09 54 chProc)... */..T
6480: 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 61 cl_DeleteTimerHa
6490: 6e 64 6c 65 72 28 73 74 61 74 65 50 74 72 2d 3e ndler(statePtr->
64a0: 74 69 6d 65 72 29 3b 0a 09 73 74 61 74 65 50 74 timer);..statePt
64b0: 72 2d 3e 74 69 6d 65 72 20 3d 20 28 54 63 6c 5f r->timer = (Tcl_
64c0: 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c TimerToken) NULL
64d0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 ;. }.. if
64e0: 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 (statePtr->flags
64f0: 20 26 20 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 & TLS_TCL_CALLB
6500: 41 43 4b 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 ACK) {..dprintf(
6510: 22 52 65 74 75 72 6e 69 6e 67 20 30 20 64 75 65 "Returning 0 due
6520: 20 74 6f 20 63 61 6c 6c 62 61 63 6b 22 29 3b 0a to callback");.
6530: 09 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d .return 0;. }
6540: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
6550: 61 6c 6c 69 6e 67 20 54 6c 73 5f 57 61 69 74 46 alling Tls_WaitF
6560: 6f 72 43 6f 6e 6e 65 63 74 22 29 3b 0a 20 20 20 orConnect");.
6570: 20 65 72 72 6f 72 43 6f 64 65 20 3d 20 30 3b 0a errorCode = 0;.
6580: 20 20 20 20 69 66 20 28 54 6c 73 5f 57 61 69 74 if (Tls_Wait
6590: 46 6f 72 43 6f 6e 6e 65 63 74 28 73 74 61 74 65 ForConnect(state
65a0: 50 74 72 2c 20 26 65 72 72 6f 72 43 6f 64 65 2c Ptr, &errorCode,
65b0: 20 31 29 20 3c 20 30 29 20 7b 0a 09 54 6c 73 5f 1) < 0) {..Tls_
65c0: 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20 Error(statePtr,
65d0: 73 74 72 65 72 72 6f 72 28 65 72 72 6f 72 43 6f strerror(errorCo
65e0: 64 65 29 29 3b 0a 09 69 66 20 28 65 72 72 6f 72 de));..if (error
65f0: 43 6f 64 65 20 3d 3d 20 45 41 47 41 49 4e 29 20 Code == EAGAIN)
6600: 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 {.. dprintf("
6610: 41 73 79 6e 63 20 66 6c 61 67 20 63 6f 75 6c 64 Async flag could
6620: 20 62 65 20 73 65 74 20 28 64 69 64 6e 27 74 20 be set (didn't
6630: 63 68 65 63 6b 29 20 61 6e 64 20 65 72 72 6f 72 check) and error
6640: 43 6f 64 65 20 3d 3d 20 45 41 47 41 49 4e 3a 20 Code == EAGAIN:
6650: 20 52 65 74 75 72 6e 69 6e 67 20 30 22 29 3b 0a Returning 0");.
6660: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a .. return 0;.
6670: 09 7d 0a 0a 09 64 70 72 69 6e 74 66 28 22 54 6c .}...dprintf("Tl
6680: 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 s_WaitForConnect
6690: 20 72 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72 returned an err
66a0: 6f 72 22 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 or");. }..
66b0: 20 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e dprintf("Return
66c0: 69 6e 67 20 25 69 22 2c 20 6d 61 73 6b 29 3b 0a ing %i", mask);.
66d0: 0a 20 20 20 20 72 65 74 75 72 6e 28 6d 61 73 6b . return(mask
66e0: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d );.}../*. *-----
66f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6720: 2d 2a 0a 20 2a 0a 20 2a 20 20 20 20 54 6c 73 43 -*. *. * TlsC
6730: 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 54 69 6d hannelHandlerTim
6740: 65 72 20 2d 2d 0a 20 2a 0a 20 2a 20 20 20 20 2d er --. *. * -
6750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a ---------------*
6780: 0a 20 2a 20 20 20 20 43 61 6c 6c 65 64 20 62 79 . * Called by
6790: 20 74 68 65 20 6e 6f 74 69 66 69 65 72 20 28 2d the notifier (-
67a0: 3e 20 74 69 6d 65 72 29 20 74 6f 20 66 6c 75 73 > timer) to flus
67b0: 68 20 6f 75 74 0a 20 2a 20 20 20 20 69 6e 66 6f h out. * info
67c0: 72 6d 61 74 69 6f 6e 20 77 61 69 74 69 6e 67 20 rmation waiting
67d0: 69 6e 20 63 68 61 6e 6e 65 6c 20 62 75 66 66 65 in channel buffe
67e0: 72 73 2e 0a 20 2a 20 20 20 20 2d 2d 2d 2d 2d 2d rs.. * ------
67f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 ----------*. *.
6820: 2a 20 20 20 20 53 69 64 65 20 65 66 66 65 63 74 * Side effect
6830: 73 3a 0a 20 2a 20 20 20 20 20 20 20 20 41 73 20 s:. * As
6840: 6f 66 20 27 54 6c 73 43 68 61 6e 6e 65 6c 48 61 of 'TlsChannelHa
6850: 6e 64 6c 65 72 27 2e 0a 20 2a 0a 20 2a 20 20 20 ndler'.. *. *
6860: 20 52 65 73 75 6c 74 3a 0a 20 2a 20 20 20 20 20 Result:. *
6870: 20 20 20 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d None.. *. *--
6880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
68a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
68b0: 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 ----*. */.static
68c0: 20 76 6f 69 64 20 54 6c 73 43 68 61 6e 6e 65 6c void TlsChannel
68d0: 48 61 6e 64 6c 65 72 54 69 6d 65 72 28 76 6f 69 HandlerTimer(voi
68e0: 64 20 2a 63 6c 69 65 6e 74 44 61 74 61 29 20 7b d *clientData) {
68f0: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 . State *stat
6900: 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 ePtr = (State *)
6910: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 20 clientData;.
6920: 20 69 6e 74 20 6d 61 73 6b 20 3d 20 30 3b 0a 0a int mask = 0;..
6930: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
6940: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 73 74 61 74 led");.. stat
6950: 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 28 54 ePtr->timer = (T
6960: 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e cl_TimerToken) N
6970: 55 4c 4c 3b 0a 0a 20 20 20 20 69 66 20 28 42 49 ULL;.. if (BI
6980: 4f 5f 77 70 65 6e 64 69 6e 67 28 73 74 61 74 65 O_wpending(state
6990: 50 74 72 2d 3e 62 69 6f 29 29 20 7b 0a 09 64 70 Ptr->bio)) {..dp
69a0: 72 69 6e 74 66 28 22 5b 63 68 61 6e 3d 25 70 5d rintf("[chan=%p]
69b0: 20 42 49 4f 20 77 72 69 74 61 62 6c 65 22 2c 20 BIO writable",
69c0: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 3b statePtr->self);
69d0: 0a 0a 09 6d 61 73 6b 20 7c 3d 20 54 43 4c 5f 57 ...mask |= TCL_W
69e0: 52 49 54 41 42 4c 45 3b 0a 20 20 20 20 7d 0a 0a RITABLE;. }..
69f0: 20 20 20 20 69 66 20 28 42 49 4f 5f 70 65 6e 64 if (BIO_pend
6a00: 69 6e 67 28 73 74 61 74 65 50 74 72 2d 3e 62 69 ing(statePtr->bi
6a10: 6f 29 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 o)) {..dprintf("
6a20: 5b 63 68 61 6e 3d 25 70 5d 20 42 49 4f 20 72 65 [chan=%p] BIO re
6a30: 61 64 61 62 6c 65 22 2c 20 73 74 61 74 65 50 74 adable", statePt
6a40: 72 2d 3e 73 65 6c 66 29 3b 0a 0a 09 6d 61 73 6b r->self);...mask
6a50: 20 7c 3d 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 |= TCL_READABLE
6a60: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 ;. }.. dpr
6a70: 69 6e 74 66 28 22 4e 6f 74 69 66 79 69 6e 67 20 intf("Notifying
6a80: 6f 75 72 73 65 6c 76 65 73 22 29 3b 0a 20 20 20 ourselves");.
6a90: 20 54 63 6c 5f 4e 6f 74 69 66 79 43 68 61 6e 6e Tcl_NotifyChann
6aa0: 65 6c 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c el(statePtr->sel
6ab0: 66 2c 20 6d 61 73 6b 29 3b 0a 0a 20 20 20 20 64 f, mask);.. d
6ac0: 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e printf("Returnin
6ad0: 67 22 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e g");.. return
6ae0: 3b 0a 7d 0a 0a 54 63 6c 5f 43 68 61 6e 6e 65 6c ;.}..Tcl_Channel
6af0: 20 54 6c 73 5f 47 65 74 50 61 72 65 6e 74 28 53 Tls_GetParent(S
6b00: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c 20 tate *statePtr,
6b10: 69 6e 74 20 6d 61 73 6b 46 6c 61 67 73 29 20 7b int maskFlags) {
6b20: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 . dprintf("Re
6b30: 71 75 65 73 74 65 64 20 74 6f 20 67 65 74 20 70 quested to get p
6b40: 61 72 65 6e 74 20 6f 66 20 63 68 61 6e 6e 65 6c arent of channel
6b50: 20 25 70 22 2c 20 73 74 61 74 65 50 74 72 2d 3e %p", statePtr->
6b60: 73 65 6c 66 29 3b 0a 0a 20 20 20 20 69 66 20 28 self);.. if (
6b70: 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 (statePtr->flags
6b80: 20 26 20 7e 6d 61 73 6b 46 6c 61 67 73 29 20 26 & ~maskFlags) &
6b90: 20 54 4c 53 5f 54 43 4c 5f 46 41 53 54 50 41 54 TLS_TCL_FASTPAT
6ba0: 48 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 41 H) {..dprintf("A
6bb0: 73 6b 65 64 20 74 6f 20 67 65 74 20 74 68 65 20 sked to get the
6bc0: 70 61 72 65 6e 74 20 63 68 61 6e 6e 65 6c 20 77 parent channel w
6bd0: 68 69 6c 65 20 77 65 20 61 72 65 20 75 73 69 6e hile we are usin
6be0: 67 20 46 61 73 74 50 61 74 68 20 2d 2d 20 72 65 g FastPath -- re
6bf0: 74 75 72 6e 69 6e 67 20 4e 55 4c 4c 22 29 3b 0a turning NULL");.
6c00: 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 20 .return(NULL);.
6c10: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 28 }. return(
6c20: 54 63 6c 5f 47 65 74 53 74 61 63 6b 65 64 43 68 Tcl_GetStackedCh
6c30: 61 6e 6e 65 6c 28 73 74 61 74 65 50 74 72 2d 3e annel(statePtr->
6c40: 73 65 6c 66 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a self));.}../*. *
6c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6c90: 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 43 68 ---. *. * Tls_Ch
6ca0: 61 6e 6e 65 6c 54 79 70 65 20 2d 2d 0a 20 2a 0a annelType --. *.
6cb0: 20 2a 20 20 20 20 52 65 74 75 72 6e 20 74 68 65 * Return the
6cc0: 20 63 6f 72 72 65 63 74 20 54 4c 53 20 63 68 61 correct TLS cha
6cd0: 6e 6e 65 6c 20 64 72 69 76 65 72 20 69 6e 66 6f nnel driver info
6ce0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
6cf0: 20 2a 20 20 20 20 54 68 65 20 63 6f 72 72 65 63 * The correc
6d00: 74 20 63 68 61 6e 6e 65 6c 20 64 72 69 76 65 72 t channel driver
6d10: 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 for the current
6d20: 20 76 65 72 73 69 6f 6e 20 6f 66 20 54 63 6c 2e version of Tcl.
6d30: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
6d40: 63 74 73 3a 0a 20 2a 20 20 20 20 4e 6f 6e 65 2e cts:. * None.
6d50: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
6d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 ---------. */.st
6da0: 61 74 69 63 20 63 6f 6e 73 74 20 54 63 6c 5f 43 atic const Tcl_C
6db0: 68 61 6e 6e 65 6c 54 79 70 65 20 74 6c 73 43 68 hannelType tlsCh
6dc0: 61 6e 6e 65 6c 54 79 70 65 20 3d 20 7b 0a 20 20 annelType = {.
6dd0: 20 20 22 74 6c 73 22 2c 09 09 09 2f 2a 20 54 79 "tls",.../* Ty
6de0: 70 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 54 pe name */. T
6df0: 43 4c 5f 43 48 41 4e 4e 45 4c 5f 56 45 52 53 49 CL_CHANNEL_VERSI
6e00: 4f 4e 5f 35 2c 09 2f 2a 20 76 35 20 63 68 61 6e ON_5,./* v5 chan
6e10: 6e 65 6c 20 2a 2f 0a 20 20 20 20 54 6c 73 43 6c nel */. TlsCl
6e20: 6f 73 65 50 72 6f 63 2c 09 09 2f 2a 20 43 6c 6f oseProc,../* Clo
6e30: 73 65 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20 54 se proc */. T
6e40: 6c 73 49 6e 70 75 74 50 72 6f 63 2c 09 09 2f 2a lsInputProc,../*
6e50: 20 49 6e 70 75 74 20 70 72 6f 63 20 2a 2f 0a 20 Input proc */.
6e60: 20 20 20 54 6c 73 4f 75 74 70 75 74 50 72 6f 63 TlsOutputProc
6e70: 2c 09 09 2f 2a 20 4f 75 74 70 75 74 20 70 72 6f ,../* Output pro
6e80: 63 20 2a 2f 0a 20 20 20 20 30 2c 09 09 09 2f 2a c */. 0,.../*
6e90: 20 53 65 65 6b 20 70 72 6f 63 20 2a 2f 0a 20 20 Seek proc */.
6ea0: 20 20 54 6c 73 53 65 74 4f 70 74 69 6f 6e 50 72 TlsSetOptionPr
6eb0: 6f 63 2c 09 09 2f 2a 20 53 65 74 20 6f 70 74 69 oc,../* Set opti
6ec0: 6f 6e 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20 54 on proc */. T
6ed0: 6c 73 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63 2c lsGetOptionProc,
6ee0: 09 09 2f 2a 20 47 65 74 20 6f 70 74 69 6f 6e 20 ../* Get option
6ef0: 70 72 6f 63 20 2a 2f 0a 20 20 20 20 54 6c 73 57 proc */. TlsW
6f00: 61 74 63 68 50 72 6f 63 2c 09 09 2f 2a 20 49 6e atchProc,../* In
6f10: 69 74 69 61 6c 69 7a 65 20 6e 6f 74 69 66 69 65 itialize notifie
6f20: 72 20 2a 2f 0a 20 20 20 20 54 6c 73 47 65 74 48 r */. TlsGetH
6f30: 61 6e 64 6c 65 50 72 6f 63 2c 09 09 2f 2a 20 47 andleProc,../* G
6f40: 65 74 20 4f 53 20 68 61 6e 64 6c 65 73 20 6f 75 et OS handles ou
6f50: 74 20 6f 66 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a t of channel */.
6f60: 20 20 20 20 54 6c 73 43 6c 6f 73 65 32 50 72 6f TlsClose2Pro
6f70: 63 2c 09 09 2f 2a 20 63 6c 6f 73 65 32 70 72 6f c,../* close2pro
6f80: 63 20 2a 2f 0a 20 20 20 20 54 6c 73 42 6c 6f 63 c */. TlsBloc
6f90: 6b 4d 6f 64 65 50 72 6f 63 2c 09 09 2f 2a 20 53 kModeProc,../* S
6fa0: 65 74 20 62 6c 6f 63 6b 69 6e 67 2f 6e 6f 6e 62 et blocking/nonb
6fb0: 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2a 2f 0a 20 locking mode*/.
6fc0: 20 20 20 30 2c 09 09 09 2f 2a 20 46 6c 75 73 68 0,.../* Flush
6fd0: 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20 54 6c 73 proc */. Tls
6fe0: 4e 6f 74 69 66 79 50 72 6f 63 2c 09 09 2f 2a 20 NotifyProc,../*
6ff0: 48 61 6e 64 6c 69 6e 67 20 6f 66 20 65 76 65 6e Handling of even
7000: 74 73 20 62 75 62 62 6c 69 6e 67 20 75 70 20 2a ts bubbling up *
7010: 2f 0a 20 20 20 20 30 2c 09 09 09 2f 2a 20 57 69 /. 0,.../* Wi
7020: 64 65 20 73 65 65 6b 20 70 72 6f 63 20 2a 2f 0a de seek proc */.
7030: 20 20 20 20 4e 55 4c 4c 2c 09 09 09 2f 2a 20 54 NULL,.../* T
7040: 68 72 65 61 64 20 61 63 74 69 6f 6e 20 2a 2f 0a hread action */.
7050: 20 20 20 20 4e 55 4c 4c 09 09 09 2f 2a 20 54 72 NULL.../* Tr
7060: 75 6e 63 61 74 65 20 2a 2f 0a 7d 3b 0a 0a 63 6f uncate */.};..co
7070: 6e 73 74 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 54 nst Tcl_ChannelT
7080: 79 70 65 20 2a 54 6c 73 5f 43 68 61 6e 6e 65 6c ype *Tls_Channel
7090: 54 79 70 65 28 76 6f 69 64 29 20 7b 0a 20 20 20 Type(void) {.
70a0: 20 72 65 74 75 72 6e 20 26 74 6c 73 43 68 61 6e return &tlsChan
70b0: 6e 65 6c 54 79 70 65 3b 0a 7d 0a nelType;.}.