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 0a 2f 2a 0a "tlsInt.h"../*.
02b0: 20 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 * Forward decla
02c0: 72 61 74 69 6f 6e 73 0a 20 2a 2f 0a 73 74 61 74 rations. */.stat
02d0: 69 63 20 76 6f 69 64 20 54 6c 73 43 68 61 6e 6e ic void TlsChann
02e0: 65 6c 48 61 6e 64 6c 65 72 54 69 6d 65 72 28 76 elHandlerTimer(v
02f0: 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61 74 61 29 oid *clientData)
0300: 3b 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d ;../*. *--------
0310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
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 0a 20 2a 0a 20 -----------. *.
0350: 2a 20 54 6c 73 42 6c 6f 63 6b 4d 6f 64 65 50 72 * TlsBlockModePr
0360: 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 20 20 20 20 54 oc --. *. * T
0370: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 his procedure is
0380: 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20 invoked by the
0390: 67 65 6e 65 72 69 63 20 49 4f 20 6c 65 76 65 6c generic IO level
03a0: 0a 20 2a 20 20 20 20 20 20 20 74 6f 20 73 65 74 . * to set
03b0: 20 62 6c 6f 63 6b 69 6e 67 20 61 6e 64 20 6e 6f blocking and no
03c0: 6e 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 73 0a nblocking modes.
03d0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
03e0: 2a 20 20 20 20 30 20 69 66 20 73 75 63 63 65 73 * 0 if succes
03f0: 73 66 75 6c 20 6f 72 20 50 4f 53 49 58 20 65 72 sful or POSIX er
0400: 72 6f 72 20 63 6f 64 65 20 69 66 20 66 61 69 6c ror code if fail
0410: 65 64 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 ed.. *. * Side e
0420: 66 66 65 63 74 73 3a 0a 20 2a 20 20 20 20 53 65 ffects:. * Se
0430: 74 73 20 74 68 65 20 64 65 76 69 63 65 20 69 6e ts the device in
0440: 74 6f 20 62 6c 6f 63 6b 69 6e 67 20 6f 72 20 6e to blocking or n
0450: 6f 6e 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e onblocking mode.
0460: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
0470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
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 0a 20 2a 2f 0a 73 74 ---------. */.st
04b0: 61 74 69 63 20 69 6e 74 20 54 6c 73 42 6c 6f 63 atic int TlsBloc
04c0: 6b 4d 6f 64 65 50 72 6f 63 28 76 6f 69 64 20 2a kModeProc(void *
04d0: 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 69 6e instanceData, in
04e0: 74 20 6d 6f 64 65 29 20 7b 0a 20 20 20 20 53 74 t mode) {. St
04f0: 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 ate *statePtr =
0500: 28 53 74 61 74 65 20 2a 29 20 69 6e 73 74 61 6e (State *) instan
0510: 63 65 44 61 74 61 3b 0a 0a 20 20 20 20 69 66 20 ceData;.. if
0520: 28 6d 6f 64 65 20 3d 3d 20 54 43 4c 5f 4d 4f 44 (mode == TCL_MOD
0530: 45 5f 4e 4f 4e 42 4c 4f 43 4b 49 4e 47 29 20 7b E_NONBLOCKING) {
0540: 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 ..statePtr->flag
0550: 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 41 53 59 s |= TLS_TCL_ASY
0560: 4e 43 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b NC;. } else {
0570: 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 ..statePtr->flag
0580: 73 20 26 3d 20 7e 28 54 4c 53 5f 54 43 4c 5f 41 s &= ~(TLS_TCL_A
0590: 53 59 4e 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 SYNC);. }.
05a0: 20 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f return(0);.}../
05b0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
05c0: 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 54 6c -------. *. * Tl
0600: 73 43 6c 6f 73 65 32 50 72 6f 63 20 2d 2d 0a 20 sClose2Proc --.
0610: 2a 0a 20 2a 20 20 20 20 54 68 69 73 20 70 72 6f *. * This pro
0620: 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 cedure is invoke
0630: 64 20 62 79 20 74 68 65 20 67 65 6e 65 72 69 63 d by the generic
0640: 20 49 4f 20 6c 65 76 65 6c 20 74 6f 20 70 65 72 IO level to per
0650: 66 6f 72 6d 0a 20 2a 20 20 20 20 63 68 61 6e 6e form. * chann
0660: 65 6c 2d 74 79 70 65 2d 73 70 65 63 69 66 69 63 el-type-specific
0670: 20 63 6c 65 61 6e 75 70 20 77 68 65 6e 20 61 20 cleanup when a
0680: 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64 SSL socket based
0690: 20 63 68 61 6e 6e 65 6c 0a 20 2a 20 20 20 20 69 channel. * i
06a0: 73 20 63 6c 6f 73 65 64 2e 0a 20 2a 0a 20 2a 20 s closed.. *. *
06b0: 20 20 20 4e 6f 74 65 3a 20 77 65 20 6c 65 61 76 Note: we leav
06c0: 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 e the underlying
06d0: 20 73 6f 63 6b 65 74 20 61 6c 6f 6e 65 2c 20 69 socket alone, i
06e0: 73 20 74 68 69 73 20 72 69 67 68 74 3f 0a 20 2a s this right?. *
06f0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 20 . * Results:. *
0700: 20 20 20 30 20 69 66 20 73 75 63 63 65 73 73 66 0 if successf
0710: 75 6c 20 6f 72 20 50 4f 53 49 58 20 65 72 72 6f ul or POSIX erro
0720: 72 20 63 6f 64 65 20 69 66 20 66 61 69 6c 65 64 r code if failed
0730: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 .. *. * Side eff
0740: 65 63 74 73 3a 0a 20 2a 20 20 20 20 43 6c 6f 73 ects:. * Clos
0750: 65 73 20 74 68 65 20 73 6f 63 6b 65 74 20 6f 66 es the socket of
0760: 20 74 68 65 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a the channel.. *
0770: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
0780: 2d 2d 2d 2d 2d 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 0a 20 2a 2f 0a 23 69 66 20 54 ------. */.#if T
07c0: 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e CL_MAJOR_VERSION
07d0: 20 3e 20 38 0a 23 20 20 20 64 65 66 69 6e 65 20 > 8.# define
07e0: 54 6c 73 43 6c 6f 73 65 50 72 6f 63 20 4e 55 4c TlsCloseProc NUL
07f0: 4c 20 2f 2a 20 4e 6f 20 6c 6f 6e 67 65 72 20 6e L /* No longer n
0800: 65 63 63 65 73 73 61 72 79 20 69 6e 20 54 63 6c eccessary in Tcl
0810: 20 39 20 2a 2f 0a 23 65 6c 73 65 0a 73 74 61 74 9 */.#else.stat
0820: 69 63 20 69 6e 74 20 54 6c 73 43 6c 6f 73 65 50 ic int TlsCloseP
0830: 72 6f 63 28 0a 20 20 20 20 76 6f 69 64 20 2a 69 roc(. void *i
0840: 6e 73 74 61 6e 63 65 44 61 74 61 2c 0a 20 20 20 nstanceData,.
0850: 20 54 43 4c 5f 55 4e 55 53 45 44 28 54 63 6c 5f TCL_UNUSED(Tcl_
0860: 49 6e 74 65 72 70 20 2a 29 29 0a 7b 0a 20 20 20 Interp *)).{.
0870: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 State *statePtr
0880: 20 3d 20 28 53 74 61 74 65 20 2a 29 69 6e 73 74 = (State *)inst
0890: 61 6e 63 65 44 61 74 61 3b 0a 0a 20 20 20 20 64 anceData;.. d
08a0: 70 72 69 6e 74 66 28 22 54 6c 73 43 6c 6f 73 65 printf("TlsClose
08b0: 50 72 6f 63 28 25 70 29 22 2c 20 73 74 61 74 65 Proc(%p)", state
08c0: 50 74 72 29 3b 0a 0a 20 20 20 20 54 6c 73 5f 43 Ptr);.. Tls_C
08d0: 6c 65 61 6e 28 73 74 61 74 65 50 74 72 29 3b 0a lean(statePtr);.
08e0: 20 20 20 20 54 63 6c 5f 45 76 65 6e 74 75 61 6c Tcl_Eventual
08f0: 6c 79 46 72 65 65 28 73 74 61 74 65 50 74 72 2c lyFree(statePtr,
0900: 20 54 6c 73 5f 46 72 65 65 29 3b 0a 20 20 20 20 Tls_Free);.
0910: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d return TCL_OK;.}
0920: 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74 69 63 20 .#endif..static
0930: 69 6e 74 20 54 6c 73 43 6c 6f 73 65 32 50 72 6f int TlsClose2Pro
0940: 63 28 0a 20 20 20 20 76 6f 69 64 20 2a 69 6e 73 c(. void *ins
0950: 74 61 6e 63 65 44 61 74 61 2c 20 20 20 20 2f 2a tanceData, /*
0960: 20 54 68 65 20 73 6f 63 6b 65 74 20 73 74 61 74 The socket stat
0970: 65 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e e. */. Tcl_In
0980: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 09 09 2f terp *interp,../
0990: 2a 20 46 6f 72 20 65 72 72 6f 72 73 20 2d 20 63 * For errors - c
09a0: 61 6e 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 an be NULL. */.
09b0: 20 20 20 69 6e 74 20 66 6c 61 67 73 29 09 09 09 int flags)...
09c0: 2f 2a 20 46 6c 61 67 73 20 74 6f 20 63 6c 6f 73 /* Flags to clos
09d0: 65 20 72 65 61 64 20 61 6e 64 2f 6f 72 20 77 72 e read and/or wr
09e0: 69 74 65 20 73 69 64 65 20 6f 66 20 63 68 61 6e ite side of chan
09f0: 6e 65 6c 20 2a 2f 0a 7b 0a 20 20 20 20 53 74 61 nel */.{. Sta
0a00: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 te *statePtr = (
0a10: 53 74 61 74 65 20 2a 29 69 6e 73 74 61 6e 63 65 State *)instance
0a20: 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e Data;.. dprin
0a30: 74 66 28 22 54 6c 73 43 6c 6f 73 65 32 50 72 6f tf("TlsClose2Pro
0a40: 63 28 25 70 29 22 2c 20 73 74 61 74 65 50 74 72 c(%p)", statePtr
0a50: 29 3b 0a 0a 20 20 20 20 69 66 20 28 28 66 6c 61 );.. if ((fla
0a60: 67 73 26 28 54 43 4c 5f 43 4c 4f 53 45 5f 52 45 gs&(TCL_CLOSE_RE
0a70: 41 44 7c 54 43 4c 5f 43 4c 4f 53 45 5f 57 52 49 AD|TCL_CLOSE_WRI
0a80: 54 45 29 29 29 20 7b 0a 09 72 65 74 75 72 6e 20 TE))) {..return
0a90: 45 49 4e 56 41 4c 3b 0a 20 20 20 20 7d 0a 20 20 EINVAL;. }.
0aa0: 20 20 54 6c 73 5f 43 6c 65 61 6e 28 73 74 61 74 Tls_Clean(stat
0ab0: 65 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 45 ePtr);. Tcl_E
0ac0: 76 65 6e 74 75 61 6c 6c 79 46 72 65 65 28 73 74 ventuallyFree(st
0ad0: 61 74 65 50 74 72 2c 20 54 6c 73 5f 46 72 65 65 atePtr, Tls_Free
0ae0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 );. return TC
0af0: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d L_OK;.}../*. *--
0b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0b30: 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 20 54 6c 73 5f ----*. *. * Tls_
0b40: 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 20 2d WaitForConnect -
0b50: 2d 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 3a 0a -. *. * Result:.
0b60: 20 2a 20 20 20 20 30 20 69 66 20 73 75 63 63 65 * 0 if succe
0b70: 73 73 66 75 6c 2c 20 2d 31 20 69 66 20 66 61 69 ssful, -1 if fai
0b80: 6c 65 64 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 led.. *. * Side
0b90: 65 66 66 65 63 74 73 3a 0a 20 2a 20 20 20 20 49 effects:. * I
0ba0: 73 73 75 65 73 20 53 53 4c 5f 61 63 63 65 70 74 ssues SSL_accept
0bb0: 20 6f 72 20 53 53 4c 5f 63 6f 6e 6e 65 63 74 0a or SSL_connect.
0bc0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
0bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f -----------*. */
0c00: 0a 69 6e 74 20 54 6c 73 5f 57 61 69 74 46 6f 72 .int Tls_WaitFor
0c10: 43 6f 6e 6e 65 63 74 28 53 74 61 74 65 20 2a 73 Connect(State *s
0c20: 74 61 74 65 50 74 72 2c 20 69 6e 74 20 2a 65 72 tatePtr, int *er
0c30: 72 6f 72 43 6f 64 65 50 74 72 2c 20 69 6e 74 20 rorCodePtr, int
0c40: 68 61 6e 64 73 68 61 6b 65 46 61 69 6c 75 72 65 handshakeFailure
0c50: 49 73 50 65 72 6d 61 6e 65 6e 74 29 20 7b 0a 20 IsPermanent) {.
0c60: 20 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 unsigned long
0c70: 20 62 61 63 6b 69 6e 67 45 72 72 6f 72 3b 0a 20 backingError;.
0c80: 20 20 20 69 6e 74 20 65 72 72 2c 20 72 63 3b 0a int err, rc;.
0c90: 20 20 20 20 69 6e 74 20 62 69 6f 53 68 6f 75 6c int bioShoul
0ca0: 64 52 65 74 72 79 3b 0a 20 20 20 20 2a 65 72 72 dRetry;. *err
0cb0: 6f 72 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a 0a orCodePtr = 0;..
0cc0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 57 61 69 dprintf("Wai
0cd0: 74 46 6f 72 43 6f 6e 6e 65 63 74 28 25 70 29 22 tForConnect(%p)"
0ce0: 2c 20 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 , statePtr);.
0cf0: 20 64 70 72 69 6e 74 46 6c 61 67 73 28 73 74 61 dprintFlags(sta
0d00: 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 69 66 20 tePtr);.. if
0d10: 28 21 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 (!(statePtr->fla
0d20: 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f 49 4e 49 gs & TLS_TCL_INI
0d30: 54 29 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 T)) {..dprintf("
0d40: 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 Tls_WaitForConne
0d50: 63 74 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6c 72 ct called on alr
0d60: 65 61 64 79 20 69 6e 69 74 69 61 6c 69 7a 65 64 eady initialized
0d70: 20 63 68 61 6e 6e 65 6c 20 2d 2d 20 72 65 74 75 channel -- retu
0d80: 72 6e 69 6e 67 20 77 69 74 68 20 69 6d 6d 65 64 rning with immed
0d90: 69 61 74 65 20 73 75 63 63 65 73 73 22 29 3b 0a iate success");.
0da0: 09 72 65 74 75 72 6e 28 30 29 3b 0a 20 20 20 20 .return(0);.
0db0: 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 }.. if (state
0dc0: 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 Ptr->flags & TLS
0dd0: 5f 54 43 4c 5f 48 41 4e 44 53 48 41 4b 45 5f 46 _TCL_HANDSHAKE_F
0de0: 41 49 4c 45 44 29 20 7b 0a 09 2f 2a 0a 09 20 2a AILED) {../*.. *
0df0: 20 44 69 66 66 65 72 65 6e 74 20 74 79 70 65 73 Different types
0e00: 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 73 20 68 of operations h
0e10: 61 76 65 20 64 69 66 66 65 72 65 6e 74 20 72 65 ave different re
0e20: 71 75 69 72 65 6d 65 6e 74 73 0a 09 20 2a 20 53 quirements.. * S
0e30: 53 4c 20 62 65 69 6e 67 20 65 73 74 61 62 6c 69 SL being establi
0e40: 73 68 65 64 0a 09 20 2a 2f 0a 09 69 66 20 28 68 shed.. */..if (h
0e50: 61 6e 64 73 68 61 6b 65 46 61 69 6c 75 72 65 49 andshakeFailureI
0e60: 73 50 65 72 6d 61 6e 65 6e 74 29 20 7b 0a 09 20 sPermanent) {..
0e70: 20 20 20 64 70 72 69 6e 74 66 28 22 41 73 6b 65 dprintf("Aske
0e80: 64 20 74 6f 20 77 61 69 74 20 66 6f 72 20 61 20 d to wait for a
0e90: 54 4c 53 20 68 61 6e 64 73 68 61 6b 65 20 74 68 TLS handshake th
0ea0: 61 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 66 at has already f
0eb0: 61 69 6c 65 64 2e 20 20 52 65 74 75 72 6e 69 6e ailed. Returnin
0ec0: 67 20 66 61 74 61 6c 20 65 72 72 6f 72 22 29 3b g fatal error");
0ed0: 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 .. *errorCode
0ee0: 50 74 72 20 3d 20 45 43 4f 4e 4e 41 42 4f 52 54 Ptr = ECONNABORT
0ef0: 45 44 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 ED;..} else {..
0f00: 20 20 20 64 70 72 69 6e 74 66 28 22 41 73 6b 65 dprintf("Aske
0f10: 64 20 74 6f 20 77 61 69 74 20 66 6f 72 20 61 20 d to wait for a
0f20: 54 4c 53 20 68 61 6e 64 73 68 61 6b 65 20 74 68 TLS handshake th
0f30: 61 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 66 at has already f
0f40: 61 69 6c 65 64 2e 20 20 52 65 74 75 72 6e 69 6e ailed. Returnin
0f50: 67 20 73 6f 66 74 20 65 72 72 6f 72 22 29 3b 0a g soft error");.
0f60: 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 . *errorCodeP
0f70: 74 72 20 3d 20 45 43 4f 4e 4e 52 45 53 45 54 3b tr = ECONNRESET;
0f80: 0a 09 7d 0a 09 54 6c 73 5f 45 72 72 6f 72 28 73 ..}..Tls_Error(s
0f90: 74 61 74 65 50 74 72 2c 20 22 57 61 69 74 20 66 tatePtr, "Wait f
0fa0: 6f 72 20 66 61 69 6c 65 64 20 68 61 6e 64 73 68 or failed handsh
0fb0: 61 6b 65 22 29 3b 0a 09 72 65 74 75 72 6e 28 2d ake");..return(-
0fc0: 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 1);. }.. f
0fd0: 6f 72 20 28 3b 3b 29 20 7b 0a 09 45 52 52 5f 63 or (;;) {..ERR_c
0fe0: 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 09 lear_error();...
0ff0: 2f 2a 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a /* Not initializ
1000: 65 64 20 79 65 74 21 20 41 6c 73 6f 20 63 61 6c ed yet! Also cal
1010: 6c 73 20 53 53 4c 5f 64 6f 5f 68 61 6e 64 73 68 ls SSL_do_handsh
1020: 61 6b 65 2e 20 2a 2f 0a 09 69 66 20 28 73 74 61 ake. */..if (sta
1030: 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 tePtr->flags & T
1040: 4c 53 5f 54 43 4c 5f 53 45 52 56 45 52 29 20 7b LS_TCL_SERVER) {
1050: 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
1060: 61 6c 6c 69 6e 67 20 53 53 4c 5f 61 63 63 65 70 alling SSL_accep
1070: 74 28 29 22 29 3b 0a 09 20 20 20 20 65 72 72 20 t()");.. err
1080: 3d 20 53 53 4c 5f 61 63 63 65 70 74 28 73 74 61 = SSL_accept(sta
1090: 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 7d 20 tePtr->ssl);..}
10a0: 65 6c 73 65 20 7b 0a 09 20 20 20 20 64 70 72 69 else {.. dpri
10b0: 6e 74 66 28 22 43 61 6c 6c 69 6e 67 20 53 53 4c ntf("Calling SSL
10c0: 5f 63 6f 6e 6e 65 63 74 28 29 22 29 3b 0a 09 20 _connect()");..
10d0: 20 20 20 65 72 72 20 3d 20 53 53 4c 5f 63 6f 6e err = SSL_con
10e0: 6e 65 63 74 28 73 74 61 74 65 50 74 72 2d 3e 73 nect(statePtr->s
10f0: 73 6c 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 65 72 sl);..}...if (er
1100: 72 20 3e 20 30 29 20 7b 0a 09 20 20 20 20 64 70 r > 0) {.. dp
1110: 72 69 6e 74 66 28 22 41 63 63 65 70 74 20 6f 72 rintf("Accept or
1120: 20 63 6f 6e 6e 65 63 74 20 77 61 73 20 73 75 63 connect was suc
1130: 63 65 73 73 66 75 6c 22 29 3b 0a 0a 09 20 20 20 cessful");...
1140: 20 65 72 72 20 3d 20 42 49 4f 5f 66 6c 75 73 68 err = BIO_flush
1150: 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b (statePtr->bio);
1160: 0a 09 20 20 20 20 69 66 20 28 65 72 72 20 3c 3d .. if (err <=
1170: 20 30 29 20 7b 0a 09 09 64 70 72 69 6e 74 66 28 0) {...dprintf(
1180: 22 46 6c 75 73 68 69 6e 67 20 74 68 65 20 6c 6f "Flushing the lo
1190: 77 65 72 20 6c 61 79 65 72 73 20 66 61 69 6c 65 wer layers faile
11a0: 64 2c 20 74 68 69 73 20 77 69 6c 6c 20 70 72 6f d, this will pro
11b0: 62 61 62 6c 79 20 74 65 72 6d 69 6e 61 74 65 20 bably terminate
11c0: 74 68 69 73 20 73 65 73 73 69 6f 6e 22 29 3b 0a this session");.
11d0: 09 20 20 20 20 7d 0a 09 7d 20 65 6c 73 65 20 7b . }..} else {
11e0: 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 41 .. dprintf("A
11f0: 63 63 65 70 74 20 6f 72 20 63 6f 6e 6e 65 63 74 ccept or connect
1200: 20 66 61 69 6c 65 64 22 29 3b 0a 09 7d 0a 0a 09 failed");..}...
1210: 72 63 20 3d 20 53 53 4c 5f 67 65 74 5f 65 72 72 rc = SSL_get_err
1220: 6f 72 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c or(statePtr->ssl
1230: 2c 20 65 72 72 29 3b 0a 09 62 61 63 6b 69 6e 67 , err);..backing
1240: 45 72 72 6f 72 20 3d 20 45 52 52 5f 67 65 74 5f Error = ERR_get_
1250: 65 72 72 6f 72 28 29 3b 0a 09 69 66 20 28 72 63 error();..if (rc
1260: 20 21 3d 20 53 53 4c 5f 45 52 52 4f 52 5f 4e 4f != SSL_ERROR_NO
1270: 4e 45 29 20 7b 0a 09 20 20 20 20 64 70 72 69 6e NE) {.. dprin
1280: 74 66 28 22 47 6f 74 20 65 72 72 6f 72 3a 20 25 tf("Got error: %
1290: 69 20 28 72 63 20 3d 20 25 69 29 22 2c 20 65 72 i (rc = %i)", er
12a0: 72 2c 20 72 63 29 3b 0a 09 20 20 20 20 64 70 72 r, rc);.. dpr
12b0: 69 6e 74 66 28 22 47 6f 74 20 65 72 72 6f 72 3a intf("Got error:
12c0: 20 25 73 22 2c 20 45 52 52 5f 72 65 61 73 6f 6e %s", ERR_reason
12d0: 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 62 61 _error_string(ba
12e0: 63 6b 69 6e 67 45 72 72 6f 72 29 29 3b 0a 09 7d ckingError));..}
12f0: 0a 0a 09 62 69 6f 53 68 6f 75 6c 64 52 65 74 72 ...bioShouldRetr
1300: 79 20 3d 20 30 3b 0a 09 69 66 20 28 65 72 72 20 y = 0;..if (err
1310: 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 69 66 20 <= 0) {.. if
1320: 28 72 63 20 3d 3d 20 53 53 4c 5f 45 52 52 4f 52 (rc == SSL_ERROR
1330: 5f 57 41 4e 54 5f 43 4f 4e 4e 45 43 54 20 7c 7c _WANT_CONNECT ||
1340: 20 72 63 20 3d 3d 20 53 53 4c 5f 45 52 52 4f 52 rc == SSL_ERROR
1350: 5f 57 41 4e 54 5f 41 43 43 45 50 54 20 7c 7c 20 _WANT_ACCEPT ||
1360: 72 63 20 3d 3d 20 53 53 4c 5f 45 52 52 4f 52 5f rc == SSL_ERROR_
1370: 57 41 4e 54 5f 52 45 41 44 20 7c 7c 20 72 63 20 WANT_READ || rc
1380: 3d 3d 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e == SSL_ERROR_WAN
1390: 54 5f 57 52 49 54 45 29 20 7b 0a 09 09 62 69 6f T_WRITE) {...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 20 65 6c 73 65 20 69 66 20 .. } else if
13c0: 28 42 49 4f 5f 73 68 6f 75 6c 64 5f 72 65 74 72 (BIO_should_retr
13d0: 79 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 y(statePtr->bio)
13e0: 29 20 7b 0a 09 09 62 69 6f 53 68 6f 75 6c 64 52 ) {...bioShouldR
13f0: 65 74 72 79 20 3d 20 31 3b 0a 09 20 20 20 20 7d etry = 1;.. }
1400: 20 65 6c 73 65 20 69 66 20 28 72 63 20 3d 3d 20 else if (rc ==
1410: 53 53 4c 5f 45 52 52 4f 52 5f 53 59 53 43 41 4c SSL_ERROR_SYSCAL
1420: 4c 20 26 26 20 54 63 6c 5f 47 65 74 45 72 72 6e L && Tcl_GetErrn
1430: 6f 28 29 20 3d 3d 20 45 41 47 41 49 4e 29 20 7b o() == EAGAIN) {
1440: 0a 09 09 62 69 6f 53 68 6f 75 6c 64 52 65 74 72 ...bioShouldRetr
1450: 79 20 3d 20 31 3b 0a 09 20 20 20 20 7d 0a 09 7d y = 1;.. }..}
1460: 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 69 66 20 else {.. if
1470: 28 21 53 53 4c 5f 69 73 5f 69 6e 69 74 5f 66 69 (!SSL_is_init_fi
1480: 6e 69 73 68 65 64 28 73 74 61 74 65 50 74 72 2d nished(statePtr-
1490: 3e 73 73 6c 29 29 20 7b 0a 09 09 62 69 6f 53 68 >ssl)) {...bioSh
14a0: 6f 75 6c 64 52 65 74 72 79 20 3d 20 31 3b 0a 09 ouldRetry = 1;..
14b0: 20 20 20 20 7d 0a 09 7d 0a 0a 09 69 66 20 28 62 }..}...if (b
14c0: 69 6f 53 68 6f 75 6c 64 52 65 74 72 79 29 20 7b ioShouldRetry) {
14d0: 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 54 .. dprintf("T
14e0: 68 65 20 49 2f 4f 20 64 69 64 20 6e 6f 74 20 63 he I/O did not c
14f0: 6f 6d 70 6c 65 74 65 20 2d 2d 20 62 75 74 20 77 omplete -- but w
1500: 65 20 73 68 6f 75 6c 64 20 74 72 79 20 69 74 20 e should try it
1510: 61 67 61 69 6e 22 29 3b 0a 0a 09 20 20 20 20 69 again");... i
1520: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 f (statePtr->fla
1530: 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f 41 53 59 gs & TLS_TCL_ASY
1540: 4e 43 29 20 7b 0a 09 09 64 70 72 69 6e 74 66 28 NC) {...dprintf(
1550: 22 52 65 74 75 72 6e 69 6e 67 20 45 41 47 41 49 "Returning EAGAI
1560: 4e 20 73 6f 20 74 68 61 74 20 69 74 20 63 61 6e N so that it can
1570: 20 62 65 20 72 65 74 72 69 65 64 20 6c 61 74 65 be retried late
1580: 72 22 29 3b 0a 09 09 2a 65 72 72 6f 72 43 6f 64 r");...*errorCod
1590: 65 50 74 72 20 3d 20 45 41 47 41 49 4e 3b 0a 09 ePtr = EAGAIN;..
15a0: 09 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 .Tls_Error(state
15b0: 50 74 72 2c 20 22 48 61 6e 64 73 68 61 6b 65 20 Ptr, "Handshake
15c0: 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 2c 20 77 69 not complete, wi
15d0: 6c 6c 20 72 65 74 72 79 20 6c 61 74 65 72 22 29 ll retry later")
15e0: 3b 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a ;...return(-1);.
15f0: 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 . } else {...
1600: 64 70 72 69 6e 74 66 28 22 44 6f 69 6e 67 20 73 dprintf("Doing s
1610: 6f 20 6e 6f 77 22 29 3b 0a 09 09 63 6f 6e 74 69 o now");...conti
1620: 6e 75 65 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a nue;.. }..}..
1630: 09 64 70 72 69 6e 74 66 28 22 57 65 20 68 61 76 .dprintf("We hav
1640: 65 20 65 69 74 68 65 72 20 63 6f 6d 70 6c 65 74 e either complet
1650: 65 6c 79 20 65 73 74 61 62 6c 69 73 68 65 64 20 ely established
1660: 74 68 65 20 73 65 73 73 69 6f 6e 20 6f 72 20 63 the session or c
1670: 6f 6d 70 6c 65 74 65 6c 79 20 66 61 69 6c 65 64 ompletely failed
1680: 20 69 74 20 2d 2d 20 74 68 65 72 65 20 69 73 20 it -- there is
1690: 6e 6f 20 6d 6f 72 65 20 6e 65 65 64 20 74 6f 20 no more need to
16a0: 65 76 65 72 20 72 65 74 72 79 20 69 74 20 74 68 ever retry it th
16b0: 6f 75 67 68 22 29 3b 0a 09 62 72 65 61 6b 3b 0a ough");..break;.
16c0: 20 20 20 20 7d 0a 0a 20 20 20 20 73 77 69 74 63 }.. switc
16d0: 68 20 28 72 63 29 20 7b 0a 09 63 61 73 65 20 53 h (rc) {..case S
16e0: 53 4c 5f 45 52 52 4f 52 5f 4e 4f 4e 45 3a 0a 09 SL_ERROR_NONE:..
16f0: 20 20 20 20 2f 2a 20 54 68 65 20 54 4c 53 2f 53 /* The TLS/S
1700: 53 4c 20 49 2f 4f 20 6f 70 65 72 61 74 69 6f 6e SL I/O operation
1710: 20 63 6f 6d 70 6c 65 74 65 64 20 2a 2f 0a 09 20 completed */..
1720: 20 20 20 64 70 72 69 6e 74 66 28 22 54 68 65 20 dprintf("The
1730: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 67 6f connection is go
1740: 6f 64 22 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f od");.. *erro
1750: 72 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a 09 20 rCodePtr = 0;..
1760: 20 20 20 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 break;...case
1770: 20 53 53 4c 5f 45 52 52 4f 52 5f 5a 45 52 4f 5f SSL_ERROR_ZERO_
1780: 52 45 54 55 52 4e 3a 0a 09 20 20 20 20 2f 2a 20 RETURN:.. /*
1790: 54 68 65 20 54 4c 53 2f 53 53 4c 20 70 65 65 72 The TLS/SSL peer
17a0: 20 68 61 73 20 63 6c 6f 73 65 64 20 74 68 65 20 has closed the
17b0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6f 72 20 77 connection for w
17c0: 72 69 74 69 6e 67 20 62 79 20 73 65 6e 64 69 6e riting by sendin
17d0: 67 20 74 68 65 20 63 6c 6f 73 65 5f 6e 6f 74 69 g the close_noti
17e0: 66 79 20 61 6c 65 72 74 20 2a 2f 0a 09 20 20 20 fy alert */..
17f0: 20 64 70 72 69 6e 74 66 28 22 53 53 4c 5f 45 52 dprintf("SSL_ER
1800: 52 4f 52 5f 5a 45 52 4f 5f 52 45 54 55 52 4e 3a ROR_ZERO_RETURN:
1810: 20 43 6f 6e 6e 65 63 74 20 72 65 74 75 72 6e 65 Connect returne
1820: 64 20 61 6e 20 69 6e 76 61 6c 69 64 20 76 61 6c d an invalid val
1830: 75 65 2e 2e 2e 22 29 3b 0a 09 20 20 20 20 2a 65 ue...");.. *e
1840: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 49 rrorCodePtr = EI
1850: 4e 56 41 4c 3b 0a 09 20 20 20 20 54 6c 73 5f 45 NVAL;.. Tls_E
1860: 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20 22 rror(statePtr, "
1870: 50 65 65 72 20 68 61 73 20 63 6c 6f 73 65 64 20 Peer has closed
1880: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 the connection f
1890: 6f 72 20 77 72 69 74 69 6e 67 20 62 79 20 73 65 or writing by se
18a0: 6e 64 69 6e 67 20 74 68 65 20 63 6c 6f 73 65 5f nding the close_
18b0: 6e 6f 74 69 66 79 20 61 6c 65 72 74 22 29 3b 0a notify alert");.
18c0: 09 20 20 20 20 72 65 74 75 72 6e 28 2d 31 29 3b . return(-1);
18d0: 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f ...case SSL_ERRO
18e0: 52 5f 53 59 53 43 41 4c 4c 3a 0a 09 20 20 20 20 R_SYSCALL:..
18f0: 2f 2a 20 53 6f 6d 65 20 6e 6f 6e 2d 72 65 63 6f /* Some non-reco
1900: 76 65 72 61 62 6c 65 2c 20 66 61 74 61 6c 20 49 verable, fatal I
1910: 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 /O error occurre
1920: 64 20 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e 74 d */.. dprint
1930: 66 28 22 53 53 4c 5f 45 52 52 4f 52 5f 53 59 53 f("SSL_ERROR_SYS
1940: 43 41 4c 4c 22 29 3b 0a 0a 09 20 20 20 20 69 66 CALL");... if
1950: 20 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 20 3d (backingError =
1960: 3d 20 30 20 26 26 20 65 72 72 20 3d 3d 20 30 29 = 0 && err == 0)
1970: 20 7b 0a 09 09 64 70 72 69 6e 74 66 28 22 45 4f {...dprintf("EO
1980: 46 20 72 65 61 63 68 65 64 22 29 0a 09 09 2a 65 F reached")...*e
1990: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 43 rrorCodePtr = EC
19a0: 4f 4e 4e 52 45 53 45 54 3b 0a 09 09 54 6c 73 5f ONNRESET;...Tls_
19b0: 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20 Error(statePtr,
19c0: 22 28 75 6e 65 78 70 65 63 74 65 64 29 20 45 4f "(unexpected) EO
19d0: 46 20 72 65 61 63 68 65 64 22 29 3b 0a 0a 09 20 F reached");...
19e0: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 62 61 } else if (ba
19f0: 63 6b 69 6e 67 45 72 72 6f 72 20 3d 3d 20 30 20 ckingError == 0
1a00: 26 26 20 65 72 72 20 3d 3d 20 2d 31 29 20 7b 0a && err == -1) {.
1a10: 09 09 64 70 72 69 6e 74 66 28 22 49 2f 4f 20 65 ..dprintf("I/O e
1a20: 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 28 65 rror occurred (e
1a30: 72 72 6e 6f 20 3d 20 25 6c 75 29 22 2c 20 28 75 rrno = %lu)", (u
1a40: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 54 63 nsigned long) Tc
1a50: 6c 5f 47 65 74 45 72 72 6e 6f 28 29 29 3b 0a 09 l_GetErrno());..
1a60: 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d .*errorCodePtr =
1a70: 20 54 63 6c 5f 47 65 74 45 72 72 6e 6f 28 29 3b Tcl_GetErrno();
1a80: 0a 09 09 69 66 20 28 2a 65 72 72 6f 72 43 6f 64 ...if (*errorCod
1a90: 65 50 74 72 20 3d 3d 20 45 43 4f 4e 4e 52 45 53 ePtr == ECONNRES
1aa0: 45 54 29 20 7b 0a 09 09 20 20 20 20 2a 65 72 72 ET) {... *err
1ab0: 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 43 4f 4e orCodePtr = ECON
1ac0: 4e 41 42 4f 52 54 45 44 3b 0a 09 09 7d 0a 09 09 NABORTED;...}...
1ad0: 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 Tls_Error(stateP
1ae0: 74 72 2c 20 28 63 68 61 72 20 2a 29 20 54 63 6c tr, (char *) Tcl
1af0: 5f 45 72 72 6e 6f 4d 73 67 28 2a 65 72 72 6f 72 _ErrnoMsg(*error
1b00: 43 6f 64 65 50 74 72 29 29 3b 0a 0a 09 20 20 20 CodePtr));...
1b10: 20 7d 20 65 6c 73 65 20 7b 0a 09 09 64 70 72 69 } else {...dpri
1b20: 6e 74 66 28 22 49 2f 4f 20 65 72 72 6f 72 20 6f ntf("I/O error o
1b30: 63 63 75 72 72 65 64 20 28 62 61 63 6b 69 6e 67 ccurred (backing
1b40: 45 72 72 6f 72 20 3d 20 25 6c 75 29 22 2c 20 62 Error = %lu)", b
1b50: 61 63 6b 69 6e 67 45 72 72 6f 72 29 3b 0a 09 09 ackingError);...
1b60: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 *errorCodePtr =
1b70: 54 63 6c 5f 47 65 74 45 72 72 6e 6f 28 29 3b 0a Tcl_GetErrno();.
1b80: 09 09 69 66 20 28 2a 65 72 72 6f 72 43 6f 64 65 ..if (*errorCode
1b90: 50 74 72 20 3d 3d 20 45 43 4f 4e 4e 52 45 53 45 Ptr == ECONNRESE
1ba0: 54 29 20 7b 0a 09 09 20 20 20 20 2a 65 72 72 6f T) {... *erro
1bb0: 72 43 6f 64 65 50 74 72 20 3d 20 45 43 4f 4e 4e rCodePtr = ECONN
1bc0: 41 42 4f 52 54 45 44 3b 0a 09 09 7d 0a 09 09 54 ABORTED;...}...T
1bd0: 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 ls_Error(statePt
1be0: 72 2c 20 28 63 68 61 72 20 2a 29 20 45 52 52 5f r, (char *) ERR_
1bf0: 72 65 61 73 6f 6e 5f 65 72 72 6f 72 5f 73 74 72 reason_error_str
1c00: 69 6e 67 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 ing(backingError
1c10: 29 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 ));.. }...
1c20: 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 statePtr->flags
1c30: 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 48 41 4e 44 |= TLS_TCL_HAND
1c40: 53 48 41 4b 45 5f 46 41 49 4c 45 44 3b 0a 09 20 SHAKE_FAILED;..
1c50: 20 20 20 72 65 74 75 72 6e 28 2d 31 29 3b 0a 0a return(-1);..
1c60: 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f .case SSL_ERROR_
1c70: 53 53 4c 3a 0a 09 20 20 20 20 2f 2a 20 41 20 6e SSL:.. /* A n
1c80: 6f 6e 2d 72 65 63 6f 76 65 72 61 62 6c 65 2c 20 on-recoverable,
1c90: 66 61 74 61 6c 20 65 72 72 6f 72 20 69 6e 20 74 fatal error in t
1ca0: 68 65 20 53 53 4c 20 6c 69 62 72 61 72 79 20 6f he SSL library o
1cb0: 63 63 75 72 72 65 64 2c 20 75 73 75 61 6c 6c 79 ccurred, usually
1cc0: 20 61 20 70 72 6f 74 6f 63 6f 6c 20 65 72 72 6f a protocol erro
1cd0: 72 20 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e 74 r */.. dprint
1ce0: 66 28 22 53 53 4c 5f 45 52 52 4f 52 5f 53 53 4c f("SSL_ERROR_SSL
1cf0: 3a 20 47 6f 74 20 70 65 72 6d 61 6e 65 6e 74 20 : Got permanent
1d00: 66 61 74 61 6c 20 53 53 4c 20 65 72 72 6f 72 2c fatal SSL error,
1d10: 20 61 62 6f 72 74 69 6e 67 20 69 6d 6d 65 64 69 aborting immedi
1d20: 61 74 65 6c 79 22 29 3b 0a 09 20 20 20 20 69 66 ately");.. if
1d30: 20 28 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 (SSL_get_verify
1d40: 5f 72 65 73 75 6c 74 28 73 74 61 74 65 50 74 72 _result(statePtr
1d50: 2d 3e 73 73 6c 29 20 21 3d 20 58 35 30 39 5f 56 ->ssl) != X509_V
1d60: 5f 4f 4b 29 20 7b 0a 09 09 54 6c 73 5f 45 72 72 _OK) {...Tls_Err
1d70: 6f 72 28 73 74 61 74 65 50 74 72 2c 20 28 63 68 or(statePtr, (ch
1d80: 61 72 20 2a 29 20 58 35 30 39 5f 76 65 72 69 66 ar *) X509_verif
1d90: 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 y_cert_error_str
1da0: 69 6e 67 28 53 53 4c 5f 67 65 74 5f 76 65 72 69 ing(SSL_get_veri
1db0: 66 79 5f 72 65 73 75 6c 74 28 73 74 61 74 65 50 fy_result(stateP
1dc0: 74 72 2d 3e 73 73 6c 29 29 29 3b 0a 09 20 20 20 tr->ssl)));..
1dd0: 20 7d 0a 09 20 20 20 20 69 66 20 28 62 61 63 6b }.. if (back
1de0: 69 6e 67 45 72 72 6f 72 20 21 3d 20 30 29 20 7b ingError != 0) {
1df0: 0a 09 09 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 ...Tls_Error(sta
1e00: 74 65 50 74 72 2c 20 28 63 68 61 72 20 2a 29 20 tePtr, (char *)
1e10: 45 52 52 5f 72 65 61 73 6f 6e 5f 65 72 72 6f 72 ERR_reason_error
1e20: 5f 73 74 72 69 6e 67 28 62 61 63 6b 69 6e 67 45 _string(backingE
1e30: 72 72 6f 72 29 29 3b 0a 09 20 20 20 20 7d 0a 09 rror));.. }..
1e40: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 66 6c statePtr->fl
1e50: 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 48 ags |= TLS_TCL_H
1e60: 41 4e 44 53 48 41 4b 45 5f 46 41 49 4c 45 44 3b ANDSHAKE_FAILED;
1e70: 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 .. *errorCode
1e80: 50 74 72 20 3d 20 45 43 4f 4e 4e 41 42 4f 52 54 Ptr = ECONNABORT
1e90: 45 44 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 28 ED;.. return(
1ea0: 2d 31 29 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f -1);...case SSL_
1eb0: 45 52 52 4f 52 5f 57 41 4e 54 5f 52 45 41 44 3a ERROR_WANT_READ:
1ec0: 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 ..case SSL_ERROR
1ed0: 5f 57 41 4e 54 5f 57 52 49 54 45 3a 0a 09 63 61 _WANT_WRITE:..ca
1ee0: 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e se SSL_ERROR_WAN
1ef0: 54 5f 58 35 30 39 5f 4c 4f 4f 4b 55 50 3a 0a 09 T_X509_LOOKUP:..
1f00: 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 57 case SSL_ERROR_W
1f10: 41 4e 54 5f 43 4f 4e 4e 45 43 54 3a 0a 09 63 61 ANT_CONNECT:..ca
1f20: 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e se SSL_ERROR_WAN
1f30: 54 5f 41 43 43 45 50 54 3a 0a 09 63 61 73 65 20 T_ACCEPT:..case
1f40: 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 41 SSL_ERROR_WANT_A
1f50: 53 59 4e 43 3a 0a 09 63 61 73 65 20 53 53 4c 5f SYNC:..case SSL_
1f60: 45 52 52 4f 52 5f 57 41 4e 54 5f 41 53 59 4e 43 ERROR_WANT_ASYNC
1f70: 5f 4a 4f 42 3a 0a 09 63 61 73 65 20 53 53 4c 5f _JOB:..case SSL_
1f80: 45 52 52 4f 52 5f 57 41 4e 54 5f 43 4c 49 45 4e ERROR_WANT_CLIEN
1f90: 54 5f 48 45 4c 4c 4f 5f 43 42 3a 0a 09 64 65 66 T_HELLO_CB:..def
1fa0: 61 75 6c 74 3a 0a 09 20 20 20 20 2f 2a 20 54 68 ault:.. /* Th
1fb0: 65 20 6f 70 65 72 61 74 69 6f 6e 20 64 69 64 20 e operation did
1fc0: 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 61 6e 64 not complete and
1fd0: 20 73 68 6f 75 6c 64 20 62 65 20 72 65 74 72 69 should be retri
1fe0: 65 64 20 6c 61 74 65 72 2e 20 2a 2f 0a 09 20 20 ed later. */..
1ff0: 20 20 64 70 72 69 6e 74 66 28 22 4f 70 65 72 61 dprintf("Opera
2000: 74 69 6f 6e 20 64 69 64 20 6e 6f 74 20 63 6f 6d tion did not com
2010: 70 6c 65 74 65 2c 20 63 61 6c 6c 20 66 75 6e 63 plete, call func
2020: 74 69 6f 6e 20 61 67 61 69 6e 20 6c 61 74 65 72 tion again later
2030: 3a 20 25 69 22 2c 20 72 63 29 3b 0a 09 20 20 20 : %i", rc);..
2040: 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d *errorCodePtr =
2050: 20 45 41 47 41 49 4e 3b 0a 09 20 20 20 20 64 70 EAGAIN;.. dp
2060: 72 69 6e 74 66 28 22 45 52 52 28 25 64 2c 20 25 rintf("ERR(%d, %
2070: 64 29 20 22 2c 20 72 63 2c 20 2a 65 72 72 6f 72 d) ", rc, *error
2080: 43 6f 64 65 50 74 72 29 3b 0a 09 20 20 20 20 54 CodePtr);.. T
2090: 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 ls_Error(statePt
20a0: 72 2c 20 22 4f 70 65 72 61 74 69 6f 6e 20 64 69 r, "Operation di
20b0: 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 2c 20 d not complete,
20c0: 63 61 6c 6c 20 66 75 6e 63 74 69 6f 6e 20 61 67 call function ag
20d0: 61 69 6e 20 6c 61 74 65 72 22 29 3b 0a 09 20 20 ain later");..
20e0: 20 20 72 65 74 75 72 6e 28 2d 31 29 3b 0a 20 20 return(-1);.
20f0: 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 }.. dprintf
2100: 28 22 52 65 6d 6f 76 69 6e 67 20 74 68 65 20 5c ("Removing the \
2110: 22 54 4c 53 5f 54 43 4c 5f 49 4e 49 54 5c 22 20 "TLS_TCL_INIT\"
2120: 66 6c 61 67 20 73 69 6e 63 65 20 77 65 20 68 61 flag since we ha
2130: 76 65 20 63 6f 6d 70 6c 65 74 65 64 20 74 68 65 ve completed the
2140: 20 68 61 6e 64 73 68 61 6b 65 22 29 3b 0a 20 20 handshake");.
2150: 20 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 statePtr->flag
2160: 73 20 26 3d 20 7e 54 4c 53 5f 54 43 4c 5f 49 4e s &= ~TLS_TCL_IN
2170: 49 54 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 IT;.. dprintf
2180: 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 ("Returning in s
2190: 75 63 63 65 73 73 22 29 3b 0a 20 20 20 20 2a 65 uccess");. *e
21a0: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 30 3b rrorCodePtr = 0;
21b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d . return 0;.}
21c0: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
21d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
21e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
21f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
2210: 20 54 6c 73 49 6e 70 75 74 50 72 6f 63 20 2d 2d TlsInputProc --
2220: 0a 20 2a 0a 20 2a 20 20 20 20 54 68 69 73 20 70 . *. * This p
2230: 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f rocedure is invo
2240: 6b 65 64 20 62 79 20 74 68 65 20 67 65 6e 65 72 ked by the gener
2250: 69 63 20 49 4f 20 6c 65 76 65 6c 0a 20 2a 20 20 ic IO level. *
2260: 20 20 20 20 20 74 6f 20 72 65 61 64 20 69 6e 70 to read inp
2270: 75 74 20 66 72 6f 6d 20 61 20 53 53 4c 20 73 6f ut from a SSL so
2280: 63 6b 65 74 20 62 61 73 65 64 20 63 68 61 6e 6e cket based chann
2290: 65 6c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 el.. *. * Result
22a0: 73 3a 0a 20 2a 20 20 20 20 52 65 74 75 72 6e 73 s:. * Returns
22b0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 the number of b
22c0: 79 74 65 73 20 72 65 61 64 20 6f 72 20 2d 31 20 ytes read or -1
22d0: 6f 6e 20 65 72 72 6f 72 2e 20 53 65 74 73 20 65 on error. Sets e
22e0: 72 72 6f 72 43 6f 64 65 50 74 72 0a 20 2a 20 20 rrorCodePtr. *
22f0: 20 20 74 6f 20 61 20 50 4f 53 49 58 20 65 72 72 to a POSIX err
2300: 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20 65 72 or code if an er
2310: 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 6f 72 ror occurred, or
2320: 20 30 20 69 66 20 6e 6f 6e 65 2e 0a 20 2a 0a 20 0 if none.. *.
2330: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
2340: 20 2a 20 20 20 20 52 65 61 64 73 20 69 6e 70 75 * Reads inpu
2350: 74 20 66 72 6f 6d 20 74 68 65 20 69 6e 70 75 74 t from the input
2360: 20 64 65 76 69 63 65 20 6f 66 20 74 68 65 20 63 device of the c
2370: 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d hannel.. *. *---
2380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
23a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
23b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
23c0: 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 . */..static int
23d0: 20 54 6c 73 49 6e 70 75 74 50 72 6f 63 28 0a 20 TlsInputProc(.
23e0: 20 20 20 76 6f 69 64 20 2a 69 6e 73 74 61 6e 63 void *instanc
23f0: 65 44 61 74 61 2c 0a 20 20 20 20 63 68 61 72 20 eData,. char
2400: 2a 62 75 66 2c 0a 20 20 20 20 69 6e 74 20 62 75 *buf,. int bu
2410: 66 53 69 7a 65 2c 0a 20 20 20 20 69 6e 74 20 2a fSize,. int *
2420: 65 72 72 6f 72 43 6f 64 65 50 74 72 29 0a 7b 0a errorCodePtr).{.
2430: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e unsigned lon
2440: 67 20 62 61 63 6b 69 6e 67 45 72 72 6f 72 3b 0a g backingError;.
2450: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 State *state
2460: 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 20 Ptr = (State *)
2470: 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 20 20 instanceData;.
2480: 20 20 69 6e 74 20 62 79 74 65 73 52 65 61 64 3b int bytesRead;
2490: 0a 20 20 20 20 69 6e 74 20 74 6c 73 43 6f 6e 6e . int tlsConn
24a0: 65 63 74 3b 0a 20 20 20 20 69 6e 74 20 65 72 72 ect;. int err
24b0: 3b 0a 0a 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 ;.. *errorCod
24c0: 65 50 74 72 20 3d 20 30 3b 0a 0a 20 20 20 20 64 ePtr = 0;.. d
24d0: 70 72 69 6e 74 66 28 22 42 49 4f 5f 72 65 61 64 printf("BIO_read
24e0: 28 25 64 29 22 2c 20 62 75 66 53 69 7a 65 29 3b (%d)", bufSize);
24f0: 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 .. if (stateP
2500: 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f tr->flags & TLS_
2510: 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 29 20 7b 0a TCL_CALLBACK) {.
2520: 09 2f 2a 20 64 6f 6e 27 74 20 70 72 6f 63 65 73 ./* don't proces
2530: 73 20 61 6e 79 20 62 79 74 65 73 20 77 68 69 6c s any bytes whil
2540: 65 20 76 65 72 69 66 79 20 63 61 6c 6c 62 61 63 e verify callbac
2550: 6b 20 69 73 20 72 75 6e 6e 69 6e 67 20 2a 2f 0a k is running */.
2560: 09 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 62 61 .dprintf("Callba
2570: 63 6b 20 69 73 20 72 75 6e 6e 69 6e 67 2c 20 72 ck is running, r
2580: 65 61 64 69 6e 67 20 30 20 62 79 74 65 73 22 29 eading 0 bytes")
2590: 3b 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 20 20 ;..return(0);.
25a0: 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 }.. dprintf
25b0: 28 22 43 61 6c 6c 69 6e 67 20 54 6c 73 5f 57 61 ("Calling Tls_Wa
25c0: 69 74 46 6f 72 43 6f 6e 6e 65 63 74 22 29 3b 0a itForConnect");.
25d0: 20 20 20 20 74 6c 73 43 6f 6e 6e 65 63 74 20 3d tlsConnect =
25e0: 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e Tls_WaitForConn
25f0: 65 63 74 28 73 74 61 74 65 50 74 72 2c 20 65 72 ect(statePtr, er
2600: 72 6f 72 43 6f 64 65 50 74 72 2c 20 30 29 3b 0a rorCodePtr, 0);.
2610: 20 20 20 20 69 66 20 28 74 6c 73 43 6f 6e 6e 65 if (tlsConne
2620: 63 74 20 3c 20 30 29 20 7b 0a 09 64 70 72 69 6e ct < 0) {..dprin
2630: 74 66 28 22 47 6f 74 20 61 6e 20 65 72 72 6f 72 tf("Got an error
2640: 20 77 61 69 74 69 6e 67 20 74 6f 20 63 6f 6e 6e waiting to conn
2650: 65 63 74 20 28 74 6c 73 43 6f 6e 6e 65 63 74 20 ect (tlsConnect
2660: 3d 20 25 69 2c 20 2a 65 72 72 6f 72 43 6f 64 65 = %i, *errorCode
2670: 50 74 72 20 3d 20 25 69 29 22 2c 20 74 6c 73 43 Ptr = %i)", tlsC
2680: 6f 6e 6e 65 63 74 2c 20 2a 65 72 72 6f 72 43 6f onnect, *errorCo
2690: 64 65 50 74 72 29 3b 0a 09 54 6c 73 5f 45 72 72 dePtr);..Tls_Err
26a0: 6f 72 28 73 74 61 74 65 50 74 72 2c 20 73 74 72 or(statePtr, str
26b0: 65 72 72 6f 72 28 2a 65 72 72 6f 72 43 6f 64 65 error(*errorCode
26c0: 50 74 72 29 29 3b 0a 0a 09 62 79 74 65 73 52 65 Ptr));...bytesRe
26d0: 61 64 20 3d 20 2d 31 3b 0a 09 69 66 20 28 2a 65 ad = -1;..if (*e
26e0: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 3d 20 45 rrorCodePtr == E
26f0: 43 4f 4e 4e 52 45 53 45 54 29 20 7b 0a 09 20 20 CONNRESET) {..
2700: 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20 63 dprintf("Got c
2710: 6f 6e 6e 65 63 74 69 6f 6e 20 72 65 73 65 74 22 onnection reset"
2720: 29 3b 0a 09 20 20 20 20 2f 2a 20 53 6f 66 74 20 );.. /* Soft
2730: 45 4f 46 20 2a 2f 0a 09 20 20 20 20 2a 65 72 72 EOF */.. *err
2740: 6f 72 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a 09 orCodePtr = 0;..
2750: 20 20 20 20 62 79 74 65 73 52 65 61 64 20 3d 20 bytesRead =
2760: 30 3b 0a 09 7d 0a 09 72 65 74 75 72 6e 28 62 79 0;..}..return(by
2770: 74 65 73 52 65 61 64 29 3b 0a 20 20 20 20 7d 0a tesRead);. }.
2780: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 57 . /*. * W
2790: 65 20 6e 65 65 64 20 74 6f 20 63 6c 65 61 72 20 e need to clear
27a0: 74 68 65 20 53 53 4c 20 65 72 72 6f 72 20 73 74 the SSL error st
27b0: 61 63 6b 20 6e 6f 77 20 62 65 63 61 75 73 65 20 ack now because
27c0: 77 65 20 73 6f 6d 65 74 69 6d 65 73 20 72 65 61 we sometimes rea
27d0: 63 68 0a 20 20 20 20 20 2a 20 74 68 69 73 20 66 ch. * this f
27e0: 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 6c 65 66 unction with lef
27f0: 74 6f 76 65 72 20 65 72 72 6f 72 73 20 69 6e 20 tover errors in
2800: 74 68 65 20 73 74 61 63 6b 2e 20 20 49 66 20 42 the stack. If B
2810: 49 4f 5f 72 65 61 64 0a 20 20 20 20 20 2a 20 72 IO_read. * r
2820: 65 74 75 72 6e 73 20 2d 31 20 61 6e 64 20 69 6e eturns -1 and in
2830: 74 65 6e 64 73 20 45 41 47 41 49 4e 2c 20 74 68 tends EAGAIN, th
2840: 65 72 65 20 69 73 20 61 20 6c 65 66 74 6f 76 65 ere is a leftove
2850: 72 20 65 72 72 6f 72 2c 20 69 74 20 77 69 6c 6c r error, it will
2860: 20 62 65 0a 20 20 20 20 20 2a 20 6d 69 73 63 6f be. * misco
2870: 6e 73 74 72 75 65 64 20 61 73 20 61 6e 20 65 72 nstrued as an er
2880: 72 6f 72 2c 20 6e 6f 74 20 45 41 47 41 49 4e 2e ror, not EAGAIN.
2890: 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 41 . *. * A
28a0: 6c 74 65 72 6e 61 74 69 76 65 6c 79 2c 20 77 65 lternatively, we
28b0: 20 6d 61 79 20 77 61 6e 74 20 74 6f 20 68 61 6e may want to han
28c0: 64 6c 65 20 74 68 65 20 3c 30 20 72 65 74 75 72 dle the <0 retur
28d0: 6e 20 63 6f 64 65 73 20 66 72 6f 6d 0a 20 20 20 n codes from.
28e0: 20 20 2a 20 42 49 4f 5f 72 65 61 64 20 73 70 65 * BIO_read spe
28f0: 63 69 61 6c 6c 79 20 28 61 73 20 61 64 76 69 73 cially (as advis
2900: 65 64 20 69 6e 20 74 68 65 20 52 53 41 20 64 6f ed in the RSA do
2910: 63 73 29 2e 20 20 54 4c 53 27 73 20 6c 6f 77 65 cs). TLS's lowe
2920: 72 20 6c 65 76 65 6c 20 42 49 4f 0a 20 20 20 20 r level BIO.
2930: 20 2a 20 66 75 6e 63 74 69 6f 6e 73 20 70 6c 61 * functions pla
2940: 79 20 77 69 74 68 20 74 68 65 20 72 65 74 72 79 y with the retry
2950: 20 66 6c 61 67 73 20 74 68 6f 75 67 68 2c 20 61 flags though, a
2960: 6e 64 20 74 68 69 73 20 73 65 65 6d 73 20 74 6f nd this seems to
2970: 20 77 6f 72 6b 0a 20 20 20 20 20 2a 20 63 6f 72 work. * cor
2980: 72 65 63 74 6c 79 2e 20 20 53 69 6d 69 6c 61 72 rectly. Similar
2990: 20 66 69 78 20 69 6e 20 54 6c 73 4f 75 74 70 75 fix in TlsOutpu
29a0: 74 50 72 6f 63 2e 20 2d 20 68 6f 62 62 73 0a 20 tProc. - hobbs.
29b0: 20 20 20 20 2a 2f 0a 20 20 20 20 45 52 52 5f 63 */. ERR_c
29c0: 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 20 20 lear_error();.
29d0: 20 20 62 79 74 65 73 52 65 61 64 20 3d 20 42 49 bytesRead = BI
29e0: 4f 5f 72 65 61 64 28 73 74 61 74 65 50 74 72 2d O_read(statePtr-
29f0: 3e 62 69 6f 2c 20 62 75 66 2c 20 62 75 66 53 69 >bio, buf, bufSi
2a00: 7a 65 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 ze);. dprintf
2a10: 28 22 42 49 4f 5f 72 65 61 64 20 2d 3e 20 25 64 ("BIO_read -> %d
2a20: 22 2c 20 62 79 74 65 73 52 65 61 64 29 3b 0a 0a ", bytesRead);..
2a30: 20 20 20 20 65 72 72 20 3d 20 53 53 4c 5f 67 65 err = SSL_ge
2a40: 74 5f 65 72 72 6f 72 28 73 74 61 74 65 50 74 72 t_error(statePtr
2a50: 2d 3e 73 73 6c 2c 20 62 79 74 65 73 52 65 61 64 ->ssl, bytesRead
2a60: 29 3b 0a 20 20 20 20 62 61 63 6b 69 6e 67 45 72 );. backingEr
2a70: 72 6f 72 20 3d 20 45 52 52 5f 67 65 74 5f 65 72 ror = ERR_get_er
2a80: 72 6f 72 28 29 3b 0a 0a 23 69 66 20 30 0a 20 20 ror();..#if 0.
2a90: 20 20 69 66 20 28 62 79 74 65 73 52 65 61 64 20 if (bytesRead
2aa0: 3c 3d 20 30 29 20 7b 0a 09 69 66 20 28 42 49 4f <= 0) {..if (BIO
2ab0: 5f 73 68 6f 75 6c 64 5f 72 65 74 72 79 28 73 74 _should_retry(st
2ac0: 61 74 65 50 74 72 2d 3e 62 69 6f 29 29 20 7b 0a atePtr->bio)) {.
2ad0: 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 49 2f . dprintf("I/
2ae0: 4f 20 66 61 69 6c 65 64 2c 20 77 69 6c 6c 20 72 O failed, will r
2af0: 65 74 72 79 20 62 61 73 65 64 20 6f 6e 20 45 41 etry based on EA
2b00: 47 41 49 4e 22 29 3b 0a 09 20 20 20 20 2a 65 72 GAIN");.. *er
2b10: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 41 47 rorCodePtr = EAG
2b20: 41 49 4e 3b 0a 09 7d 0a 20 20 20 20 7d 0a 23 65 AIN;..}. }.#e
2b30: 6e 64 69 66 0a 0a 20 20 20 20 73 77 69 74 63 68 ndif.. switch
2b40: 20 28 65 72 72 29 20 7b 0a 09 63 61 73 65 20 53 (err) {..case S
2b50: 53 4c 5f 45 52 52 4f 52 5f 4e 4f 4e 45 3a 0a 09 SL_ERROR_NONE:..
2b60: 20 20 20 20 64 70 72 69 6e 74 42 75 66 66 65 72 dprintBuffer
2b70: 28 62 75 66 2c 20 62 79 74 65 73 52 65 61 64 29 (buf, bytesRead)
2b80: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 ;.. break;...
2b90: 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 53 case SSL_ERROR_S
2ba0: 53 4c 3a 0a 09 20 20 20 20 2f 2a 20 41 20 6e 6f SL:.. /* A no
2bb0: 6e 2d 72 65 63 6f 76 65 72 61 62 6c 65 2c 20 66 n-recoverable, f
2bc0: 61 74 61 6c 20 65 72 72 6f 72 20 69 6e 20 74 68 atal error in th
2bd0: 65 20 53 53 4c 20 6c 69 62 72 61 72 79 20 6f 63 e SSL library oc
2be0: 63 75 72 72 65 64 2c 20 75 73 75 61 6c 6c 79 20 curred, usually
2bf0: 61 20 70 72 6f 74 6f 63 6f 6c 20 65 72 72 6f 72 a protocol error
2c00: 20 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e 74 66 */.. dprintf
2c10: 28 22 53 53 4c 20 65 72 72 6f 72 2c 20 69 6e 64 ("SSL error, ind
2c20: 69 63 61 74 69 6e 67 20 74 68 61 74 20 74 68 65 icating that the
2c30: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 connection has
2c40: 62 65 65 6e 20 61 62 6f 72 74 65 64 22 29 3b 0a been aborted");.
2c50: 09 20 20 20 20 69 66 20 28 62 61 63 6b 69 6e 67 . if (backing
2c60: 45 72 72 6f 72 20 21 3d 20 30 29 20 7b 0a 09 09 Error != 0) {...
2c70: 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 Tls_Error(stateP
2c80: 74 72 2c 20 28 63 68 61 72 20 2a 29 20 45 52 52 tr, (char *) ERR
2c90: 5f 72 65 61 73 6f 6e 5f 65 72 72 6f 72 5f 73 74 _reason_error_st
2ca0: 72 69 6e 67 28 62 61 63 6b 69 6e 67 45 72 72 6f ring(backingErro
2cb0: 72 29 29 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 r));.. } else
2cc0: 20 69 66 20 28 53 53 4c 5f 67 65 74 5f 76 65 72 if (SSL_get_ver
2cd0: 69 66 79 5f 72 65 73 75 6c 74 28 73 74 61 74 65 ify_result(state
2ce0: 50 74 72 2d 3e 73 73 6c 29 20 21 3d 20 58 35 30 Ptr->ssl) != X50
2cf0: 39 5f 56 5f 4f 4b 29 20 7b 0a 09 09 54 6c 73 5f 9_V_OK) {...Tls_
2d00: 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20 Error(statePtr,
2d10: 28 63 68 61 72 20 2a 29 20 58 35 30 39 5f 76 65 (char *) X509_ve
2d20: 72 69 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f rify_cert_error_
2d30: 73 74 72 69 6e 67 28 53 53 4c 5f 67 65 74 5f 76 string(SSL_get_v
2d40: 65 72 69 66 79 5f 72 65 73 75 6c 74 28 73 74 61 erify_result(sta
2d50: 74 65 50 74 72 2d 3e 73 73 6c 29 29 29 3b 0a 09 tePtr->ssl)));..
2d60: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 54 } else {...T
2d70: 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 ls_Error(statePt
2d80: 72 2c 20 22 55 6e 6b 6e 6f 77 6e 20 53 53 4c 20 r, "Unknown SSL
2d90: 65 72 72 6f 72 22 29 3b 0a 09 20 20 20 20 7d 0a error");.. }.
2da0: 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 . *errorCodeP
2db0: 74 72 20 3d 20 45 43 4f 4e 4e 41 42 4f 52 54 45 tr = ECONNABORTE
2dc0: 44 3b 0a 09 20 20 20 20 62 79 74 65 73 52 65 61 D;.. bytesRea
2dd0: 64 20 3d 20 2d 31 3b 0a 0a 23 69 66 20 4f 50 45 d = -1;..#if OPE
2de0: 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d NSSL_VERSION_NUM
2df0: 42 45 52 20 3e 3d 20 30 78 33 30 30 30 30 30 30 BER >= 0x3000000
2e00: 30 4c 0a 09 20 20 20 20 2f 2a 20 55 6e 65 78 70 0L.. /* Unexp
2e10: 65 63 74 65 64 20 45 4f 46 20 66 72 6f 6d 20 74 ected EOF from t
2e20: 68 65 20 70 65 65 72 20 66 6f 72 20 4f 70 65 6e he peer for Open
2e30: 53 53 4c 20 33 2e 30 2b 20 2a 2f 0a 09 20 20 20 SSL 3.0+ */..
2e40: 20 69 66 20 28 45 52 52 5f 47 45 54 5f 52 45 41 if (ERR_GET_REA
2e50: 53 4f 4e 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 SON(backingError
2e60: 29 20 3d 3d 20 53 53 4c 5f 52 5f 55 4e 45 58 50 ) == SSL_R_UNEXP
2e70: 45 43 54 45 44 5f 45 4f 46 5f 57 48 49 4c 45 5f ECTED_EOF_WHILE_
2e80: 52 45 41 44 49 4e 47 29 20 7b 0a 09 09 64 70 72 READING) {...dpr
2e90: 69 6e 74 66 28 22 28 55 6e 65 78 70 65 63 74 65 intf("(Unexpecte
2ea0: 64 29 20 45 4f 46 20 72 65 61 63 68 65 64 22 29 d) EOF reached")
2eb0: 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 ...*errorCodePtr
2ec0: 20 3d 20 30 3b 0a 09 09 62 79 74 65 73 52 65 61 = 0;...bytesRea
2ed0: 64 20 3d 20 30 3b 0a 09 09 54 6c 73 5f 45 72 72 d = 0;...Tls_Err
2ee0: 6f 72 28 73 74 61 74 65 50 74 72 2c 20 22 45 4f or(statePtr, "EO
2ef0: 46 20 72 65 61 63 68 65 64 22 29 3b 0a 09 20 20 F reached");..
2f00: 20 20 7d 0a 23 65 6e 64 69 66 0a 09 20 20 20 20 }.#endif..
2f10: 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20 53 53 break;...case SS
2f20: 4c 5f 45 52 52 4f 52 5f 53 59 53 43 41 4c 4c 3a L_ERROR_SYSCALL:
2f30: 0a 09 20 20 20 20 2f 2a 20 53 6f 6d 65 20 6e 6f .. /* Some no
2f40: 6e 2d 72 65 63 6f 76 65 72 61 62 6c 65 2c 20 66 n-recoverable, f
2f50: 61 74 61 6c 20 49 2f 4f 20 65 72 72 6f 72 20 6f atal I/O error o
2f60: 63 63 75 72 72 65 64 20 2a 2f 0a 0a 09 20 20 20 ccurred */...
2f70: 20 69 66 20 28 62 61 63 6b 69 6e 67 45 72 72 6f if (backingErro
2f80: 72 20 3d 3d 20 30 20 26 26 20 62 79 74 65 73 52 r == 0 && bytesR
2f90: 65 61 64 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a ead == 0) {.../*
2fa0: 20 55 6e 65 78 70 65 63 74 65 64 20 45 4f 46 20 Unexpected EOF
2fb0: 66 72 6f 6d 20 74 68 65 20 70 65 65 72 20 66 6f from the peer fo
2fc0: 72 20 4f 70 65 6e 53 53 4c 20 31 2e 31 20 2a 2f r OpenSSL 1.1 */
2fd0: 0a 09 09 64 70 72 69 6e 74 66 28 22 28 55 6e 65 ...dprintf("(Une
2fe0: 78 70 65 63 74 65 64 29 20 45 4f 46 20 72 65 61 xpected) EOF rea
2ff0: 63 68 65 64 22 29 0a 09 09 2a 65 72 72 6f 72 43 ched")...*errorC
3000: 6f 64 65 50 74 72 20 3d 20 30 3b 0a 09 09 62 79 odePtr = 0;...by
3010: 74 65 73 52 65 61 64 20 3d 20 30 3b 0a 09 09 54 tesRead = 0;...T
3020: 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 ls_Error(statePt
3030: 72 2c 20 22 45 4f 46 20 72 65 61 63 68 65 64 22 r, "EOF reached"
3040: 29 3b 0a 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 );... } else
3050: 69 66 20 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 if (backingError
3060: 20 3d 3d 20 30 20 26 26 20 62 79 74 65 73 52 65 == 0 && bytesRe
3070: 61 64 20 3d 3d 20 2d 31 29 20 7b 0a 09 09 64 70 ad == -1) {...dp
3080: 72 69 6e 74 66 28 22 49 2f 4f 20 65 72 72 6f 72 rintf("I/O error
3090: 20 6f 63 63 75 72 72 65 64 20 28 65 72 72 6e 6f occurred (errno
30a0: 20 3d 20 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 = %lu)", (unsig
30b0: 6e 65 64 20 6c 6f 6e 67 29 20 54 63 6c 5f 47 65 ned long) Tcl_Ge
30c0: 74 45 72 72 6e 6f 28 29 29 3b 0a 09 09 2a 65 72 tErrno());...*er
30d0: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 54 63 6c rorCodePtr = Tcl
30e0: 5f 47 65 74 45 72 72 6e 6f 28 29 3b 0a 09 09 62 _GetErrno();...b
30f0: 79 74 65 73 52 65 61 64 20 3d 20 2d 31 3b 0a 09 ytesRead = -1;..
3100: 09 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 .Tls_Error(state
3110: 50 74 72 2c 20 28 63 68 61 72 20 2a 29 20 54 63 Ptr, (char *) Tc
3120: 6c 5f 45 72 72 6e 6f 4d 73 67 28 2a 65 72 72 6f l_ErrnoMsg(*erro
3130: 72 43 6f 64 65 50 74 72 29 29 3b 0a 0a 09 20 20 rCodePtr));...
3140: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 64 70 72 } else {...dpr
3150: 69 6e 74 66 28 22 49 2f 4f 20 65 72 72 6f 72 20 intf("I/O error
3160: 6f 63 63 75 72 72 65 64 20 28 62 61 63 6b 69 6e occurred (backin
3170: 67 45 72 72 6f 72 20 3d 20 25 6c 75 29 22 2c 20 gError = %lu)",
3180: 62 61 63 6b 69 6e 67 45 72 72 6f 72 29 3b 0a 09 backingError);..
3190: 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d .*errorCodePtr =
31a0: 20 54 63 6c 5f 47 65 74 45 72 72 6e 6f 28 29 3b Tcl_GetErrno();
31b0: 0a 09 09 62 79 74 65 73 52 65 61 64 20 3d 20 2d ...bytesRead = -
31c0: 31 3b 0a 09 09 54 6c 73 5f 45 72 72 6f 72 28 73 1;...Tls_Error(s
31d0: 74 61 74 65 50 74 72 2c 20 28 63 68 61 72 20 2a tatePtr, (char *
31e0: 29 20 45 52 52 5f 72 65 61 73 6f 6e 5f 65 72 72 ) ERR_reason_err
31f0: 6f 72 5f 73 74 72 69 6e 67 28 62 61 63 6b 69 6e or_string(backin
3200: 67 45 72 72 6f 72 29 29 3b 0a 09 20 20 20 20 7d gError));.. }
3210: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 63 .. break;...c
3220: 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 5a 45 ase SSL_ERROR_ZE
3230: 52 4f 5f 52 45 54 55 52 4e 3a 0a 09 20 20 20 20 RO_RETURN:..
3240: 64 70 72 69 6e 74 66 28 22 47 6f 74 20 53 53 4c dprintf("Got SSL
3250: 5f 45 52 52 4f 52 5f 5a 45 52 4f 5f 52 45 54 55 _ERROR_ZERO_RETU
3260: 52 4e 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 61 RN, this means a
3270: 6e 20 45 4f 46 20 68 61 73 20 62 65 65 6e 20 72 n EOF has been r
3280: 65 61 63 68 65 64 22 29 3b 0a 09 20 20 20 20 62 eached");.. b
3290: 79 74 65 73 52 65 61 64 20 3d 20 30 3b 0a 09 20 ytesRead = 0;..
32a0: 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 *errorCodePtr
32b0: 20 3d 20 30 3b 0a 09 20 20 20 20 54 6c 73 5f 45 = 0;.. Tls_E
32c0: 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20 22 rror(statePtr, "
32d0: 50 65 65 72 20 68 61 73 20 63 6c 6f 73 65 64 20 Peer has closed
32e0: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 the connection f
32f0: 6f 72 20 77 72 69 74 69 6e 67 20 62 79 20 73 65 or writing by se
3300: 6e 64 69 6e 67 20 74 68 65 20 63 6c 6f 73 65 5f nding the close_
3310: 6e 6f 74 69 66 79 20 61 6c 65 72 74 22 29 3b 0a notify alert");.
3320: 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 63 61 . break;...ca
3330: 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e se SSL_ERROR_WAN
3340: 54 5f 52 45 41 44 3a 0a 09 20 20 20 20 64 70 72 T_READ:.. dpr
3350: 69 6e 74 66 28 22 47 6f 74 20 53 53 4c 5f 45 52 intf("Got SSL_ER
3360: 52 4f 52 5f 57 41 4e 54 5f 52 45 41 44 2c 20 6d ROR_WANT_READ, m
3370: 61 70 70 69 6e 67 20 74 68 69 73 20 74 6f 20 45 apping this to E
3380: 41 47 41 49 4e 22 29 3b 0a 09 20 20 20 20 62 79 AGAIN");.. by
3390: 74 65 73 52 65 61 64 20 3d 20 2d 31 3b 0a 09 20 tesRead = -1;..
33a0: 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 *errorCodePtr
33b0: 20 3d 20 45 41 47 41 49 4e 3b 0a 09 20 20 20 20 = EAGAIN;..
33c0: 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 Tls_Error(stateP
33d0: 74 72 2c 20 22 53 53 4c 5f 45 52 52 4f 52 5f 57 tr, "SSL_ERROR_W
33e0: 41 4e 54 5f 52 45 41 44 22 29 3b 0a 09 20 20 20 ANT_READ");..
33f0: 20 62 72 65 61 6b 3b 0a 0a 09 64 65 66 61 75 6c break;...defaul
3400: 74 3a 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 t:.. dprintf(
3410: 22 55 6e 6b 6e 6f 77 6e 20 65 72 72 6f 72 20 28 "Unknown error (
3420: 65 72 72 20 3d 20 25 69 29 2c 20 6d 61 70 70 69 err = %i), mappi
3430: 6e 67 20 74 6f 20 45 4f 46 22 2c 20 65 72 72 29 ng to EOF", err)
3440: 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 ;.. *errorCod
3450: 65 50 74 72 20 3d 20 30 3b 0a 09 20 20 20 20 62 ePtr = 0;.. b
3460: 79 74 65 73 52 65 61 64 20 3d 20 30 3b 0a 09 20 ytesRead = 0;..
3470: 20 20 20 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 Tls_Error(sta
3480: 74 65 50 74 72 2c 20 22 55 6e 6b 6e 6f 77 6e 20 tePtr, "Unknown
3490: 65 72 72 6f 72 22 29 3b 0a 09 20 20 20 20 62 72 error");.. br
34a0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 eak;. }..
34b0: 64 70 72 69 6e 74 66 28 22 49 6e 70 75 74 28 25 dprintf("Input(%
34c0: 64 29 20 2d 3e 20 25 64 20 5b 25 64 5d 22 2c 20 d) -> %d [%d]",
34d0: 62 75 66 53 69 7a 65 2c 20 62 79 74 65 73 52 65 bufSize, bytesRe
34e0: 61 64 2c 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 ad, *errorCodePt
34f0: 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 r);. return b
3500: 79 74 65 73 52 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a ytesRead;.}../*.
3510: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
3520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3550: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 4f -----. *. * TlsO
3560: 75 74 70 75 74 50 72 6f 63 20 2d 2d 0a 20 2a 0a utputProc --. *.
3570: 20 2a 20 20 20 20 54 68 69 73 20 70 72 6f 63 65 * This proce
3580: 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 dure is invoked
3590: 62 79 20 74 68 65 20 67 65 6e 65 72 69 63 20 49 by the generic I
35a0: 4f 20 6c 65 76 65 6c 0a 20 2a 20 20 20 20 20 20 O level. *
35b0: 20 74 6f 20 77 72 69 74 65 20 6f 75 74 70 75 74 to write output
35c0: 20 74 6f 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 to a SSL socket
35d0: 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 2e 0a based channel..
35e0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
35f0: 2a 20 20 20 20 52 65 74 75 72 6e 73 20 74 68 65 * Returns the
3600: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 number of bytes
3610: 20 77 72 69 74 74 65 6e 20 6f 72 20 2d 31 20 6f written or -1 o
3620: 6e 20 65 72 72 6f 72 2e 20 53 65 74 73 20 65 72 n error. Sets er
3630: 72 6f 72 43 6f 64 65 50 74 72 0a 20 2a 20 20 20 rorCodePtr. *
3640: 20 74 6f 20 61 20 50 4f 53 49 58 20 65 72 72 6f to a POSIX erro
3650: 72 20 63 6f 64 65 20 69 66 20 61 6e 20 65 72 72 r code if an err
3660: 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 6f 72 20 or occurred, or
3670: 30 20 69 66 20 6e 6f 6e 65 2e 0a 20 2a 0a 20 2a 0 if none.. *. *
3680: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
3690: 2a 20 20 20 20 57 72 69 74 65 73 20 6f 75 74 70 * Writes outp
36a0: 75 74 20 6f 6e 20 74 68 65 20 6f 75 74 70 75 74 ut on the output
36b0: 20 64 65 76 69 63 65 20 6f 66 20 74 68 65 20 63 device of the c
36c0: 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d hannel.. *. *---
36d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
36e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
36f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3710: 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 . */..static int
3720: 20 54 6c 73 4f 75 74 70 75 74 50 72 6f 63 28 0a TlsOutputProc(.
3730: 20 20 20 20 76 6f 69 64 20 2a 69 6e 73 74 61 6e void *instan
3740: 63 65 44 61 74 61 2c 0a 20 20 20 20 63 6f 6e 73 ceData,. cons
3750: 74 20 63 68 61 72 20 2a 62 75 66 2c 0a 20 20 20 t char *buf,.
3760: 20 69 6e 74 20 74 6f 57 72 69 74 65 2c 0a 20 20 int toWrite,.
3770: 20 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 int *errorCode
3780: 50 74 72 29 0a 7b 0a 20 20 20 20 75 6e 73 69 67 Ptr).{. unsig
3790: 6e 65 64 20 6c 6f 6e 67 20 62 61 63 6b 69 6e 67 ned long backing
37a0: 45 72 72 6f 72 3b 0a 20 20 20 20 53 74 61 74 65 Error;. State
37b0: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 *statePtr = (St
37c0: 61 74 65 20 2a 29 20 69 6e 73 74 61 6e 63 65 44 ate *) instanceD
37d0: 61 74 61 3b 0a 20 20 20 20 69 6e 74 20 77 72 69 ata;. int wri
37e0: 74 74 65 6e 2c 20 65 72 72 3b 0a 20 20 20 20 69 tten, err;. i
37f0: 6e 74 20 74 6c 73 43 6f 6e 6e 65 63 74 3b 0a 0a nt tlsConnect;..
3800: 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 *errorCodePt
3810: 72 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 r = 0;.. dpri
3820: 6e 74 66 28 22 42 49 4f 5f 77 72 69 74 65 28 25 ntf("BIO_write(%
3830: 70 2c 20 25 64 29 22 2c 20 28 76 6f 69 64 20 2a p, %d)", (void *
3840: 29 20 73 74 61 74 65 50 74 72 2c 20 74 6f 57 72 ) statePtr, toWr
3850: 69 74 65 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 ite);. dprint
3860: 42 75 66 66 65 72 28 62 75 66 2c 20 74 6f 57 72 Buffer(buf, toWr
3870: 69 74 65 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 ite);.. if (s
3880: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 tatePtr->flags &
3890: 20 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 41 43 TLS_TCL_CALLBAC
38a0: 4b 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 44 K) {..dprintf("D
38b0: 6f 6e 27 74 20 70 72 6f 63 65 73 73 20 6f 75 74 on't process out
38c0: 70 75 74 20 77 68 69 6c 65 20 63 61 6c 6c 62 61 put while callba
38d0: 63 6b 73 20 61 72 65 20 72 75 6e 6e 69 6e 67 22 cks are running"
38e0: 29 3b 0a 09 77 72 69 74 74 65 6e 20 3d 20 2d 31 );..written = -1
38f0: 3b 0a 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 ;..*errorCodePtr
3900: 20 3d 20 45 41 47 41 49 4e 3b 0a 09 72 65 74 75 = EAGAIN;..retu
3910: 72 6e 28 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 rn(-1);. }..
3920: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
3930: 69 6e 67 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 ing Tls_WaitForC
3940: 6f 6e 6e 65 63 74 22 29 3b 0a 20 20 20 20 74 6c onnect");. tl
3950: 73 43 6f 6e 6e 65 63 74 20 3d 20 54 6c 73 5f 57 sConnect = Tls_W
3960: 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 28 73 74 aitForConnect(st
3970: 61 74 65 50 74 72 2c 20 65 72 72 6f 72 43 6f 64 atePtr, errorCod
3980: 65 50 74 72 2c 20 31 29 3b 0a 20 20 20 20 69 66 ePtr, 1);. if
3990: 20 28 74 6c 73 43 6f 6e 6e 65 63 74 20 3c 20 30 (tlsConnect < 0
39a0: 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 47 6f ) {..dprintf("Go
39b0: 74 20 61 6e 20 65 72 72 6f 72 20 77 61 69 74 69 t an error waiti
39c0: 6e 67 20 74 6f 20 63 6f 6e 6e 65 63 74 20 28 74 ng to connect (t
39d0: 6c 73 43 6f 6e 6e 65 63 74 20 3d 20 25 69 2c 20 lsConnect = %i,
39e0: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 *errorCodePtr =
39f0: 25 69 29 22 2c 20 74 6c 73 43 6f 6e 6e 65 63 74 %i)", tlsConnect
3a00: 2c 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29 , *errorCodePtr)
3a10: 3b 0a 09 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 ;..Tls_Error(sta
3a20: 74 65 50 74 72 2c 20 73 74 72 65 72 72 6f 72 28 tePtr, strerror(
3a30: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29 29 3b *errorCodePtr));
3a40: 0a 0a 09 77 72 69 74 74 65 6e 20 3d 20 2d 31 3b ...written = -1;
3a50: 0a 09 69 66 20 28 2a 65 72 72 6f 72 43 6f 64 65 ..if (*errorCode
3a60: 50 74 72 20 3d 3d 20 45 43 4f 4e 4e 52 45 53 45 Ptr == ECONNRESE
3a70: 54 29 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 T) {.. dprint
3a80: 66 28 22 47 6f 74 20 63 6f 6e 6e 65 63 74 69 6f f("Got connectio
3a90: 6e 20 72 65 73 65 74 22 29 3b 0a 09 20 20 20 20 n reset");..
3aa0: 2f 2a 20 53 6f 66 74 20 45 4f 46 20 2a 2f 0a 09 /* Soft EOF */..
3ab0: 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 *errorCodePt
3ac0: 72 20 3d 20 30 3b 0a 09 20 20 20 20 77 72 69 74 r = 0;.. writ
3ad0: 74 65 6e 20 3d 20 30 3b 0a 09 7d 0a 09 72 65 74 ten = 0;..}..ret
3ae0: 75 72 6e 28 77 72 69 74 74 65 6e 29 3b 0a 20 20 urn(written);.
3af0: 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 74 6f 57 }.. if (toW
3b00: 72 69 74 65 20 3d 3d 20 30 29 20 7b 0a 09 64 70 rite == 0) {..dp
3b10: 72 69 6e 74 66 28 22 7a 65 72 6f 2d 77 72 69 74 rintf("zero-writ
3b20: 65 22 29 3b 0a 09 65 72 72 20 3d 20 42 49 4f 5f e");..err = BIO_
3b30: 66 6c 75 73 68 28 73 74 61 74 65 50 74 72 2d 3e flush(statePtr->
3b40: 62 69 6f 29 3b 0a 0a 09 69 66 20 28 65 72 72 20 bio);...if (err
3b50: 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 64 70 72 <= 0) {.. dpr
3b60: 69 6e 74 66 28 22 46 6c 75 73 68 69 6e 67 20 66 intf("Flushing f
3b70: 61 69 6c 65 64 22 29 3b 0a 09 20 20 20 20 54 6c ailed");.. Tl
3b80: 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 s_Error(statePtr
3b90: 2c 20 22 46 6c 75 73 68 20 66 61 69 6c 65 64 22 , "Flush failed"
3ba0: 29 3b 0a 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 );... *errorC
3bb0: 6f 64 65 50 74 72 20 3d 20 45 49 4f 3b 0a 09 20 odePtr = EIO;..
3bc0: 20 20 20 77 72 69 74 74 65 6e 20 3d 20 30 3b 0a written = 0;.
3bd0: 09 20 20 20 20 72 65 74 75 72 6e 28 2d 31 29 3b . return(-1);
3be0: 0a 09 7d 0a 0a 09 77 72 69 74 74 65 6e 20 3d 20 ..}...written =
3bf0: 30 3b 0a 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 0;..*errorCodePt
3c00: 72 20 3d 20 30 3b 0a 09 72 65 74 75 72 6e 28 30 r = 0;..return(0
3c10: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a );. }.. /*
3c20: 0a 20 20 20 20 20 2a 20 57 65 20 6e 65 65 64 20 . * We need
3c30: 74 6f 20 63 6c 65 61 72 20 74 68 65 20 53 53 4c to clear the SSL
3c40: 20 65 72 72 6f 72 20 73 74 61 63 6b 20 6e 6f 77 error stack now
3c50: 20 62 65 63 61 75 73 65 20 77 65 20 73 6f 6d 65 because we some
3c60: 74 69 6d 65 73 20 72 65 61 63 68 0a 20 20 20 20 times reach.
3c70: 20 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e * this function
3c80: 20 77 69 74 68 20 6c 65 66 74 6f 76 65 72 20 65 with leftover e
3c90: 72 72 6f 72 73 20 69 6e 20 74 68 65 20 73 74 61 rrors in the sta
3ca0: 63 6b 2e 20 20 49 66 20 42 49 4f 5f 77 72 69 74 ck. If BIO_writ
3cb0: 65 0a 20 20 20 20 20 2a 20 72 65 74 75 72 6e 73 e. * returns
3cc0: 20 2d 31 20 61 6e 64 20 69 6e 74 65 6e 64 73 20 -1 and intends
3cd0: 45 41 47 41 49 4e 2c 20 74 68 65 72 65 20 69 73 EAGAIN, there is
3ce0: 20 61 20 6c 65 66 74 6f 76 65 72 20 65 72 72 6f a leftover erro
3cf0: 72 2c 20 69 74 20 77 69 6c 6c 20 62 65 0a 20 20 r, it will be.
3d00: 20 20 20 2a 20 6d 69 73 63 6f 6e 73 74 72 75 65 * misconstrue
3d10: 64 20 61 73 20 61 6e 20 65 72 72 6f 72 2c 20 6e d as an error, n
3d20: 6f 74 20 45 41 47 41 49 4e 2e 0a 20 20 20 20 20 ot EAGAIN..
3d30: 2a 0a 20 20 20 20 20 2a 20 41 6c 74 65 72 6e 61 *. * Alterna
3d40: 74 69 76 65 6c 79 2c 20 77 65 20 6d 61 79 20 77 tively, we may w
3d50: 61 6e 74 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 ant to handle th
3d60: 65 20 3c 30 20 72 65 74 75 72 6e 20 63 6f 64 65 e <0 return code
3d70: 73 20 66 72 6f 6d 0a 20 20 20 20 20 2a 20 42 49 s from. * BI
3d80: 4f 5f 77 72 69 74 65 20 73 70 65 63 69 61 6c 6c O_write speciall
3d90: 79 20 28 61 73 20 61 64 76 69 73 65 64 20 69 6e y (as advised in
3da0: 20 74 68 65 20 52 53 41 20 64 6f 63 73 29 2e 20 the RSA docs).
3db0: 20 54 4c 53 27 73 20 6c 6f 77 65 72 20 6c 65 76 TLS's lower lev
3dc0: 65 6c 0a 20 20 20 20 20 2a 20 42 49 4f 20 66 75 el. * BIO fu
3dd0: 6e 63 74 69 6f 6e 73 20 70 6c 61 79 20 77 69 74 nctions play wit
3de0: 68 20 74 68 65 20 72 65 74 72 79 20 66 6c 61 67 h the retry flag
3df0: 73 20 74 68 6f 75 67 68 2c 20 61 6e 64 20 74 68 s though, and th
3e00: 69 73 20 73 65 65 6d 73 20 74 6f 0a 20 20 20 20 is seems to.
3e10: 20 2a 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c * work correctl
3e20: 79 2e 20 20 53 69 6d 69 6c 61 72 20 66 69 78 20 y. Similar fix
3e30: 69 6e 20 54 6c 73 49 6e 70 75 74 50 72 6f 63 2e in TlsInputProc.
3e40: 20 2d 20 68 6f 62 62 73 0a 20 20 20 20 20 2a 2f - hobbs. */
3e50: 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 . ERR_clear_e
3e60: 72 72 6f 72 28 29 3b 0a 20 20 20 20 77 72 69 74 rror();. writ
3e70: 74 65 6e 20 3d 20 42 49 4f 5f 77 72 69 74 65 28 ten = BIO_write(
3e80: 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 2c 20 62 statePtr->bio, b
3e90: 75 66 2c 20 74 6f 57 72 69 74 65 29 3b 0a 20 20 uf, toWrite);.
3ea0: 20 20 64 70 72 69 6e 74 66 28 22 42 49 4f 5f 77 dprintf("BIO_w
3eb0: 72 69 74 65 28 25 70 2c 20 25 64 29 20 2d 3e 20 rite(%p, %d) ->
3ec0: 5b 25 64 5d 22 2c 20 28 76 6f 69 64 20 2a 29 20 [%d]", (void *)
3ed0: 73 74 61 74 65 50 74 72 2c 20 74 6f 57 72 69 74 statePtr, toWrit
3ee0: 65 2c 20 77 72 69 74 74 65 6e 29 3b 0a 0a 20 20 e, written);..
3ef0: 20 20 65 72 72 20 3d 20 53 53 4c 5f 67 65 74 5f err = SSL_get_
3f00: 65 72 72 6f 72 28 73 74 61 74 65 50 74 72 2d 3e error(statePtr->
3f10: 73 73 6c 2c 20 77 72 69 74 74 65 6e 29 3b 0a 20 ssl, written);.
3f20: 20 20 20 62 61 63 6b 69 6e 67 45 72 72 6f 72 20 backingError
3f30: 3d 20 45 52 52 5f 67 65 74 5f 65 72 72 6f 72 28 = ERR_get_error(
3f40: 29 3b 0a 20 20 20 20 73 77 69 74 63 68 20 28 65 );. switch (e
3f50: 72 72 29 20 7b 0a 09 63 61 73 65 20 53 53 4c 5f rr) {..case SSL_
3f60: 45 52 52 4f 52 5f 4e 4f 4e 45 3a 0a 09 20 20 20 ERROR_NONE:..
3f70: 20 69 66 20 28 77 72 69 74 74 65 6e 20 3c 20 30 if (written < 0
3f80: 29 20 7b 0a 09 09 77 72 69 74 74 65 6e 20 3d 20 ) {...written =
3f90: 30 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 62 0;.. }.. b
3fa0: 72 65 61 6b 3b 0a 09 63 61 73 65 20 53 53 4c 5f reak;..case SSL_
3fb0: 45 52 52 4f 52 5f 57 41 4e 54 5f 57 52 49 54 45 ERROR_WANT_WRITE
3fc0: 3a 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 :.. dprintf("
3fd0: 47 6f 74 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 Got SSL_ERROR_WA
3fe0: 4e 54 5f 57 52 49 54 45 2c 20 6d 61 70 70 69 6e NT_WRITE, mappin
3ff0: 67 20 69 74 20 74 6f 20 45 41 47 41 49 4e 22 29 g it to EAGAIN")
4000: 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 ;.. *errorCod
4010: 65 50 74 72 20 3d 20 45 41 47 41 49 4e 3b 0a 09 ePtr = EAGAIN;..
4020: 20 20 20 20 77 72 69 74 74 65 6e 20 3d 20 2d 31 written = -1
4030: 3b 0a 09 20 20 20 20 54 6c 73 5f 45 72 72 6f 72 ;.. Tls_Error
4040: 28 73 74 61 74 65 50 74 72 2c 20 22 53 53 4c 5f (statePtr, "SSL_
4050: 45 52 52 4f 52 5f 57 41 4e 54 5f 57 52 49 54 45 ERROR_WANT_WRITE
4060: 22 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a ");.. break;.
4070: 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f .case SSL_ERROR_
4080: 57 41 4e 54 5f 52 45 41 44 3a 0a 09 20 20 20 20 WANT_READ:..
4090: 64 70 72 69 6e 74 66 28 22 20 77 72 69 74 65 20 dprintf(" write
40a0: 52 20 42 4c 4f 43 4b 22 29 3b 0a 09 20 20 20 20 R BLOCK");..
40b0: 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 Tls_Error(stateP
40c0: 74 72 2c 20 22 53 53 4c 5f 45 52 52 4f 52 5f 57 tr, "SSL_ERROR_W
40d0: 41 4e 54 5f 52 45 41 44 22 29 3b 0a 09 20 20 20 ANT_READ");..
40e0: 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 53 53 break;..case SS
40f0: 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 58 35 30 L_ERROR_WANT_X50
4100: 39 5f 4c 4f 4f 4b 55 50 3a 0a 09 20 20 20 20 64 9_LOOKUP:.. d
4110: 70 72 69 6e 74 66 28 22 20 77 72 69 74 65 20 58 printf(" write X
4120: 20 42 4c 4f 43 4b 22 29 3b 0a 09 20 20 20 20 54 BLOCK");.. T
4130: 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 ls_Error(statePt
4140: 72 2c 20 22 53 53 4c 5f 45 52 52 4f 52 5f 57 41 r, "SSL_ERROR_WA
4150: 4e 54 5f 58 35 30 39 5f 4c 4f 4f 4b 55 50 22 29 NT_X509_LOOKUP")
4160: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 ;.. break;..c
4170: 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 5a 45 ase SSL_ERROR_ZE
4180: 52 4f 5f 52 45 54 55 52 4e 3a 0a 09 20 20 20 20 RO_RETURN:..
4190: 64 70 72 69 6e 74 66 28 22 20 63 6c 6f 73 65 64 dprintf(" closed
41a0: 22 29 3b 0a 09 20 20 20 20 77 72 69 74 74 65 6e ");.. written
41b0: 20 3d 20 30 3b 0a 09 20 20 20 20 2a 65 72 72 6f = 0;.. *erro
41c0: 72 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a 09 20 rCodePtr = 0;..
41d0: 20 20 20 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 Tls_Error(sta
41e0: 74 65 50 74 72 2c 20 22 50 65 65 72 20 68 61 73 tePtr, "Peer has
41f0: 20 63 6c 6f 73 65 64 20 74 68 65 20 63 6f 6e 6e closed the conn
4200: 65 63 74 69 6f 6e 20 66 6f 72 20 77 72 69 74 69 ection for writi
4210: 6e 67 20 62 79 20 73 65 6e 64 69 6e 67 20 74 68 ng by sending th
4220: 65 20 63 6c 6f 73 65 5f 6e 6f 74 69 66 79 20 61 e close_notify a
4230: 6c 65 72 74 22 29 3b 0a 09 20 20 20 20 62 72 65 lert");.. bre
4240: 61 6b 3b 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 ak;..case SSL_ER
4250: 52 4f 52 5f 53 59 53 43 41 4c 4c 3a 0a 09 20 20 ROR_SYSCALL:..
4260: 20 20 2f 2a 20 53 6f 6d 65 20 6e 6f 6e 2d 72 65 /* Some non-re
4270: 63 6f 76 65 72 61 62 6c 65 2c 20 66 61 74 61 6c coverable, fatal
4280: 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 I/O error occur
4290: 72 65 64 20 2a 2f 0a 0a 09 20 20 20 20 69 66 20 red */... if
42a0: 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 20 3d 3d (backingError ==
42b0: 20 30 20 26 26 20 77 72 69 74 74 65 6e 20 3d 3d 0 && written ==
42c0: 20 30 29 20 7b 0a 09 09 64 70 72 69 6e 74 66 28 0) {...dprintf(
42d0: 22 45 4f 46 20 72 65 61 63 68 65 64 22 29 0a 09 "EOF reached")..
42e0: 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d .*errorCodePtr =
42f0: 20 30 3b 0a 09 09 77 72 69 74 74 65 6e 20 3d 20 0;...written =
4300: 30 3b 0a 09 09 54 6c 73 5f 45 72 72 6f 72 28 73 0;...Tls_Error(s
4310: 74 61 74 65 50 74 72 2c 20 22 45 4f 46 20 72 65 tatePtr, "EOF re
4320: 61 63 68 65 64 22 29 3b 0a 0a 09 20 20 20 20 7d ached");... }
4330: 20 65 6c 73 65 20 69 66 20 28 62 61 63 6b 69 6e else if (backin
4340: 67 45 72 72 6f 72 20 3d 3d 20 30 20 26 26 20 77 gError == 0 && w
4350: 72 69 74 74 65 6e 20 3d 3d 20 2d 31 29 20 7b 0a ritten == -1) {.
4360: 09 09 64 70 72 69 6e 74 66 28 22 49 2f 4f 20 65 ..dprintf("I/O e
4370: 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 28 65 rror occurred (e
4380: 72 72 6e 6f 20 3d 20 25 6c 75 29 22 2c 20 28 75 rrno = %lu)", (u
4390: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 54 63 nsigned long) Tc
43a0: 6c 5f 47 65 74 45 72 72 6e 6f 28 29 29 3b 0a 09 l_GetErrno());..
43b0: 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d .*errorCodePtr =
43c0: 20 54 63 6c 5f 47 65 74 45 72 72 6e 6f 28 29 3b Tcl_GetErrno();
43d0: 0a 09 09 77 72 69 74 74 65 6e 20 3d 20 2d 31 3b ...written = -1;
43e0: 0a 09 09 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 ...Tls_Error(sta
43f0: 74 65 50 74 72 2c 20 28 63 68 61 72 20 2a 29 20 tePtr, (char *)
4400: 54 63 6c 5f 45 72 72 6e 6f 4d 73 67 28 2a 65 72 Tcl_ErrnoMsg(*er
4410: 72 6f 72 43 6f 64 65 50 74 72 29 29 3b 0a 0a 09 rorCodePtr));...
4420: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 64 } else {...d
4430: 70 72 69 6e 74 66 28 22 49 2f 4f 20 65 72 72 6f printf("I/O erro
4440: 72 20 6f 63 63 75 72 72 65 64 20 28 62 61 63 6b r occurred (back
4450: 69 6e 67 45 72 72 6f 72 20 3d 20 25 6c 75 29 22 ingError = %lu)"
4460: 2c 20 62 61 63 6b 69 6e 67 45 72 72 6f 72 29 3b , backingError);
4470: 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 ...*errorCodePtr
4480: 20 3d 20 54 63 6c 5f 47 65 74 45 72 72 6e 6f 28 = Tcl_GetErrno(
4490: 29 3b 0a 09 09 77 72 69 74 74 65 6e 20 3d 20 2d );...written = -
44a0: 31 3b 0a 09 09 54 6c 73 5f 45 72 72 6f 72 28 73 1;...Tls_Error(s
44b0: 74 61 74 65 50 74 72 2c 20 28 63 68 61 72 20 2a tatePtr, (char *
44c0: 29 20 45 52 52 5f 72 65 61 73 6f 6e 5f 65 72 72 ) ERR_reason_err
44d0: 6f 72 5f 73 74 72 69 6e 67 28 62 61 63 6b 69 6e or_string(backin
44e0: 67 45 72 72 6f 72 29 29 3b 0a 09 20 20 20 20 7d gError));.. }
44f0: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 63 .. break;...c
4500: 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 53 53 ase SSL_ERROR_SS
4510: 4c 3a 0a 09 20 20 20 20 2f 2a 20 41 20 6e 6f 6e L:.. /* A non
4520: 2d 72 65 63 6f 76 65 72 61 62 6c 65 2c 20 66 61 -recoverable, fa
4530: 74 61 6c 20 65 72 72 6f 72 20 69 6e 20 74 68 65 tal error in the
4540: 20 53 53 4c 20 6c 69 62 72 61 72 79 20 6f 63 63 SSL library occ
4550: 75 72 72 65 64 2c 20 75 73 75 61 6c 6c 79 20 61 urred, usually a
4560: 20 70 72 6f 74 6f 63 6f 6c 20 65 72 72 6f 72 20 protocol error
4570: 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 */.. dprintf(
4580: 22 53 53 4c 20 65 72 72 6f 72 2c 20 69 6e 64 69 "SSL error, indi
4590: 63 61 74 69 6e 67 20 74 68 61 74 20 74 68 65 20 cating that the
45a0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 62 connection has b
45b0: 65 65 6e 20 61 62 6f 72 74 65 64 22 29 3b 0a 09 een aborted");..
45c0: 20 20 20 20 69 66 20 28 62 61 63 6b 69 6e 67 45 if (backingE
45d0: 72 72 6f 72 20 21 3d 20 30 29 20 7b 0a 09 09 54 rror != 0) {...T
45e0: 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 ls_Error(statePt
45f0: 72 2c 20 28 63 68 61 72 20 2a 29 20 45 52 52 5f r, (char *) ERR_
4600: 72 65 61 73 6f 6e 5f 65 72 72 6f 72 5f 73 74 72 reason_error_str
4610: 69 6e 67 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 ing(backingError
4620: 29 29 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 ));.. } else
4630: 69 66 20 28 53 53 4c 5f 67 65 74 5f 76 65 72 69 if (SSL_get_veri
4640: 66 79 5f 72 65 73 75 6c 74 28 73 74 61 74 65 50 fy_result(stateP
4650: 74 72 2d 3e 73 73 6c 29 20 21 3d 20 58 35 30 39 tr->ssl) != X509
4660: 5f 56 5f 4f 4b 29 20 7b 0a 09 09 54 6c 73 5f 45 _V_OK) {...Tls_E
4670: 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20 28 rror(statePtr, (
4680: 63 68 61 72 20 2a 29 20 58 35 30 39 5f 76 65 72 char *) X509_ver
4690: 69 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 ify_cert_error_s
46a0: 74 72 69 6e 67 28 53 53 4c 5f 67 65 74 5f 76 65 tring(SSL_get_ve
46b0: 72 69 66 79 5f 72 65 73 75 6c 74 28 73 74 61 74 rify_result(stat
46c0: 65 50 74 72 2d 3e 73 73 6c 29 29 29 3b 0a 09 20 ePtr->ssl)));..
46d0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 54 6c } else {...Tl
46e0: 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 s_Error(statePtr
46f0: 2c 20 22 55 6e 6b 6e 6f 77 6e 20 53 53 4c 20 65 , "Unknown SSL e
4700: 72 72 6f 72 22 29 3b 0a 09 20 20 20 20 7d 0a 09 rror");.. }..
4710: 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 *errorCodePt
4720: 72 20 3d 20 45 43 4f 4e 4e 41 42 4f 52 54 45 44 r = ECONNABORTED
4730: 3b 0a 09 20 20 20 20 77 72 69 74 74 65 6e 20 3d ;.. written =
4740: 20 2d 31 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b -1;.. break;
4750: 0a 09 64 65 66 61 75 6c 74 3a 0a 09 20 20 20 20 ..default:..
4760: 64 70 72 69 6e 74 66 28 22 75 6e 6b 6e 6f 77 6e dprintf("unknown
4770: 20 65 72 72 6f 72 3a 20 25 64 22 2c 20 65 72 72 error: %d", err
4780: 29 3b 0a 09 20 20 20 20 54 6c 73 5f 45 72 72 6f );.. Tls_Erro
4790: 72 28 73 74 61 74 65 50 74 72 2c 20 22 55 6e 6b r(statePtr, "Unk
47a0: 6e 6f 77 6e 20 65 72 72 6f 72 22 29 3b 0a 09 20 nown error");..
47b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a break;. }.
47c0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 4f 75 . dprintf("Ou
47d0: 74 70 75 74 28 25 64 29 20 2d 3e 20 25 64 22 2c tput(%d) -> %d",
47e0: 20 74 6f 57 72 69 74 65 2c 20 77 72 69 74 74 65 toWrite, writte
47f0: 6e 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 77 n);. return(w
4800: 72 69 74 74 65 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 20 ritten);.}../*.
4810: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
4820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4850: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 53 65 ----. *. * TlsSe
4860: 74 4f 70 74 69 6f 6e 50 72 6f 63 20 2d 2d 0a 20 tOptionProc --.
4870: 2a 0a 20 2a 20 20 20 20 53 65 74 73 20 61 6e 20 *. * Sets an
4880: 6f 70 74 69 6f 6e 20 76 61 6c 75 65 20 66 6f 72 option value for
4890: 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 a SSL socket ba
48a0: 73 65 64 20 63 68 61 6e 6e 65 6c 2c 20 6f 72 20 sed channel, or
48b0: 61 0a 20 2a 20 20 20 20 6c 69 73 74 20 6f 66 20 a. * list of
48c0: 61 6c 6c 20 6f 70 74 69 6f 6e 73 20 61 6e 64 20 all options and
48d0: 74 68 65 69 72 20 76 61 6c 75 65 73 2e 0a 20 2a their values.. *
48e0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 20 . * Results:. *
48f0: 20 20 20 54 43 4c 5f 4f 4b 20 69 66 20 73 75 63 TCL_OK if suc
4900: 63 65 73 73 66 75 6c 20 6f 72 20 54 43 4c 5f 45 cessful or TCL_E
4910: 52 52 4f 52 20 69 66 20 66 61 69 6c 65 64 2e 0a RROR if failed..
4920: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
4930: 74 73 3a 0a 20 2a 20 20 20 20 55 70 64 61 74 65 ts:. * Update
4940: 73 20 63 68 61 6e 6e 65 6c 20 6f 70 74 69 6f 6e s channel option
4950: 20 74 6f 20 6e 65 77 20 76 61 6c 75 65 2e 0a 20 to new value..
4960: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
4970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
49a0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
49b0: 69 63 20 69 6e 74 0a 54 6c 73 53 65 74 4f 70 74 ic int.TlsSetOpt
49c0: 69 6f 6e 50 72 6f 63 28 76 6f 69 64 20 2a 69 6e ionProc(void *in
49d0: 73 74 61 6e 63 65 44 61 74 61 2c 20 20 20 20 2f stanceData, /
49e0: 2a 20 53 6f 63 6b 65 74 20 73 74 61 74 65 2e 20 * Socket state.
49f0: 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 */. Tcl_Inter
4a00: 70 20 2a 69 6e 74 65 72 70 2c 09 09 2f 2a 20 46 p *interp,../* F
4a10: 6f 72 20 65 72 72 6f 72 73 20 2d 20 63 61 6e 20 or errors - can
4a20: 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 20 20 be NULL. */.
4a30: 63 6f 6e 73 74 20 63 68 61 72 20 2a 6f 70 74 69 const char *opti
4a40: 6f 6e 4e 61 6d 65 2c 09 2f 2a 20 4e 61 6d 65 20 onName,./* Name
4a50: 6f 66 20 74 68 65 20 6f 70 74 69 6f 6e 20 74 6f of the option to
4a60: 20 73 65 74 20 74 68 65 20 76 61 6c 75 65 20 66 set the value f
4a70: 6f 72 2c 20 6f 72 0a 09 09 09 09 20 2a 20 4e 55 or, or..... * NU
4a80: 4c 4c 20 74 6f 20 67 65 74 20 61 6c 6c 20 6f 70 LL to get all op
4a90: 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 69 72 20 tions and their
4aa0: 76 61 6c 75 65 73 2e 20 2a 2f 0a 20 20 20 20 63 values. */. c
4ab0: 6f 6e 73 74 20 63 68 61 72 20 2a 6f 70 74 69 6f onst char *optio
4ac0: 6e 56 61 6c 75 65 29 09 2f 2a 20 56 61 6c 75 65 nValue)./* Value
4ad0: 20 66 6f 72 20 6f 70 74 69 6f 6e 2e 20 2a 2f 0a for option. */.
4ae0: 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 {. State *sta
4af0: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a tePtr = (State *
4b00: 29 20 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a ) instanceData;.
4b10: 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c . Tcl_Channel
4b20: 20 64 6f 77 6e 43 68 61 6e 20 3d 20 54 6c 73 5f downChan = Tls_
4b30: 47 65 74 50 61 72 65 6e 74 28 73 74 61 74 65 50 GetParent(stateP
4b40: 74 72 2c 20 54 4c 53 5f 54 43 4c 5f 46 41 53 54 tr, TLS_TCL_FAST
4b50: 50 41 54 48 29 3b 0a 20 20 20 20 54 63 6c 5f 44 PATH);. Tcl_D
4b60: 72 69 76 65 72 53 65 74 4f 70 74 69 6f 6e 50 72 riverSetOptionPr
4b70: 6f 63 20 2a 73 65 74 4f 70 74 69 6f 6e 50 72 6f oc *setOptionPro
4b80: 63 3b 0a 0a 20 20 20 20 73 65 74 4f 70 74 69 6f c;.. setOptio
4b90: 6e 50 72 6f 63 20 3d 20 54 63 6c 5f 43 68 61 6e nProc = Tcl_Chan
4ba0: 6e 65 6c 53 65 74 4f 70 74 69 6f 6e 50 72 6f 63 nelSetOptionProc
4bb0: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 (Tcl_GetChannelT
4bc0: 79 70 65 28 64 6f 77 6e 43 68 61 6e 29 29 3b 0a ype(downChan));.
4bd0: 20 20 20 20 69 66 20 28 73 65 74 4f 70 74 69 6f if (setOptio
4be0: 6e 50 72 6f 63 20 21 3d 20 4e 55 4c 4c 29 20 7b nProc != NULL) {
4bf0: 0a 09 72 65 74 75 72 6e 20 28 2a 73 65 74 4f 70 ..return (*setOp
4c00: 74 69 6f 6e 50 72 6f 63 29 28 54 63 6c 5f 47 65 tionProc)(Tcl_Ge
4c10: 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 tChannelInstance
4c20: 44 61 74 61 28 64 6f 77 6e 43 68 61 6e 29 2c 20 Data(downChan),
4c30: 69 6e 74 65 72 70 2c 20 6f 70 74 69 6f 6e 4e 61 interp, optionNa
4c40: 6d 65 2c 20 6f 70 74 69 6f 6e 56 61 6c 75 65 29 me, optionValue)
4c50: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 ;. } else if
4c60: 28 6f 70 74 69 6f 6e 4e 61 6d 65 20 3d 3d 20 28 (optionName == (
4c70: 63 68 61 72 2a 29 20 4e 55 4c 4c 29 20 7b 0a 09 char*) NULL) {..
4c80: 2f 2a 0a 09 20 2a 20 52 65 71 75 65 73 74 20 69 /*.. * Request i
4c90: 73 20 71 75 65 72 79 20 66 6f 72 20 61 6c 6c 20 s query for all
4ca0: 6f 70 74 69 6f 6e 73 2c 20 74 68 69 73 20 69 73 options, this is
4cb0: 20 6f 6b 2e 0a 09 20 2a 2f 0a 09 72 65 74 75 72 ok... */..retur
4cc0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a n TCL_OK;. }.
4cd0: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 52 65 /*. * Re
4ce0: 71 75 65 73 74 20 66 6f 72 20 61 20 73 70 65 63 quest for a spec
4cf0: 69 66 69 63 20 6f 70 74 69 6f 6e 20 68 61 73 20 ific option has
4d00: 74 6f 20 66 61 69 6c 2c 20 77 65 20 64 6f 6e 27 to fail, we don'
4d10: 74 20 68 61 76 65 20 61 6e 79 2e 0a 20 20 20 20 t have any..
4d20: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 54 */. return T
4d30: 63 6c 5f 42 61 64 43 68 61 6e 6e 65 6c 4f 70 74 cl_BadChannelOpt
4d40: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 6f 70 74 69 ion(interp, opti
4d50: 6f 6e 4e 61 6d 65 2c 20 22 22 29 3b 0a 7d 0a 0a onName, "");.}..
4d60: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
4d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4da0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 --------. *. * T
4db0: 6c 73 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 lsGetOptionProc
4dc0: 2d 2d 0a 20 2a 0a 20 2a 20 20 20 20 47 65 74 73 --. *. * Gets
4dd0: 20 61 6e 20 6f 70 74 69 6f 6e 20 76 61 6c 75 65 an option value
4de0: 20 66 6f 72 20 61 20 53 53 4c 20 73 6f 63 6b 65 for a SSL socke
4df0: 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 2c t based channel,
4e00: 20 6f 72 20 61 0a 20 2a 20 20 20 20 6c 69 73 74 or a. * list
4e10: 20 6f 66 20 61 6c 6c 20 6f 70 74 69 6f 6e 73 20 of all options
4e20: 61 6e 64 20 74 68 65 69 72 20 76 61 6c 75 65 73 and their values
4e30: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
4e40: 0a 20 2a 20 20 20 20 41 20 73 74 61 6e 64 61 72 . * A standar
4e50: 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 20 54 68 d Tcl result. Th
4e60: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73 e value of the s
4e70: 70 65 63 69 66 69 65 64 20 6f 70 74 69 6f 6e 20 pecified option
4e80: 6f 72 20 61 0a 20 2a 20 20 20 20 6c 69 73 74 20 or a. * list
4e90: 6f 66 20 61 6c 6c 20 6f 70 74 69 6f 6e 73 20 61 of all options a
4ea0: 6e 64 20 74 68 65 69 72 20 76 61 6c 75 65 73 20 nd their values
4eb0: 69 73 20 72 65 74 75 72 6e 65 64 20 69 6e 20 74 is returned in t
4ec0: 68 65 0a 20 2a 20 20 20 20 73 75 70 70 6c 69 65 he. * supplie
4ed0: 64 20 44 53 74 72 69 6e 67 2e 0a 20 2a 0a 20 2a d DString.. *. *
4ee0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
4ef0: 2a 20 20 20 20 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a * None.. *. *
4f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4f40: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 ---. */.static i
4f50: 6e 74 0a 54 6c 73 47 65 74 4f 70 74 69 6f 6e 50 nt.TlsGetOptionP
4f60: 72 6f 63 28 0a 20 20 20 20 76 6f 69 64 20 2a 69 roc(. void *i
4f70: 6e 73 74 61 6e 63 65 44 61 74 61 2c 09 2f 2a 20 nstanceData,./*
4f80: 53 6f 63 6b 65 74 20 73 74 61 74 65 2e 20 2a 2f Socket state. */
4f90: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 . Tcl_Interp
4fa0: 2a 69 6e 74 65 72 70 2c 09 09 2f 2a 20 46 6f 72 *interp,../* For
4fb0: 20 65 72 72 6f 72 73 20 2d 20 63 61 6e 20 62 65 errors - can be
4fc0: 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 20 20 63 6f NULL. */. co
4fd0: 6e 73 74 20 63 68 61 72 20 2a 6f 70 74 69 6f 6e nst char *option
4fe0: 4e 61 6d 65 2c 09 2f 2a 20 4e 61 6d 65 20 6f 66 Name,./* Name of
4ff0: 20 74 68 65 20 6f 70 74 69 6f 6e 20 74 6f 20 72 the option to r
5000: 65 74 72 69 65 76 65 20 74 68 65 20 76 61 6c 75 etrieve the valu
5010: 65 20 66 6f 72 2c 20 6f 72 0a 09 09 09 09 20 2a e for, or..... *
5020: 20 4e 55 4c 4c 20 74 6f 20 67 65 74 20 61 6c 6c NULL to get all
5030: 20 6f 70 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 options and the
5040: 69 72 20 76 61 6c 75 65 73 2e 20 2a 2f 0a 20 20 ir values. */.
5050: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 2a 6f Tcl_DString *o
5060: 70 74 69 6f 6e 56 61 6c 75 65 29 09 2f 2a 20 57 ptionValue)./* W
5070: 68 65 72 65 20 74 6f 20 73 74 6f 72 65 20 74 68 here to store th
5080: 65 20 63 6f 6d 70 75 74 65 64 20 76 61 6c 75 65 e computed value
5090: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20 initialized by
50a0: 63 61 6c 6c 65 72 2e 20 2a 2f 0a 7b 0a 20 20 20 caller. */.{.
50b0: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 State *statePtr
50c0: 20 3d 20 28 53 74 61 74 65 20 2a 29 20 69 6e 73 = (State *) ins
50d0: 74 61 6e 63 65 44 61 74 61 3b 0a 0a 20 20 20 20 tanceData;..
50e0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 64 6f 77 6e Tcl_Channel down
50f0: 43 68 61 6e 20 3d 20 54 6c 73 5f 47 65 74 50 61 Chan = Tls_GetPa
5100: 72 65 6e 74 28 73 74 61 74 65 50 74 72 2c 20 54 rent(statePtr, T
5110: 4c 53 5f 54 43 4c 5f 46 41 53 54 50 41 54 48 29 LS_TCL_FASTPATH)
5120: 3b 0a 20 20 20 20 54 63 6c 5f 44 72 69 76 65 72 ;. Tcl_Driver
5130: 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 2a 67 GetOptionProc *g
5140: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 3b 0a 0a 20 etOptionProc;..
5150: 20 20 20 67 65 74 4f 70 74 69 6f 6e 50 72 6f 63 getOptionProc
5160: 20 3d 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 47 65 = Tcl_ChannelGe
5170: 74 4f 70 74 69 6f 6e 50 72 6f 63 28 54 63 6c 5f tOptionProc(Tcl_
5180: 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 64 GetChannelType(d
5190: 6f 77 6e 43 68 61 6e 29 29 3b 0a 20 20 20 20 69 ownChan));. i
51a0: 66 20 28 67 65 74 4f 70 74 69 6f 6e 50 72 6f 63 f (getOptionProc
51b0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 != NULL) {..ret
51c0: 75 72 6e 20 28 2a 67 65 74 4f 70 74 69 6f 6e 50 urn (*getOptionP
51d0: 72 6f 63 29 28 54 63 6c 5f 47 65 74 43 68 61 6e roc)(Tcl_GetChan
51e0: 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 nelInstanceData(
51f0: 64 6f 77 6e 43 68 61 6e 29 2c 20 69 6e 74 65 72 downChan), inter
5200: 70 2c 20 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20 6f p, optionName, o
5210: 70 74 69 6f 6e 56 61 6c 75 65 29 3b 0a 20 20 20 ptionValue);.
5220: 20 7d 20 65 6c 73 65 20 69 66 20 28 6f 70 74 69 } else if (opti
5230: 6f 6e 4e 61 6d 65 20 3d 3d 20 28 63 68 61 72 2a onName == (char*
5240: 29 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 0a 09 20 ) NULL) {../*..
5250: 2a 20 52 65 71 75 65 73 74 20 69 73 20 71 75 65 * Request is que
5260: 72 79 20 66 6f 72 20 61 6c 6c 20 6f 70 74 69 6f ry for all optio
5270: 6e 73 2c 20 74 68 69 73 20 69 73 20 6f 6b 2e 0a ns, this is ok..
5280: 09 20 2a 2f 0a 09 72 65 74 75 72 6e 20 54 43 4c . */..return TCL
5290: 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f _OK;. }. /
52a0: 2a 0a 20 20 20 20 20 2a 20 52 65 71 75 65 73 74 *. * Request
52b0: 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 for a specific
52c0: 6f 70 74 69 6f 6e 20 68 61 73 20 74 6f 20 66 61 option has to fa
52d0: 69 6c 2c 20 77 65 20 64 6f 6e 27 74 20 68 61 76 il, we don't hav
52e0: 65 20 61 6e 79 2e 0a 20 20 20 20 20 2a 2f 0a 20 e any.. */.
52f0: 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 42 61 return Tcl_Ba
5300: 64 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 dChannelOption(i
5310: 6e 74 65 72 70 2c 20 6f 70 74 69 6f 6e 4e 61 6d nterp, optionNam
5320: 65 2c 20 22 22 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a e, "");.}../*. *
5330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5370: 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 57 61 74 ---. *. * TlsWat
5380: 63 68 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 20 chProc --. *. *
5390: 20 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 Initialize th
53a0: 65 20 6e 6f 74 69 66 69 65 72 20 74 6f 20 77 61 e notifier to wa
53b0: 74 63 68 20 54 63 6c 5f 46 69 6c 65 73 20 66 72 tch Tcl_Files fr
53c0: 6f 6d 20 74 68 69 73 20 63 68 61 6e 6e 65 6c 2e om this channel.
53d0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
53e0: 20 2a 20 20 20 20 4e 6f 6e 65 2e 0a 20 2a 0a 20 * None.. *.
53f0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
5400: 20 2a 20 20 20 20 53 65 74 73 20 75 70 20 74 68 * Sets up th
5410: 65 20 6e 6f 74 69 66 69 65 72 20 73 6f 20 74 68 e notifier so th
5420: 61 74 20 61 20 66 75 74 75 72 65 20 65 76 65 6e at a future even
5430: 74 20 6f 6e 20 74 68 65 20 63 68 61 6e 6e 65 6c t on the channel
5440: 0a 20 2a 20 20 20 20 77 69 6c 6c 20 62 65 20 73 . * will be s
5450: 65 65 6e 20 62 79 20 54 63 6c 2e 0a 20 2a 0a 20 een by Tcl.. *.
5460: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
5470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
54a0: 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 ----. */..static
54b0: 20 76 6f 69 64 0a 54 6c 73 57 61 74 63 68 50 72 void.TlsWatchPr
54c0: 6f 63 28 0a 20 20 20 20 76 6f 69 64 20 2a 69 6e oc(. void *in
54d0: 73 74 61 6e 63 65 44 61 74 61 2c 20 20 20 20 2f stanceData, /
54e0: 2a 20 54 68 65 20 73 6f 63 6b 65 74 20 73 74 61 * The socket sta
54f0: 74 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d te. */. int m
5500: 61 73 6b 29 09 09 09 2f 2a 20 45 76 65 6e 74 73 ask).../* Events
5510: 20 6f 66 20 69 6e 74 65 72 65 73 74 3b 20 61 6e of interest; an
5520: 20 4f 52 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69 OR-ed combinati
5530: 6f 6e 20 6f 66 0a 09 09 09 09 20 2a 20 54 43 4c on of..... * TCL
5540: 5f 52 45 41 44 41 42 4c 45 2c 20 54 43 4c 5f 57 _READABLE, TCL_W
5550: 52 49 54 41 42 4c 45 20 61 6e 64 20 54 43 4c 5f RITABLE and TCL_
5560: 45 58 43 45 50 54 49 4f 4e 2e 20 2a 2f 0a 7b 0a EXCEPTION. */.{.
5570: 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 Tcl_Channel
5580: 20 20 20 20 64 6f 77 6e 43 68 61 6e 3b 0a 20 20 downChan;.
5590: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 State *statePt
55a0: 72 20 3d 20 28 53 74 61 74 65 20 2a 29 20 69 6e r = (State *) in
55b0: 73 74 61 6e 63 65 44 61 74 61 3b 0a 20 20 20 20 stanceData;.
55c0: 54 63 6c 5f 44 72 69 76 65 72 57 61 74 63 68 50 Tcl_DriverWatchP
55d0: 72 6f 63 20 2a 77 61 74 63 68 50 72 6f 63 3b 0a roc *watchProc;.
55e0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 54 6c . dprintf("Tl
55f0: 73 57 61 74 63 68 50 72 6f 63 28 30 78 25 78 29 sWatchProc(0x%x)
5600: 22 2c 20 6d 61 73 6b 29 3b 0a 0a 20 20 20 20 2f ", mask);.. /
5610: 2a 20 50 72 65 74 65 6e 64 20 74 6f 20 62 65 20 * Pretend to be
5620: 64 65 61 64 20 61 73 20 6c 6f 6e 67 20 61 73 20 dead as long as
5630: 74 68 65 20 76 65 72 69 66 79 20 63 61 6c 6c 62 the verify callb
5640: 61 63 6b 20 69 73 20 72 75 6e 6e 69 6e 67 2e 0a ack is running..
5650: 20 20 20 20 20 2a 20 4f 74 68 65 72 77 69 73 65 * Otherwise
5660: 20 74 68 61 74 20 63 61 6c 6c 62 61 63 6b 20 63 that callback c
5670: 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64 20 ould be invoked
5680: 72 65 63 75 72 73 69 76 65 6c 79 2e 20 2a 2f 0a recursively. */.
5690: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
56a0: 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 ->flags & TLS_TC
56b0: 4c 5f 43 41 4c 4c 42 41 43 4b 29 20 7b 0a 09 64 L_CALLBACK) {..d
56c0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 62 61 63 6b printf("Callback
56d0: 20 69 73 20 6f 6e 2d 67 6f 69 6e 67 2c 20 64 6f is on-going, do
56e0: 69 6e 67 20 6e 6f 74 68 69 6e 67 22 29 3b 0a 09 ing nothing");..
56f0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 return;. }..
5700: 20 20 20 64 70 72 69 6e 74 46 6c 61 67 73 28 73 dprintFlags(s
5710: 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 64 tatePtr);.. d
5720: 6f 77 6e 43 68 61 6e 20 3d 20 54 6c 73 5f 47 65 ownChan = Tls_Ge
5730: 74 50 61 72 65 6e 74 28 73 74 61 74 65 50 74 72 tParent(statePtr
5740: 2c 20 54 4c 53 5f 54 43 4c 5f 46 41 53 54 50 41 , TLS_TCL_FASTPA
5750: 54 48 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 TH);.. if (st
5760: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 atePtr->flags &
5770: 54 4c 53 5f 54 43 4c 5f 48 41 4e 44 53 48 41 4b TLS_TCL_HANDSHAK
5780: 45 5f 46 41 49 4c 45 44 29 20 7b 0a 09 64 70 72 E_FAILED) {..dpr
5790: 69 6e 74 66 28 22 41 73 6b 65 64 20 74 6f 20 77 intf("Asked to w
57a0: 61 74 63 68 20 61 20 73 6f 63 6b 65 74 20 77 69 atch a socket wi
57b0: 74 68 20 61 20 66 61 69 6c 65 64 20 68 61 6e 64 th a failed hand
57c0: 73 68 61 6b 65 20 2d 2d 20 6e 6f 74 68 69 6e 67 shake -- nothing
57d0: 20 63 61 6e 20 68 61 70 70 65 6e 20 68 65 72 65 can happen here
57e0: 22 29 3b 0a 09 64 70 72 69 6e 74 66 28 22 55 6e ");..dprintf("Un
57f0: 72 65 67 69 73 74 65 72 69 6e 67 20 69 6e 74 65 registering inte
5800: 72 65 73 74 20 69 6e 20 74 68 65 20 6c 6f 77 65 rest in the lowe
5810: 72 20 63 68 61 6e 6e 65 6c 22 29 3b 0a 0a 09 77 r channel");...w
5820: 61 74 63 68 50 72 6f 63 20 3d 20 54 63 6c 5f 43 atchProc = Tcl_C
5830: 68 61 6e 6e 65 6c 57 61 74 63 68 50 72 6f 63 28 hannelWatchProc(
5840: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 Tcl_GetChannelTy
5850: 70 65 28 64 6f 77 6e 43 68 61 6e 29 29 3b 0a 09 pe(downChan));..
5860: 77 61 74 63 68 50 72 6f 63 28 54 63 6c 5f 47 65 watchProc(Tcl_Ge
5870: 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 tChannelInstance
5880: 44 61 74 61 28 64 6f 77 6e 43 68 61 6e 29 2c 20 Data(downChan),
5890: 30 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 77 0);..statePtr->w
58a0: 61 74 63 68 4d 61 73 6b 20 3d 20 30 3b 0a 09 72 atchMask = 0;..r
58b0: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 eturn;. }..
58c0: 20 20 73 74 61 74 65 50 74 72 2d 3e 77 61 74 63 statePtr->watc
58d0: 68 4d 61 73 6b 20 3d 20 6d 61 73 6b 3b 0a 0a 20 hMask = mask;..
58e0: 20 20 20 2f 2a 20 4e 6f 20 63 68 61 6e 6e 65 6c /* No channel
58f0: 20 68 61 6e 64 6c 65 72 73 20 61 6e 79 20 6d 6f handlers any mo
5900: 72 65 2e 20 57 65 20 77 69 6c 6c 20 62 65 20 6e re. We will be n
5910: 6f 74 69 66 69 65 64 20 61 75 74 6f 6d 61 74 69 otified automati
5920: 63 61 6c 6c 79 0a 20 20 20 20 20 2a 20 61 62 6f cally. * abo
5930: 75 74 20 65 76 65 6e 74 73 20 6f 6e 20 74 68 65 ut events on the
5940: 20 63 68 61 6e 6e 65 6c 20 62 65 6c 6f 77 20 76 channel below v
5950: 69 61 20 61 20 63 61 6c 6c 20 74 6f 20 6f 75 72 ia a call to our
5960: 0a 20 20 20 20 20 2a 20 27 54 72 61 6e 73 66 6f . * 'Transfo
5970: 72 6d 4e 6f 74 69 66 79 50 72 6f 63 27 2e 20 42 rmNotifyProc'. B
5980: 75 74 20 77 65 20 68 61 76 65 20 74 6f 20 70 61 ut we have to pa
5990: 73 73 20 74 68 65 20 69 6e 74 65 72 65 73 74 20 ss the interest
59a0: 64 6f 77 6e 20 6e 6f 77 2e 0a 20 20 20 20 20 2a down now.. *
59b0: 20 57 65 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 We are allowed
59c0: 74 6f 20 61 64 64 20 61 64 64 69 74 69 6f 6e 61 to add additiona
59d0: 6c 20 27 69 6e 74 65 72 65 73 74 27 20 74 6f 20 l 'interest' to
59e0: 74 68 65 20 6d 61 73 6b 20 69 66 20 77 65 20 77 the mask if we w
59f0: 61 6e 74 0a 20 20 20 20 20 2a 20 74 6f 2e 20 42 ant. * to. B
5a00: 75 74 20 74 68 69 73 20 74 72 61 6e 73 66 6f 72 ut this transfor
5a10: 6d 61 74 69 6f 6e 20 68 61 73 20 6e 6f 20 73 75 mation has no su
5a20: 63 68 20 69 6e 74 65 72 65 73 74 2e 20 49 74 20 ch interest. It
5a30: 6a 75 73 74 20 70 61 73 73 65 73 0a 20 20 20 20 just passes.
5a40: 20 2a 20 74 68 65 20 72 65 71 75 65 73 74 20 64 * the request d
5a50: 6f 77 6e 2c 20 75 6e 63 68 61 6e 67 65 64 2e 0a own, unchanged..
5a60: 20 20 20 20 20 2a 2f 0a 20 20 20 20 64 70 72 69 */. dpri
5a70: 6e 74 66 28 22 52 65 67 69 73 74 65 72 69 6e 67 ntf("Registering
5a80: 20 6f 75 72 20 69 6e 74 65 72 65 73 74 20 69 6e our interest in
5a90: 20 74 68 65 20 6c 6f 77 65 72 20 63 68 61 6e 6e the lower chann
5aa0: 65 6c 20 28 63 68 61 6e 3d 25 70 29 22 2c 20 28 el (chan=%p)", (
5ab0: 76 6f 69 64 20 2a 29 20 64 6f 77 6e 43 68 61 6e void *) downChan
5ac0: 29 3b 0a 20 20 20 20 77 61 74 63 68 50 72 6f 63 );. watchProc
5ad0: 20 3d 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 57 61 = Tcl_ChannelWa
5ae0: 74 63 68 50 72 6f 63 28 54 63 6c 5f 47 65 74 43 tchProc(Tcl_GetC
5af0: 68 61 6e 6e 65 6c 54 79 70 65 28 64 6f 77 6e 43 hannelType(downC
5b00: 68 61 6e 29 29 3b 0a 20 20 20 20 77 61 74 63 68 han));. watch
5b10: 50 72 6f 63 28 54 63 6c 5f 47 65 74 43 68 61 6e Proc(Tcl_GetChan
5b20: 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 nelInstanceData(
5b30: 64 6f 77 6e 43 68 61 6e 29 2c 20 6d 61 73 6b 29 downChan), mask)
5b40: 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a ;.. /*. *
5b50: 20 4d 61 6e 61 67 65 6d 65 6e 74 20 6f 66 20 74 Management of t
5b60: 68 65 20 69 6e 74 65 72 6e 61 6c 20 74 69 6d 65 he internal time
5b70: 72 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 69 r.. */. i
5b80: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d f (statePtr->tim
5b90: 65 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72 er != (Tcl_Timer
5ba0: 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 Token) NULL) {..
5bb0: 64 70 72 69 6e 74 66 28 22 41 20 74 69 6d 65 72 dprintf("A timer
5bc0: 20 77 61 73 20 66 6f 75 6e 64 2c 20 64 65 6c 65 was found, dele
5bd0: 74 69 6e 67 20 69 74 22 29 3b 0a 09 54 63 6c 5f ting it");..Tcl_
5be0: 44 65 6c 65 74 65 54 69 6d 65 72 48 61 6e 64 6c DeleteTimerHandl
5bf0: 65 72 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d er(statePtr->tim
5c00: 65 72 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e er);..statePtr->
5c10: 74 69 6d 65 72 20 3d 20 28 54 63 6c 5f 54 69 6d timer = (Tcl_Tim
5c20: 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 3b 0a 20 erToken) NULL;.
5c30: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 28 6d }.. if ((m
5c40: 61 73 6b 20 26 20 54 43 4c 5f 52 45 41 44 41 42 ask & TCL_READAB
5c50: 4c 45 29 20 26 26 0a 09 28 28 54 63 6c 5f 49 6e LE) &&..((Tcl_In
5c60: 70 75 74 42 75 66 66 65 72 65 64 28 73 74 61 74 putBuffered(stat
5c70: 65 50 74 72 2d 3e 73 65 6c 66 29 20 3e 20 30 29 ePtr->self) > 0)
5c80: 20 7c 7c 20 28 42 49 4f 5f 63 74 72 6c 5f 70 65 || (BIO_ctrl_pe
5c90: 6e 64 69 6e 67 28 73 74 61 74 65 50 74 72 2d 3e nding(statePtr->
5ca0: 62 69 6f 29 20 3e 20 30 29 29 29 20 7b 0a 09 2f bio) > 0))) {../
5cb0: 2a 0a 09 20 2a 20 54 68 65 72 65 20 69 73 20 69 *.. * There is i
5cc0: 6e 74 65 72 65 73 74 20 69 6e 20 72 65 61 64 61 nterest in reada
5cd0: 62 6c 65 20 65 76 65 6e 74 73 20 61 6e 64 20 77 ble events and w
5ce0: 65 20 61 63 74 75 61 6c 6c 79 20 68 61 76 65 0a e actually have.
5cf0: 09 20 2a 20 64 61 74 61 20 77 61 69 74 69 6e 67 . * data waiting
5d00: 2c 20 73 6f 20 67 65 6e 65 72 61 74 65 20 61 20 , so generate a
5d10: 74 69 6d 65 72 20 74 6f 20 66 6c 75 73 68 20 74 timer to flush t
5d20: 68 61 74 2e 0a 09 20 2a 2f 0a 09 64 70 72 69 6e hat... */..dprin
5d30: 74 66 28 22 43 72 65 61 74 69 6e 67 20 61 20 6e tf("Creating a n
5d40: 65 77 20 74 69 6d 65 72 20 73 69 6e 63 65 20 64 ew timer since d
5d50: 61 74 61 20 61 70 70 65 61 72 73 20 74 6f 20 62 ata appears to b
5d60: 65 20 77 61 69 74 69 6e 67 22 29 3b 0a 09 73 74 e waiting");..st
5d70: 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 atePtr->timer =
5d80: 54 63 6c 5f 43 72 65 61 74 65 54 69 6d 65 72 48 Tcl_CreateTimerH
5d90: 61 6e 64 6c 65 72 28 54 4c 53 5f 54 43 4c 5f 44 andler(TLS_TCL_D
5da0: 45 4c 41 59 2c 20 54 6c 73 43 68 61 6e 6e 65 6c ELAY, TlsChannel
5db0: 48 61 6e 64 6c 65 72 54 69 6d 65 72 2c 20 73 74 HandlerTimer, st
5dc0: 61 74 65 50 74 72 29 3b 0a 20 20 20 20 7d 0a 7d atePtr);. }.}
5dd0: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
5de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
5e20: 20 54 6c 73 47 65 74 48 61 6e 64 6c 65 50 72 6f TlsGetHandlePro
5e30: 63 20 2d 2d 0a 20 2a 0a 20 2a 20 20 20 20 43 61 c --. *. * Ca
5e40: 6c 6c 65 64 20 66 72 6f 6d 20 54 63 6c 5f 47 65 lled from Tcl_Ge
5e50: 74 43 68 61 6e 6e 65 6c 46 69 6c 65 20 74 6f 20 tChannelFile to
5e60: 72 65 74 72 69 65 76 65 20 6f 2f 73 20 66 69 6c retrieve o/s fil
5e70: 65 20 68 61 6e 64 6c 65 72 0a 20 2a 20 20 20 20 e handler. *
5e80: 66 72 6f 6d 20 74 68 65 20 53 53 4c 20 73 6f 63 from the SSL soc
5e90: 6b 65 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 ket based channe
5ea0: 6c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 l.. *. * Results
5eb0: 3a 0a 20 2a 20 20 20 20 54 68 65 20 61 70 70 72 :. * The appr
5ec0: 6f 70 72 69 61 74 65 20 54 63 6c 5f 46 69 6c 65 opriate Tcl_File
5ed0: 20 68 61 6e 64 6c 65 20 6f 72 20 4e 55 4c 4c 20 handle or NULL
5ee0: 69 66 20 6e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53 if none.. *. * S
5ef0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 20 ide effects:. *
5f00: 20 20 20 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d None.. *. *--
5f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5f50: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 -. */.static int
5f60: 20 54 6c 73 47 65 74 48 61 6e 64 6c 65 50 72 6f TlsGetHandlePro
5f70: 63 28 0a 20 20 20 20 76 6f 69 64 20 2a 69 6e 73 c(. void *ins
5f80: 74 61 6e 63 65 44 61 74 61 2c 20 20 20 20 2f 2a tanceData, /*
5f90: 20 53 6f 63 6b 65 74 20 73 74 61 74 65 2e 20 2a Socket state. *
5fa0: 2f 0a 20 20 20 20 69 6e 74 20 64 69 72 65 63 74 /. int direct
5fb0: 69 6f 6e 2c 09 09 2f 2a 20 54 43 4c 5f 52 45 41 ion,../* TCL_REA
5fc0: 44 41 42 4c 45 20 6f 72 20 54 43 4c 5f 57 52 49 DABLE or TCL_WRI
5fd0: 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20 76 6f 69 TABLE */. voi
5fe0: 64 20 2a 2a 68 61 6e 64 6c 65 50 74 72 29 09 2f d **handlePtr)./
5ff0: 2a 20 48 61 6e 64 6c 65 20 61 73 73 6f 63 69 61 * Handle associa
6000: 74 65 64 20 77 69 74 68 20 74 68 65 20 63 68 61 ted with the cha
6010: 6e 6e 65 6c 20 2a 2f 0a 7b 0a 20 20 20 20 53 74 nnel */.{. St
6020: 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 ate *statePtr =
6030: 28 53 74 61 74 65 20 2a 29 69 6e 73 74 61 6e 63 (State *)instanc
6040: 65 44 61 74 61 3b 0a 0a 20 20 20 20 72 65 74 75 eData;.. retu
6050: 72 6e 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 rn(Tcl_GetChanne
6060: 6c 48 61 6e 64 6c 65 28 54 6c 73 5f 47 65 74 50 lHandle(Tls_GetP
6070: 61 72 65 6e 74 28 73 74 61 74 65 50 74 72 2c 20 arent(statePtr,
6080: 54 4c 53 5f 54 43 4c 5f 46 41 53 54 50 41 54 48 TLS_TCL_FASTPATH
6090: 29 2c 20 64 69 72 65 63 74 69 6f 6e 2c 20 68 61 ), direction, ha
60a0: 6e 64 6c 65 50 74 72 29 29 3b 0a 7d 0a 0a 2f 2a ndlePtr));.}../*
60b0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
60c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
60d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
60e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
60f0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 ------. *. * Tls
6100: 4e 6f 74 69 66 79 50 72 6f 63 20 2d 2d 0a 20 2a NotifyProc --. *
6110: 0a 20 2a 20 20 20 20 48 61 6e 64 6c 65 72 20 63 . * Handler c
6120: 61 6c 6c 65 64 20 62 79 20 54 63 6c 20 74 6f 20 alled by Tcl to
6130: 69 6e 66 6f 72 6d 20 75 73 20 6f 66 20 61 63 74 inform us of act
6140: 69 76 69 74 79 0a 20 2a 20 20 20 20 6f 6e 20 74 ivity. * on t
6150: 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 63 68 he underlying ch
6160: 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 52 65 73 annel.. *. * Res
6170: 75 6c 74 73 3a 0a 20 2a 20 20 20 20 54 79 70 65 ults:. * Type
6180: 20 6f 66 20 65 76 65 6e 74 20 6f 72 20 30 20 69 of event or 0 i
6190: 66 20 66 61 69 6c 65 64 0a 20 2a 0a 20 2a 20 53 f failed. *. * S
61a0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 20 ide effects:. *
61b0: 20 20 20 4d 61 79 20 70 72 6f 63 65 73 73 20 74 May process t
61c0: 68 65 20 69 6e 63 6f 6d 69 6e 67 20 65 76 65 6e he incoming even
61d0: 74 20 62 79 20 69 74 73 65 6c 66 2e 0a 20 2a 0a t by itself.. *.
61e0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
61f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6220: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 -----. */..stati
6230: 63 20 69 6e 74 20 54 6c 73 4e 6f 74 69 66 79 50 c int TlsNotifyP
6240: 72 6f 63 28 0a 20 20 20 20 76 6f 69 64 20 2a 69 roc(. void *i
6250: 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 20 20 20 nstanceData,
6260: 2f 2a 20 53 6f 63 6b 65 74 20 73 74 61 74 65 2e /* Socket state.
6270: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 61 73 6b */. int mask
6280: 29 09 09 09 2f 2a 20 74 79 70 65 20 6f 66 20 65 ).../* type of e
6290: 76 65 6e 74 20 74 68 61 74 20 6f 63 63 75 72 72 vent that occurr
62a0: 65 64 3a 0a 09 09 09 09 20 2a 20 4f 52 2d 65 64 ed:..... * OR-ed
62b0: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 combination of
62c0: 54 43 4c 5f 52 45 41 44 41 42 4c 45 20 6f 72 20 TCL_READABLE or
62d0: 54 43 4c 5f 57 52 49 54 41 42 4c 45 20 2a 2f 0a TCL_WRITABLE */.
62e0: 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 {. State *sta
62f0: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a tePtr = (State *
6300: 29 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 20 )instanceData;.
6310: 20 20 20 69 6e 74 20 65 72 72 6f 72 43 6f 64 65 int errorCode
6320: 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a ;.. /*. *
6330: 20 41 6e 20 65 76 65 6e 74 20 6f 63 63 75 72 72 An event occurr
6340: 65 64 20 69 6e 20 74 68 65 20 75 6e 64 65 72 6c ed in the underl
6350: 79 69 6e 67 20 63 68 61 6e 6e 65 6c 2e 20 20 54 ying channel. T
6360: 68 69 73 0a 20 20 20 20 20 2a 20 74 72 61 6e 73 his. * trans
6370: 66 6f 72 6d 61 74 69 6f 6e 20 64 6f 65 73 6e 27 formation doesn'
6380: 74 20 70 72 6f 63 65 73 73 20 73 75 63 68 20 65 t process such e
6390: 76 65 6e 74 73 20 74 68 75 73 20 72 65 74 75 72 vents thus retur
63a0: 6e 73 20 74 68 65 0a 20 20 20 20 20 2a 20 69 6e ns the. * in
63b0: 63 6f 6d 69 6e 67 20 6d 61 73 6b 20 75 6e 63 68 coming mask unch
63c0: 61 6e 67 65 64 2e 0a 20 20 20 20 20 2a 2f 0a 20 anged.. */.
63d0: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
63e0: 3e 74 69 6d 65 72 20 21 3d 20 28 54 63 6c 5f 54 >timer != (Tcl_T
63f0: 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 imerToken) NULL)
6400: 20 7b 0a 09 2f 2a 0a 09 20 2a 20 44 65 6c 65 74 {../*.. * Delet
6410: 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 74 69 e an existing ti
6420: 6d 65 72 2e 20 49 74 20 77 61 73 20 6e 6f 74 20 mer. It was not
6430: 66 69 72 65 64 2c 20 79 65 74 20 77 65 20 61 72 fired, yet we ar
6440: 65 0a 09 20 2a 20 68 65 72 65 2c 20 73 6f 20 74 e.. * here, so t
6450: 68 65 20 63 68 61 6e 6e 65 6c 20 62 65 6c 6f 77 he channel below
6460: 20 67 65 6e 65 72 61 74 65 64 20 73 75 63 68 20 generated such
6470: 61 6e 20 65 76 65 6e 74 20 61 6e 64 20 77 65 0a an event and we.
6480: 09 20 2a 20 64 6f 6e 27 74 20 68 61 76 65 20 74 . * don't have t
6490: 6f 2e 20 54 68 65 20 72 65 6e 65 77 61 6c 20 6f o. The renewal o
64a0: 66 20 74 68 65 20 69 6e 74 65 72 65 73 74 20 61 f the interest a
64b0: 66 74 65 72 20 74 68 65 0a 09 20 2a 20 65 78 65 fter the.. * exe
64c0: 63 75 74 69 6f 6e 20 6f 66 20 63 68 61 6e 6e 65 cution of channe
64d0: 6c 20 68 61 6e 64 6c 65 72 73 20 77 69 6c 6c 20 l handlers will
64e0: 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 75 73 65 eventually cause
64f0: 20 75 73 20 74 6f 0a 09 20 2a 20 72 65 63 72 65 us to.. * recre
6500: 61 74 65 20 74 68 65 20 74 69 6d 65 72 20 28 69 ate the timer (i
6510: 6e 20 57 61 74 63 68 50 72 6f 63 29 2e 0a 09 20 n WatchProc)...
6520: 2a 2f 0a 09 54 63 6c 5f 44 65 6c 65 74 65 54 69 */..Tcl_DeleteTi
6530: 6d 65 72 48 61 6e 64 6c 65 72 28 73 74 61 74 65 merHandler(state
6540: 50 74 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 73 74 Ptr->timer);..st
6550: 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 atePtr->timer =
6560: 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 (Tcl_TimerToken)
6570: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 NULL;. }..
6580: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
6590: 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f flags & TLS_TCL_
65a0: 43 41 4c 4c 42 41 43 4b 29 20 7b 0a 09 64 70 72 CALLBACK) {..dpr
65b0: 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20 intf("Returning
65c0: 30 20 64 75 65 20 74 6f 20 63 61 6c 6c 62 61 63 0 due to callbac
65d0: 6b 22 29 3b 0a 09 72 65 74 75 72 6e 20 30 3b 0a k");..return 0;.
65e0: 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e }.. dprin
65f0: 74 66 28 22 43 61 6c 6c 69 6e 67 20 54 6c 73 5f tf("Calling Tls_
6600: 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 22 29 WaitForConnect")
6610: 3b 0a 20 20 20 20 65 72 72 6f 72 43 6f 64 65 20 ;. errorCode
6620: 3d 20 30 3b 0a 20 20 20 20 69 66 20 28 54 6c 73 = 0;. if (Tls
6630: 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 28 _WaitForConnect(
6640: 73 74 61 74 65 50 74 72 2c 20 26 65 72 72 6f 72 statePtr, &error
6650: 43 6f 64 65 2c 20 31 29 20 3c 20 30 29 20 7b 0a Code, 1) < 0) {.
6660: 09 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 .Tls_Error(state
6670: 50 74 72 2c 20 73 74 72 65 72 72 6f 72 28 65 72 Ptr, strerror(er
6680: 72 6f 72 43 6f 64 65 29 29 3b 0a 09 69 66 20 28 rorCode));..if (
6690: 65 72 72 6f 72 43 6f 64 65 20 3d 3d 20 45 41 47 errorCode == EAG
66a0: 41 49 4e 29 20 7b 0a 09 20 20 20 20 64 70 72 69 AIN) {.. dpri
66b0: 6e 74 66 28 22 41 73 79 6e 63 20 66 6c 61 67 20 ntf("Async flag
66c0: 63 6f 75 6c 64 20 62 65 20 73 65 74 20 28 64 69 could be set (di
66d0: 64 6e 27 74 20 63 68 65 63 6b 29 20 61 6e 64 20 dn't check) and
66e0: 65 72 72 6f 72 43 6f 64 65 20 3d 3d 20 45 41 47 errorCode == EAG
66f0: 41 49 4e 3a 20 20 52 65 74 75 72 6e 69 6e 67 20 AIN: Returning
6700: 30 22 29 3b 0a 0a 09 20 20 20 20 72 65 74 75 72 0");... retur
6710: 6e 20 30 3b 0a 09 7d 0a 0a 09 64 70 72 69 6e 74 n 0;..}...dprint
6720: 66 28 22 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f f("Tls_WaitForCo
6730: 6e 6e 65 63 74 20 72 65 74 75 72 6e 65 64 20 61 nnect returned a
6740: 6e 20 65 72 72 6f 72 22 29 3b 0a 20 20 20 20 7d n error");. }
6750: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 .. dprintf("R
6760: 65 74 75 72 6e 69 6e 67 20 25 69 22 2c 20 6d 61 eturning %i", ma
6770: 73 6b 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e sk);.. return
6780: 28 6d 61 73 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a (mask);.}../*. *
6790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
67a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
67b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
67c0: 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 20 20 20 ------*. *. *
67d0: 20 54 6c 73 43 68 61 6e 6e 65 6c 48 61 6e 64 6c TlsChannelHandl
67e0: 65 72 54 69 6d 65 72 20 2d 2d 0a 20 2a 0a 20 2a erTimer --. *. *
67f0: 20 20 20 20 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 2d 2d 2d 2d 2d 2d ----------------
6820: 2d 2d 2d 2d 2a 0a 20 2a 20 20 20 20 43 61 6c 6c ----*. * Call
6830: 65 64 20 62 79 20 74 68 65 20 6e 6f 74 69 66 69 ed by the notifi
6840: 65 72 20 28 2d 3e 20 74 69 6d 65 72 29 20 74 6f er (-> timer) to
6850: 20 66 6c 75 73 68 20 6f 75 74 0a 20 2a 20 20 20 flush out. *
6860: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 61 69 information wai
6870: 74 69 6e 67 20 69 6e 20 63 68 61 6e 6e 65 6c 20 ting in channel
6880: 62 75 66 66 65 72 73 2e 0a 20 2a 20 20 20 20 2d buffers.. * -
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a ---------------*
68c0: 0a 20 2a 0a 20 2a 20 20 20 20 53 69 64 65 20 65 . *. * Side e
68d0: 66 66 65 63 74 73 3a 0a 20 2a 20 20 20 20 20 20 ffects:. *
68e0: 20 20 41 73 20 6f 66 20 27 54 6c 73 43 68 61 6e As of 'TlsChan
68f0: 6e 65 6c 48 61 6e 64 6c 65 72 27 2e 0a 20 2a 0a nelHandler'.. *.
6900: 20 2a 20 20 20 20 52 65 73 75 6c 74 3a 0a 20 2a * Result:. *
6910: 20 20 20 20 20 20 20 20 4e 6f 6e 65 2e 0a 20 2a None.. *
6920: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
6930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 73 ---------*. */.s
6960: 74 61 74 69 63 20 76 6f 69 64 20 54 6c 73 43 68 tatic void TlsCh
6970: 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 54 69 6d 65 annelHandlerTime
6980: 72 28 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61 r(void *clientDa
6990: 74 61 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 ta) {. State
69a0: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 *statePtr = (Sta
69b0: 74 65 20 2a 29 63 6c 69 65 6e 74 44 61 74 61 3b te *)clientData;
69c0: 0a 20 20 20 20 69 6e 74 20 6d 61 73 6b 20 3d 20 . int mask =
69d0: 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 0;.. dprintf(
69e0: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 "Called");..
69f0: 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 statePtr->timer
6a00: 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 = (Tcl_TimerToke
6a10: 6e 29 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 69 66 n) NULL;.. if
6a20: 20 28 42 49 4f 5f 77 70 65 6e 64 69 6e 67 28 73 (BIO_wpending(s
6a30: 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 29 20 7b tatePtr->bio)) {
6a40: 0a 09 64 70 72 69 6e 74 66 28 22 5b 63 68 61 6e ..dprintf("[chan
6a50: 3d 25 70 5d 20 42 49 4f 20 77 72 69 74 61 62 6c =%p] BIO writabl
6a60: 65 22 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 e", statePtr->se
6a70: 6c 66 29 3b 0a 0a 09 6d 61 73 6b 20 7c 3d 20 54 lf);...mask |= T
6a80: 43 4c 5f 57 52 49 54 41 42 4c 45 3b 0a 20 20 20 CL_WRITABLE;.
6a90: 20 7d 0a 0a 20 20 20 20 69 66 20 28 42 49 4f 5f }.. if (BIO_
6aa0: 70 65 6e 64 69 6e 67 28 73 74 61 74 65 50 74 72 pending(statePtr
6ab0: 2d 3e 62 69 6f 29 29 20 7b 0a 09 64 70 72 69 6e ->bio)) {..dprin
6ac0: 74 66 28 22 5b 63 68 61 6e 3d 25 70 5d 20 42 49 tf("[chan=%p] BI
6ad0: 4f 20 72 65 61 64 61 62 6c 65 22 2c 20 73 74 61 O readable", sta
6ae0: 74 65 50 74 72 2d 3e 73 65 6c 66 29 3b 0a 0a 09 tePtr->self);...
6af0: 6d 61 73 6b 20 7c 3d 20 54 43 4c 5f 52 45 41 44 mask |= TCL_READ
6b00: 41 42 4c 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 ABLE;. }..
6b10: 20 64 70 72 69 6e 74 66 28 22 4e 6f 74 69 66 79 dprintf("Notify
6b20: 69 6e 67 20 6f 75 72 73 65 6c 76 65 73 22 29 3b ing ourselves");
6b30: 0a 20 20 20 20 54 63 6c 5f 4e 6f 74 69 66 79 43 . Tcl_NotifyC
6b40: 68 61 6e 6e 65 6c 28 73 74 61 74 65 50 74 72 2d hannel(statePtr-
6b50: 3e 73 65 6c 66 2c 20 6d 61 73 6b 29 3b 0a 0a 20 >self, mask);..
6b60: 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 75 dprintf("Retu
6b70: 72 6e 69 6e 67 22 29 3b 0a 0a 20 20 20 20 72 65 rning");.. re
6b80: 74 75 72 6e 3b 0a 7d 0a 0a 54 63 6c 5f 43 68 61 turn;.}..Tcl_Cha
6b90: 6e 6e 65 6c 20 54 6c 73 5f 47 65 74 50 61 72 65 nnel Tls_GetPare
6ba0: 6e 74 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 nt(State *stateP
6bb0: 74 72 2c 20 69 6e 74 20 6d 61 73 6b 46 6c 61 67 tr, int maskFlag
6bc0: 73 29 20 7b 0a 20 20 20 20 64 70 72 69 6e 74 66 s) {. dprintf
6bd0: 28 22 52 65 71 75 65 73 74 65 64 20 74 6f 20 67 ("Requested to g
6be0: 65 74 20 70 61 72 65 6e 74 20 6f 66 20 63 68 61 et parent of cha
6bf0: 6e 6e 65 6c 20 25 70 22 2c 20 73 74 61 74 65 50 nnel %p", stateP
6c00: 74 72 2d 3e 73 65 6c 66 29 3b 0a 0a 20 20 20 20 tr->self);..
6c10: 69 66 20 28 28 73 74 61 74 65 50 74 72 2d 3e 66 if ((statePtr->f
6c20: 6c 61 67 73 20 26 20 7e 6d 61 73 6b 46 6c 61 67 lags & ~maskFlag
6c30: 73 29 20 26 20 54 4c 53 5f 54 43 4c 5f 46 41 53 s) & TLS_TCL_FAS
6c40: 54 50 41 54 48 29 20 7b 0a 09 64 70 72 69 6e 74 TPATH) {..dprint
6c50: 66 28 22 41 73 6b 65 64 20 74 6f 20 67 65 74 20 f("Asked to get
6c60: 74 68 65 20 70 61 72 65 6e 74 20 63 68 61 6e 6e the parent chann
6c70: 65 6c 20 77 68 69 6c 65 20 77 65 20 61 72 65 20 el while we are
6c80: 75 73 69 6e 67 20 46 61 73 74 50 61 74 68 20 2d using FastPath -
6c90: 2d 20 72 65 74 75 72 6e 69 6e 67 20 4e 55 4c 4c - returning NULL
6ca0: 22 29 3b 0a 09 72 65 74 75 72 6e 28 4e 55 4c 4c ");..return(NULL
6cb0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 );. }. ret
6cc0: 75 72 6e 20 54 63 6c 5f 47 65 74 53 74 61 63 6b urn Tcl_GetStack
6cd0: 65 64 43 68 61 6e 6e 65 6c 28 73 74 61 74 65 50 edChannel(stateP
6ce0: 74 72 2d 3e 73 65 6c 66 29 3b 0a 7d 0a 0a 2f 2a tr->self);.}../*
6cf0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
6d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6d30: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 ------. *. * Tls
6d40: 5f 43 68 61 6e 6e 65 6c 54 79 70 65 20 2d 2d 0a _ChannelType --.
6d50: 20 2a 0a 20 2a 20 20 20 20 52 65 74 75 72 6e 20 *. * Return
6d60: 74 68 65 20 63 6f 72 72 65 63 74 20 54 4c 53 20 the correct TLS
6d70: 63 68 61 6e 6e 65 6c 20 64 72 69 76 65 72 20 69 channel driver i
6d80: 6e 66 6f 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 nfo. *. * Result
6d90: 73 3a 0a 20 2a 20 20 20 20 54 68 65 20 63 6f 72 s:. * The cor
6da0: 72 65 63 74 20 63 68 61 6e 6e 65 6c 20 64 72 69 rect channel dri
6db0: 76 65 72 20 66 6f 72 20 74 68 65 20 63 75 72 72 ver for the curr
6dc0: 65 6e 74 20 76 65 72 73 69 6f 6e 20 6f 66 20 54 ent version of T
6dd0: 63 6c 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 cl.. *. * Side e
6de0: 66 66 65 63 74 73 3a 0a 20 2a 20 20 20 20 4e 6f ffects:. * No
6df0: 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ne.. *. *-------
6e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
6e40: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 54 63 .static const Tc
6e50: 6c 5f 43 68 61 6e 6e 65 6c 54 79 70 65 20 74 6c l_ChannelType tl
6e60: 73 43 68 61 6e 6e 65 6c 54 79 70 65 20 3d 20 7b sChannelType = {
6e70: 0a 20 20 20 20 22 74 6c 73 22 2c 09 09 09 2f 2a . "tls",.../*
6e80: 20 54 79 70 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 Type name */.
6e90: 20 20 54 43 4c 5f 43 48 41 4e 4e 45 4c 5f 56 45 TCL_CHANNEL_VE
6ea0: 52 53 49 4f 4e 5f 35 2c 09 2f 2a 20 76 35 20 63 RSION_5,./* v5 c
6eb0: 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 54 6c hannel */. Tl
6ec0: 73 43 6c 6f 73 65 50 72 6f 63 2c 09 09 2f 2a 20 sCloseProc,../*
6ed0: 43 6c 6f 73 65 20 70 72 6f 63 20 2a 2f 0a 20 20 Close proc */.
6ee0: 20 20 54 6c 73 49 6e 70 75 74 50 72 6f 63 2c 09 TlsInputProc,.
6ef0: 09 2f 2a 20 49 6e 70 75 74 20 70 72 6f 63 20 2a ./* Input proc *
6f00: 2f 0a 20 20 20 20 54 6c 73 4f 75 74 70 75 74 50 /. TlsOutputP
6f10: 72 6f 63 2c 09 09 2f 2a 20 4f 75 74 70 75 74 20 roc,../* Output
6f20: 70 72 6f 63 20 2a 2f 0a 20 20 20 20 30 2c 09 09 proc */. 0,..
6f30: 09 2f 2a 20 53 65 65 6b 20 70 72 6f 63 20 2a 2f ./* Seek proc */
6f40: 0a 20 20 20 20 54 6c 73 53 65 74 4f 70 74 69 6f . TlsSetOptio
6f50: 6e 50 72 6f 63 2c 09 09 2f 2a 20 53 65 74 20 6f nProc,../* Set o
6f60: 70 74 69 6f 6e 20 70 72 6f 63 20 2a 2f 0a 20 20 ption proc */.
6f70: 20 20 54 6c 73 47 65 74 4f 70 74 69 6f 6e 50 72 TlsGetOptionPr
6f80: 6f 63 2c 09 09 2f 2a 20 47 65 74 20 6f 70 74 69 oc,../* Get opti
6f90: 6f 6e 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20 54 on proc */. T
6fa0: 6c 73 57 61 74 63 68 50 72 6f 63 2c 09 09 2f 2a lsWatchProc,../*
6fb0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 6e 6f 74 69 Initialize noti
6fc0: 66 69 65 72 20 2a 2f 0a 20 20 20 20 54 6c 73 47 fier */. TlsG
6fd0: 65 74 48 61 6e 64 6c 65 50 72 6f 63 2c 09 09 2f etHandleProc,../
6fe0: 2a 20 47 65 74 20 4f 53 20 68 61 6e 64 6c 65 73 * Get OS handles
6ff0: 20 6f 75 74 20 6f 66 20 63 68 61 6e 6e 65 6c 20 out of channel
7000: 2a 2f 0a 20 20 20 20 54 6c 73 43 6c 6f 73 65 32 */. TlsClose2
7010: 50 72 6f 63 2c 09 09 2f 2a 20 63 6c 6f 73 65 32 Proc,../* close2
7020: 70 72 6f 63 20 2a 2f 0a 20 20 20 20 54 6c 73 42 proc */. TlsB
7030: 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 2c 09 09 2f lockModeProc,../
7040: 2a 20 53 65 74 20 62 6c 6f 63 6b 69 6e 67 2f 6e * Set blocking/n
7050: 6f 6e 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2a onblocking mode*
7060: 2f 0a 20 20 20 20 30 2c 09 09 09 2f 2a 20 46 6c /. 0,.../* Fl
7070: 75 73 68 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20 ush proc */.
7080: 54 6c 73 4e 6f 74 69 66 79 50 72 6f 63 2c 09 09 TlsNotifyProc,..
7090: 2f 2a 20 48 61 6e 64 6c 69 6e 67 20 6f 66 20 65 /* Handling of e
70a0: 76 65 6e 74 73 20 62 75 62 62 6c 69 6e 67 20 75 vents bubbling u
70b0: 70 20 2a 2f 0a 20 20 20 20 30 2c 09 09 09 2f 2a p */. 0,.../*
70c0: 20 57 69 64 65 20 73 65 65 6b 20 70 72 6f 63 20 Wide seek proc
70d0: 2a 2f 0a 20 20 20 20 4e 55 4c 4c 2c 09 09 09 2f */. NULL,.../
70e0: 2a 20 54 68 72 65 61 64 20 61 63 74 69 6f 6e 20 * Thread action
70f0: 2a 2f 0a 20 20 20 20 4e 55 4c 4c 09 09 09 2f 2a */. NULL.../*
7100: 20 54 72 75 6e 63 61 74 65 20 2a 2f 0a 7d 3b 0a Truncate */.};.
7110: 0a 63 6f 6e 73 74 20 54 63 6c 5f 43 68 61 6e 6e .const Tcl_Chann
7120: 65 6c 54 79 70 65 20 2a 54 6c 73 5f 43 68 61 6e elType *Tls_Chan
7130: 6e 65 6c 54 79 70 65 28 76 6f 69 64 29 20 7b 0a nelType(void) {.
7140: 20 20 20 20 72 65 74 75 72 6e 20 26 74 6c 73 43 return &tlsC
7150: 68 61 6e 6e 65 6c 54 79 70 65 3b 0a 7d 0a hannelType;.}.