0000: 2f 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20 /*. * Copyright
0010: 28 43 29 20 31 39 39 37 2d 32 30 30 30 20 4d 61 (C) 1997-2000 Ma
0020: 74 74 20 4e 65 77 6d 61 6e 20 3c 6d 61 74 74 40 tt Newman <matt@
0030: 6e 6f 76 61 64 69 67 6d 2e 63 6f 6d 3e 0a 20 2a novadigm.com>. *
0040: 20 43 6f 70 79 72 69 67 68 74 20 28 43 29 20 32 Copyright (C) 2
0050: 30 30 30 20 41 6a 75 62 61 20 53 6f 6c 75 74 69 000 Ajuba Soluti
0060: 6f 6e 73 0a 20 2a 0a 20 2a 20 54 4c 53 20 28 61 ons. *. * TLS (a
0070: 6b 61 20 53 53 4c 29 20 43 68 61 6e 6e 65 6c 20 ka SSL) Channel
0080: 2d 20 63 61 6e 20 62 65 20 6c 61 79 65 72 65 64 - can be layered
0090: 20 6f 6e 20 61 6e 79 20 62 69 2d 64 69 72 65 63 on any bi-direc
00a0: 74 69 6f 6e 61 6c 0a 20 2a 20 54 63 6c 5f 43 68 tional. * Tcl_Ch
00b0: 61 6e 6e 65 6c 20 28 4e 6f 74 65 3a 20 52 65 71 annel (Note: Req
00c0: 75 69 72 65 73 20 54 72 66 20 43 6f 72 65 20 50 uires Trf Core P
00d0: 61 74 63 68 29 0a 20 2a 0a 20 2a 20 54 68 69 73 atch). *. * This
00e0: 20 77 61 73 20 62 75 69 6c 74 20 66 72 6f 6d 20 was built from
00f0: 73 63 72 61 74 63 68 20 62 61 73 65 64 20 75 70 scratch based up
0100: 6f 6e 20 6f 62 73 65 72 76 61 74 69 6f 6e 20 6f on observation o
0110: 66 20 4f 70 65 6e 53 53 4c 20 30 2e 39 2e 32 42 f OpenSSL 0.9.2B
0120: 0a 20 2a 0a 20 2a 20 41 64 64 69 74 69 6f 6e 20 . *. * Addition
0130: 63 72 65 64 69 74 20 69 73 20 64 75 65 20 66 6f credit is due fo
0140: 72 20 41 6e 64 72 65 61 73 20 4b 75 70 72 69 65 r Andreas Kuprie
0150: 73 20 28 61 2e 6b 75 70 72 69 65 73 40 77 65 73 s (a.kupries@wes
0160: 74 65 6e 64 2e 63 6f 6d 29 2c 20 66 6f 72 0a 20 tend.com), for.
0170: 2a 20 70 72 6f 76 69 64 69 6e 67 20 74 68 65 20 * providing the
0180: 54 63 6c 5f 52 65 70 6c 61 63 65 43 68 61 6e 6e Tcl_ReplaceChann
0190: 65 6c 20 6d 65 63 68 61 6e 69 73 6d 20 61 6e 64 el mechanism and
01a0: 20 77 6f 72 6b 69 6e 67 20 63 6c 6f 73 65 6c 79 working closely
01b0: 20 77 69 74 68 20 6d 65 0a 20 2a 20 74 6f 20 65 with me. * to e
01c0: 6e 68 61 6e 63 65 20 69 74 20 74 6f 20 73 75 70 nhance it to sup
01d0: 70 6f 72 74 20 66 75 6c 6c 20 66 69 6c 65 65 76 port full fileev
01e0: 65 6e 74 20 73 65 6d 61 6e 74 69 63 73 2e 0a 20 ent semantics..
01f0: 2a 0a 20 2a 20 41 6c 73 6f 20 77 6f 72 6b 20 64 *. * Also work d
0200: 6f 6e 65 20 62 79 20 74 68 65 20 66 6f 6c 6c 6f one by the follo
0210: 77 20 70 65 6f 70 6c 65 20 70 72 6f 76 69 64 65 w people provide
0220: 64 20 74 68 65 20 69 6d 70 65 74 75 73 20 74 6f d the impetus to
0230: 20 64 6f 20 74 68 69 73 20 22 72 69 67 68 74 22 do this "right"
0240: 3a 0a 20 2a 20 20 20 20 74 63 6c 53 53 4c 20 28 :. * tclSSL (
0250: 43 6f 6c 69 6e 20 4d 63 43 6f 72 6d 61 63 6b 2c Colin McCormack,
0260: 20 53 68 61 72 65 64 20 54 65 63 68 6e 6f 6c 6f Shared Technolo
0270: 67 79 29 0a 20 2a 20 20 20 20 53 53 4c 74 63 6c gy). * SSLtcl
0280: 20 28 50 65 74 65 72 20 41 6e 74 6d 61 6e 29 0a (Peter Antman).
0290: 20 2a 0a 20 2a 2f 0a 0a 23 69 6e 63 6c 75 64 65 *. */..#include
02a0: 20 22 74 6c 73 49 6e 74 2e 68 22 0a 23 69 6e 63 "tlsInt.h".#inc
02b0: 6c 75 64 65 20 3c 65 72 72 6e 6f 2e 68 3e 0a 0a lude <errno.h>..
02c0: 2f 2a 0a 20 2a 20 46 6f 72 77 61 72 64 20 64 65 /*. * Forward de
02d0: 63 6c 61 72 61 74 69 6f 6e 73 0a 20 2a 2f 0a 73 clarations. */.s
02e0: 74 61 74 69 63 20 76 6f 69 64 20 54 6c 73 43 68 tatic void TlsCh
02f0: 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 54 69 6d 65 annelHandlerTime
0300: 72 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 r(ClientData cli
0310: 65 6e 74 44 61 74 61 29 3b 0a 0a 2f 2a 0a 20 2a entData);../*. *
0320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0360: 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 42 6c 6f ---. *. * TlsBlo
0370: 63 6b 4d 6f 64 65 50 72 6f 63 20 2d 2d 0a 20 2a ckModeProc --. *
0380: 0a 20 2a 20 20 20 20 54 68 69 73 20 70 72 6f 63 . * This proc
0390: 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 edure is invoked
03a0: 20 62 79 20 74 68 65 20 67 65 6e 65 72 69 63 20 by the generic
03b0: 49 4f 20 6c 65 76 65 6c 0a 20 2a 20 20 20 20 20 IO level. *
03c0: 20 20 74 6f 20 73 65 74 20 62 6c 6f 63 6b 69 6e to set blockin
03d0: 67 20 61 6e 64 20 6e 6f 6e 62 6c 6f 63 6b 69 6e g and nonblockin
03e0: 67 20 6d 6f 64 65 73 0a 20 2a 0a 20 2a 20 52 65 g modes. *. * Re
03f0: 73 75 6c 74 73 3a 0a 20 2a 20 20 20 20 30 20 69 sults:. * 0 i
0400: 66 20 73 75 63 63 65 73 73 66 75 6c 20 6f 72 20 f successful or
0410: 50 4f 53 49 58 20 65 72 72 6f 72 20 63 6f 64 65 POSIX error code
0420: 20 69 66 20 66 61 69 6c 65 64 2e 0a 20 2a 0a 20 if failed.. *.
0430: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
0440: 20 2a 20 20 20 20 53 65 74 73 20 74 68 65 20 64 * Sets the d
0450: 65 76 69 63 65 20 69 6e 74 6f 20 62 6c 6f 63 6b evice into block
0460: 69 6e 67 20 6f 72 20 6e 6f 6e 62 6c 6f 63 6b 69 ing or nonblocki
0470: 6e 67 20 6d 6f 64 65 2e 0a 20 2a 0a 20 2a 2d 2d ng mode.. *. *--
0480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
04a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
04b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
04c0: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 -. */.static int
04d0: 20 54 6c 73 42 6c 6f 63 6b 4d 6f 64 65 50 72 6f TlsBlockModePro
04e0: 63 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 c(ClientData ins
04f0: 74 61 6e 63 65 44 61 74 61 2c 20 69 6e 74 20 6d tanceData, int m
0500: 6f 64 65 29 20 7b 0a 20 20 20 20 53 74 61 74 65 ode) {. State
0510: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 *statePtr = (St
0520: 61 74 65 20 2a 29 20 69 6e 73 74 61 6e 63 65 44 ate *) instanceD
0530: 61 74 61 3b 0a 0a 20 20 20 20 69 66 20 28 6d 6f ata;.. if (mo
0540: 64 65 20 3d 3d 20 54 43 4c 5f 4d 4f 44 45 5f 4e de == TCL_MODE_N
0550: 4f 4e 42 4c 4f 43 4b 49 4e 47 29 20 7b 0a 09 73 ONBLOCKING) {..s
0560: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c tatePtr->flags |
0570: 3d 20 54 4c 53 5f 54 43 4c 5f 41 53 59 4e 43 3b = TLS_TCL_ASYNC;
0580: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 73 . } else {..s
0590: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 tatePtr->flags &
05a0: 3d 20 7e 28 54 4c 53 5f 54 43 4c 5f 41 53 59 4e = ~(TLS_TCL_ASYN
05b0: 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 C);. }. re
05c0: 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a 0a 20 turn(0);.}../*.
05d0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
05e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
05f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0610: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 43 6c ----. *. * TlsCl
0620: 6f 73 65 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a oseProc --. *. *
0630: 20 20 20 20 54 68 69 73 20 70 72 6f 63 65 64 75 This procedu
0640: 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 re is invoked by
0650: 20 74 68 65 20 67 65 6e 65 72 69 63 20 49 4f 20 the generic IO
0660: 6c 65 76 65 6c 20 74 6f 20 70 65 72 66 6f 72 6d level to perform
0670: 0a 20 2a 20 20 20 20 63 68 61 6e 6e 65 6c 2d 74 . * channel-t
0680: 79 70 65 2d 73 70 65 63 69 66 69 63 20 63 6c 65 ype-specific cle
0690: 61 6e 75 70 20 77 68 65 6e 20 61 20 53 53 4c 20 anup when a SSL
06a0: 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63 68 61 socket based cha
06b0: 6e 6e 65 6c 0a 20 2a 20 20 20 20 69 73 20 63 6c nnel. * is cl
06c0: 6f 73 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 4e osed.. *. * N
06d0: 6f 74 65 3a 20 77 65 20 6c 65 61 76 65 20 74 68 ote: we leave th
06e0: 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 73 6f 63 e underlying soc
06f0: 6b 65 74 20 61 6c 6f 6e 65 2c 20 69 73 20 74 68 ket alone, is th
0700: 69 73 20 72 69 67 68 74 3f 0a 20 2a 0a 20 2a 20 is right?. *. *
0710: 52 65 73 75 6c 74 73 3a 0a 20 2a 20 20 20 20 30 Results:. * 0
0720: 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 6f if successful o
0730: 72 20 50 4f 53 49 58 20 65 72 72 6f 72 20 63 6f r POSIX error co
0740: 64 65 20 69 66 20 66 61 69 6c 65 64 2e 0a 20 2a de if failed.. *
0750: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
0760: 3a 0a 20 2a 20 20 20 20 43 6c 6f 73 65 73 20 74 :. * Closes t
0770: 68 65 20 73 6f 63 6b 65 74 20 6f 66 20 74 68 65 he socket of the
0780: 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d channel.. *. *-
0790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
07a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
07b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
07c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
07d0: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e --. */.static in
07e0: 74 20 54 6c 73 43 6c 6f 73 65 50 72 6f 63 28 43 t TlsCloseProc(C
07f0: 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e lientData instan
0800: 63 65 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 ceData, Tcl_Inte
0810: 72 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 rp *interp) {.
0820: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 State *statePt
0830: 72 20 3d 20 28 53 74 61 74 65 20 2a 29 20 69 6e r = (State *) in
0840: 73 74 61 6e 63 65 44 61 74 61 3b 0a 0a 20 20 20 stanceData;..
0850: 20 64 70 72 69 6e 74 66 28 22 54 6c 73 43 6c 6f dprintf("TlsClo
0860: 73 65 50 72 6f 63 28 25 70 29 22 2c 20 28 76 6f seProc(%p)", (vo
0870: 69 64 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b id *) statePtr);
0880: 0a 0a 20 20 20 20 54 6c 73 5f 43 6c 65 61 6e 28 .. Tls_Clean(
0890: 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 54 statePtr);. T
08a0: 63 6c 5f 45 76 65 6e 74 75 61 6c 6c 79 46 72 65 cl_EventuallyFre
08b0: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 73 74 e((ClientData)st
08c0: 61 74 65 50 74 72 2c 20 54 6c 73 5f 46 72 65 65 atePtr, Tls_Free
08d0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 30 29 );. return(0)
08e0: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 ;.}..static int
08f0: 54 6c 73 43 6c 6f 73 65 32 50 72 6f 63 28 43 6c TlsClose2Proc(Cl
0900: 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 ientData instanc
0910: 65 44 61 74 61 2c 20 20 20 20 2f 2a 20 54 68 65 eData, /* The
0920: 20 73 6f 63 6b 65 74 20 73 74 61 74 65 2e 20 2a socket state. *
0930: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 /. Tcl_Interp
0940: 20 2a 69 6e 74 65 72 70 2c 09 09 2f 2a 20 46 6f *interp,../* Fo
0950: 72 20 65 72 72 6f 72 73 20 2d 20 63 61 6e 20 62 r errors - can b
0960: 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 20 20 69 e NULL. */. i
0970: 6e 74 20 66 6c 61 67 73 29 09 09 09 2f 2a 20 46 nt flags).../* F
0980: 6c 61 67 73 20 74 6f 20 63 6c 6f 73 65 20 72 65 lags to close re
0990: 61 64 20 61 6e 64 2f 6f 72 20 77 72 69 74 65 20 ad and/or write
09a0: 73 69 64 65 20 6f 66 20 63 68 61 6e 6e 65 6c 20 side of channel
09b0: 2a 2f 0a 7b 0a 20 20 20 20 53 74 61 74 65 20 2a */.{. State *
09c0: 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 statePtr = (Stat
09d0: 65 20 2a 29 20 69 6e 73 74 61 6e 63 65 44 61 74 e *) instanceDat
09e0: 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 a;.. dprintf(
09f0: 22 54 6c 73 43 6c 6f 73 65 32 50 72 6f 63 28 25 "TlsClose2Proc(%
0a00: 70 29 22 2c 20 28 76 6f 69 64 20 2a 29 20 73 74 p)", (void *) st
0a10: 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 69 66 atePtr);.. if
0a20: 20 28 28 66 6c 61 67 73 20 26 20 28 54 43 4c 5f ((flags & (TCL_
0a30: 43 4c 4f 53 45 5f 52 45 41 44 7c 54 43 4c 5f 43 CLOSE_READ|TCL_C
0a40: 4c 4f 53 45 5f 57 52 49 54 45 29 29 20 3d 3d 20 LOSE_WRITE)) ==
0a50: 30 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 6c 73 0) {..return Tls
0a60: 43 6c 6f 73 65 50 72 6f 63 28 69 6e 73 74 61 6e CloseProc(instan
0a70: 63 65 44 61 74 61 2c 20 69 6e 74 65 72 70 29 3b ceData, interp);
0a80: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 . }. retur
0a90: 6e 20 45 49 4e 56 41 4c 3b 0a 7d 0a 0a 2f 2a 0a n EINVAL;.}../*.
0aa0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
0ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 20 --------*. *. *
0ae0: 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 Tls_WaitForConne
0af0: 63 74 20 2d 2d 0a 20 2a 0a 20 2a 20 52 65 73 75 ct --. *. * Resu
0b00: 6c 74 3a 0a 20 2a 20 20 20 20 30 20 69 66 20 73 lt:. * 0 if s
0b10: 75 63 63 65 73 73 66 75 6c 2c 20 2d 31 20 69 66 uccessful, -1 if
0b20: 20 66 61 69 6c 65 64 2e 0a 20 2a 0a 20 2a 20 53 failed.. *. * S
0b30: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 20 ide effects:. *
0b40: 20 20 20 49 73 73 75 65 73 20 53 53 4c 5f 61 63 Issues SSL_ac
0b50: 63 65 70 74 20 6f 72 20 53 53 4c 5f 63 6f 6e 6e cept or SSL_conn
0b60: 65 63 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ect. *. *-------
0b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a ---------------*
0ba0: 0a 20 2a 2f 0a 69 6e 74 20 54 6c 73 5f 57 61 69 . */.int Tls_Wai
0bb0: 74 46 6f 72 43 6f 6e 6e 65 63 74 28 53 74 61 74 tForConnect(Stat
0bc0: 65 20 2a 73 74 61 74 65 50 74 72 2c 20 69 6e 74 e *statePtr, int
0bd0: 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 2c 20 *errorCodePtr,
0be0: 69 6e 74 20 68 61 6e 64 73 68 61 6b 65 46 61 69 int handshakeFai
0bf0: 6c 75 72 65 49 73 50 65 72 6d 61 6e 65 6e 74 29 lureIsPermanent)
0c00: 20 7b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 {. unsigned
0c10: 6c 6f 6e 67 20 62 61 63 6b 69 6e 67 45 72 72 6f long backingErro
0c20: 72 3b 0a 20 20 20 20 69 6e 74 20 65 72 72 2c 20 r;. int err,
0c30: 72 63 3b 0a 20 20 20 20 69 6e 74 20 62 69 6f 53 rc;. int bioS
0c40: 68 6f 75 6c 64 52 65 74 72 79 3b 0a 20 20 20 20 houldRetry;.
0c50: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 *errorCodePtr =
0c60: 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 0;.. dprintf(
0c70: 22 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 28 "WaitForConnect(
0c80: 25 70 29 22 2c 20 28 76 6f 69 64 20 2a 29 20 73 %p)", (void *) s
0c90: 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 64 70 tatePtr);. dp
0ca0: 72 69 6e 74 46 6c 61 67 73 28 73 74 61 74 65 50 rintFlags(stateP
0cb0: 74 72 29 3b 0a 0a 20 20 20 20 69 66 20 28 21 28 tr);.. if (!(
0cc0: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 statePtr->flags
0cd0: 26 20 54 4c 53 5f 54 43 4c 5f 49 4e 49 54 29 29 & TLS_TCL_INIT))
0ce0: 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 54 6c 73 {..dprintf("Tls
0cf0: 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 20 _WaitForConnect
0d00: 63 61 6c 6c 65 64 20 6f 6e 20 61 6c 72 65 61 64 called on alread
0d10: 79 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 63 68 y initialized ch
0d20: 61 6e 6e 65 6c 20 2d 2d 20 72 65 74 75 72 6e 69 annel -- returni
0d30: 6e 67 20 77 69 74 68 20 69 6d 6d 65 64 69 61 74 ng with immediat
0d40: 65 20 73 75 63 63 65 73 73 22 29 3b 0a 09 72 65 e success");..re
0d50: 74 75 72 6e 28 30 29 3b 0a 20 20 20 20 7d 0a 0a turn(0);. }..
0d60: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
0d70: 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 ->flags & TLS_TC
0d80: 4c 5f 48 41 4e 44 53 48 41 4b 45 5f 46 41 49 4c L_HANDSHAKE_FAIL
0d90: 45 44 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 44 69 ED) {../*.. * Di
0da0: 66 66 65 72 65 6e 74 20 74 79 70 65 73 20 6f 66 fferent types of
0db0: 20 6f 70 65 72 61 74 69 6f 6e 73 20 68 61 76 65 operations have
0dc0: 20 64 69 66 66 65 72 65 6e 74 20 72 65 71 75 69 different requi
0dd0: 72 65 6d 65 6e 74 73 0a 09 20 2a 20 53 53 4c 20 rements.. * SSL
0de0: 62 65 69 6e 67 20 65 73 74 61 62 6c 69 73 68 65 being establishe
0df0: 64 0a 09 20 2a 2f 0a 09 69 66 20 28 68 61 6e 64 d.. */..if (hand
0e00: 73 68 61 6b 65 46 61 69 6c 75 72 65 49 73 50 65 shakeFailureIsPe
0e10: 72 6d 61 6e 65 6e 74 29 20 7b 0a 09 20 20 20 20 rmanent) {..
0e20: 64 70 72 69 6e 74 66 28 22 41 73 6b 65 64 20 74 dprintf("Asked t
0e30: 6f 20 77 61 69 74 20 66 6f 72 20 61 20 54 4c 53 o wait for a TLS
0e40: 20 68 61 6e 64 73 68 61 6b 65 20 74 68 61 74 20 handshake that
0e50: 68 61 73 20 61 6c 72 65 61 64 79 20 66 61 69 6c has already fail
0e60: 65 64 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 66 ed. Returning f
0e70: 61 74 61 6c 20 65 72 72 6f 72 22 29 3b 0a 09 20 atal error");..
0e80: 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 *errorCodePtr
0e90: 20 3d 20 45 43 4f 4e 4e 41 42 4f 52 54 45 44 3b = ECONNABORTED;
0ea0: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 ..} else {..
0eb0: 64 70 72 69 6e 74 66 28 22 41 73 6b 65 64 20 74 dprintf("Asked t
0ec0: 6f 20 77 61 69 74 20 66 6f 72 20 61 20 54 4c 53 o wait for a TLS
0ed0: 20 68 61 6e 64 73 68 61 6b 65 20 74 68 61 74 20 handshake that
0ee0: 68 61 73 20 61 6c 72 65 61 64 79 20 66 61 69 6c has already fail
0ef0: 65 64 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 73 ed. Returning s
0f00: 6f 66 74 20 65 72 72 6f 72 22 29 3b 0a 09 20 20 oft error");..
0f10: 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 *errorCodePtr
0f20: 3d 20 45 43 4f 4e 4e 52 45 53 45 54 3b 0a 09 7d = ECONNRESET;..}
0f30: 0a 09 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 ..Tls_Error(stat
0f40: 65 50 74 72 2c 20 22 57 61 69 74 20 66 6f 72 20 ePtr, "Wait for
0f50: 66 61 69 6c 65 64 20 68 61 6e 64 73 68 61 6b 65 failed handshake
0f60: 22 29 3b 0a 09 72 65 74 75 72 6e 28 2d 31 29 3b ");..return(-1);
0f70: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 20 . }.. for
0f80: 28 3b 3b 29 20 7b 0a 09 45 52 52 5f 63 6c 65 61 (;;) {..ERR_clea
0f90: 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 09 2f 2a 20 r_error();.../*
0fa0: 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 Not initialized
0fb0: 79 65 74 21 20 41 6c 73 6f 20 63 61 6c 6c 73 20 yet! Also calls
0fc0: 53 53 4c 5f 64 6f 5f 68 61 6e 64 73 68 61 6b 65 SSL_do_handshake
0fd0: 2e 20 2a 2f 0a 09 69 66 20 28 73 74 61 74 65 50 . */..if (stateP
0fe0: 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f tr->flags & TLS_
0ff0: 54 43 4c 5f 53 45 52 56 45 52 29 20 7b 0a 09 20 TCL_SERVER) {..
1000: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
1010: 69 6e 67 20 53 53 4c 5f 61 63 63 65 70 74 28 29 ing SSL_accept()
1020: 22 29 3b 0a 09 20 20 20 20 65 72 72 20 3d 20 53 ");.. err = S
1030: 53 4c 5f 61 63 63 65 70 74 28 73 74 61 74 65 50 SL_accept(stateP
1040: 74 72 2d 3e 73 73 6c 29 3b 0a 0a 09 7d 20 65 6c tr->ssl);...} el
1050: 73 65 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 se {.. dprint
1060: 66 28 22 43 61 6c 6c 69 6e 67 20 53 53 4c 5f 63 f("Calling SSL_c
1070: 6f 6e 6e 65 63 74 28 29 22 29 3b 0a 09 20 20 20 onnect()");..
1080: 20 65 72 72 20 3d 20 53 53 4c 5f 63 6f 6e 6e 65 err = SSL_conne
1090: 63 74 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c ct(statePtr->ssl
10a0: 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 65 72 72 20 );..}...if (err
10b0: 3e 20 30 29 20 7b 0a 09 20 20 20 20 64 70 72 69 > 0) {.. dpri
10c0: 6e 74 66 28 22 41 63 63 65 70 74 20 6f 72 20 63 ntf("Accept or c
10d0: 6f 6e 6e 65 63 74 20 77 61 73 20 73 75 63 63 65 onnect was succe
10e0: 73 73 66 75 6c 22 29 3b 0a 09 20 20 20 20 65 72 ssful");.. er
10f0: 72 20 3d 20 42 49 4f 5f 66 6c 75 73 68 28 73 74 r = BIO_flush(st
1100: 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 20 atePtr->bio);..
1110: 20 20 20 69 66 20 28 65 72 72 20 3c 3d 20 30 29 if (err <= 0)
1120: 20 7b 0a 09 09 64 70 72 69 6e 74 66 28 22 46 6c {...dprintf("Fl
1130: 75 73 68 69 6e 67 20 74 68 65 20 6c 6f 77 65 72 ushing the lower
1140: 20 6c 61 79 65 72 73 20 66 61 69 6c 65 64 2c 20 layers failed,
1150: 74 68 69 73 20 77 69 6c 6c 20 70 72 6f 62 61 62 this will probab
1160: 6c 79 20 74 65 72 6d 69 6e 61 74 65 20 74 68 69 ly terminate thi
1170: 73 20 73 65 73 73 69 6f 6e 22 29 3b 0a 09 20 20 s session");..
1180: 20 20 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 }..} else {..
1190: 20 20 20 64 70 72 69 6e 74 66 28 22 41 63 63 65 dprintf("Acce
11a0: 70 74 20 6f 72 20 63 6f 6e 6e 65 63 74 20 66 61 pt or connect fa
11b0: 69 6c 65 64 22 29 3b 0a 09 7d 0a 0a 09 72 63 20 iled");..}...rc
11c0: 3d 20 53 53 4c 5f 67 65 74 5f 65 72 72 6f 72 28 = SSL_get_error(
11d0: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 65 statePtr->ssl, e
11e0: 72 72 29 3b 0a 09 62 61 63 6b 69 6e 67 45 72 72 rr);..backingErr
11f0: 6f 72 20 3d 20 45 52 52 5f 67 65 74 5f 65 72 72 or = ERR_get_err
1200: 6f 72 28 29 3b 0a 09 69 66 20 28 72 63 20 21 3d or();..if (rc !=
1210: 20 53 53 4c 5f 45 52 52 4f 52 5f 4e 4f 4e 45 29 SSL_ERROR_NONE)
1220: 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 {.. dprintf(
1230: 22 47 6f 74 20 65 72 72 6f 72 3a 20 25 69 20 28 "Got error: %i (
1240: 72 63 20 3d 20 25 69 29 22 2c 20 65 72 72 2c 20 rc = %i)", err,
1250: 72 63 29 3b 0a 09 20 20 20 20 64 70 72 69 6e 74 rc);.. dprint
1260: 66 28 22 47 6f 74 20 65 72 72 6f 72 3a 20 25 73 f("Got error: %s
1270: 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f ", GET_ERR_REASO
1280: 4e 28 29 29 3b 0a 09 7d 0a 0a 09 62 69 6f 53 68 N());..}...bioSh
1290: 6f 75 6c 64 52 65 74 72 79 20 3d 20 30 3b 0a 09 ouldRetry = 0;..
12a0: 69 66 20 28 65 72 72 20 3c 3d 20 30 29 20 7b 0a if (err <= 0) {.
12b0: 09 20 20 20 20 69 66 20 28 72 63 20 3d 3d 20 53 . if (rc == S
12c0: 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 43 4f SL_ERROR_WANT_CO
12d0: 4e 4e 45 43 54 20 7c 7c 20 72 63 20 3d 3d 20 53 NNECT || rc == S
12e0: 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 41 43 SL_ERROR_WANT_AC
12f0: 43 45 50 54 20 7c 7c 20 72 63 20 3d 3d 20 53 53 CEPT || rc == SS
1300: 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 52 45 41 L_ERROR_WANT_REA
1310: 44 20 7c 7c 20 72 63 20 3d 3d 20 53 53 4c 5f 45 D || rc == SSL_E
1320: 52 52 4f 52 5f 57 41 4e 54 5f 57 52 49 54 45 29 RROR_WANT_WRITE)
1330: 20 7b 0a 09 09 62 69 6f 53 68 6f 75 6c 64 52 65 {...bioShouldRe
1340: 74 72 79 20 3d 20 31 3b 0a 09 20 20 20 20 7d 20 try = 1;.. }
1350: 65 6c 73 65 20 69 66 20 28 42 49 4f 5f 73 68 6f else if (BIO_sho
1360: 75 6c 64 5f 72 65 74 72 79 28 73 74 61 74 65 50 uld_retry(stateP
1370: 74 72 2d 3e 62 69 6f 29 29 20 7b 0a 09 09 62 69 tr->bio)) {...bi
1380: 6f 53 68 6f 75 6c 64 52 65 74 72 79 20 3d 20 31 oShouldRetry = 1
1390: 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 ;.. } else if
13a0: 20 28 72 63 20 3d 3d 20 53 53 4c 5f 45 52 52 4f (rc == SSL_ERRO
13b0: 52 5f 53 59 53 43 41 4c 4c 20 26 26 20 54 63 6c R_SYSCALL && Tcl
13c0: 5f 47 65 74 45 72 72 6e 6f 28 29 20 3d 3d 20 45 _GetErrno() == E
13d0: 41 47 41 49 4e 29 20 7b 0a 09 09 62 69 6f 53 68 AGAIN) {...bioSh
13e0: 6f 75 6c 64 52 65 74 72 79 20 3d 20 31 3b 0a 09 ouldRetry = 1;..
13f0: 20 20 20 20 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a }..} else {.
1400: 09 20 20 20 20 69 66 20 28 21 53 53 4c 5f 69 73 . if (!SSL_is
1410: 5f 69 6e 69 74 5f 66 69 6e 69 73 68 65 64 28 73 _init_finished(s
1420: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 29 20 7b tatePtr->ssl)) {
1430: 0a 09 09 62 69 6f 53 68 6f 75 6c 64 52 65 74 72 ...bioShouldRetr
1440: 79 20 3d 20 31 3b 0a 09 20 20 20 20 7d 0a 09 7d y = 1;.. }..}
1450: 0a 0a 09 69 66 20 28 62 69 6f 53 68 6f 75 6c 64 ...if (bioShould
1460: 52 65 74 72 79 29 20 7b 0a 09 20 20 20 20 64 70 Retry) {.. dp
1470: 72 69 6e 74 66 28 22 54 68 65 20 49 2f 4f 20 64 rintf("The I/O d
1480: 69 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 id not complete
1490: 2d 2d 20 62 75 74 20 77 65 20 73 68 6f 75 6c 64 -- but we should
14a0: 20 74 72 79 20 69 74 20 61 67 61 69 6e 22 29 3b try it again");
14b0: 0a 0a 09 20 20 20 20 69 66 20 28 73 74 61 74 65 ... if (state
14c0: 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 Ptr->flags & TLS
14d0: 5f 54 43 4c 5f 41 53 59 4e 43 29 20 7b 0a 09 09 _TCL_ASYNC) {...
14e0: 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 dprintf("Returni
14f0: 6e 67 20 45 41 47 41 49 4e 20 73 6f 20 74 68 61 ng EAGAIN so tha
1500: 74 20 69 74 20 63 61 6e 20 62 65 20 72 65 74 72 t it can be retr
1510: 69 65 64 20 6c 61 74 65 72 22 29 3b 0a 09 09 2a ied later");...*
1520: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 errorCodePtr = E
1530: 41 47 41 49 4e 3b 0a 09 09 72 65 74 75 72 6e 28 AGAIN;...return(
1540: 2d 31 29 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 -1);.. } else
1550: 20 7b 0a 09 09 64 70 72 69 6e 74 66 28 22 44 6f {...dprintf("Do
1560: 69 6e 67 20 73 6f 20 6e 6f 77 22 29 3b 0a 09 09 ing so now");...
1570: 63 6f 6e 74 69 6e 75 65 3b 0a 09 20 20 20 20 7d continue;.. }
1580: 0a 09 7d 0a 0a 09 64 70 72 69 6e 74 66 28 22 57 ..}...dprintf("W
1590: 65 20 68 61 76 65 20 65 69 74 68 65 72 20 63 6f e have either co
15a0: 6d 70 6c 65 74 65 6c 79 20 65 73 74 61 62 6c 69 mpletely establi
15b0: 73 68 65 64 20 74 68 65 20 73 65 73 73 69 6f 6e shed the session
15c0: 20 6f 72 20 63 6f 6d 70 6c 65 74 65 6c 79 20 66 or completely f
15d0: 61 69 6c 65 64 20 69 74 20 2d 2d 20 74 68 65 72 ailed it -- ther
15e0: 65 20 69 73 20 6e 6f 20 6d 6f 72 65 20 6e 65 65 e is no more nee
15f0: 64 20 74 6f 20 65 76 65 72 20 72 65 74 72 79 20 d to ever retry
1600: 69 74 20 74 68 6f 75 67 68 22 29 3b 0a 09 62 72 it though");..br
1610: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 eak;. }..
1620: 73 77 69 74 63 68 20 28 72 63 29 20 7b 0a 09 63 switch (rc) {..c
1630: 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 4e 4f ase SSL_ERROR_NO
1640: 4e 45 3a 0a 09 20 20 20 20 2f 2a 20 54 68 65 20 NE:.. /* The
1650: 54 4c 53 2f 53 53 4c 20 49 2f 4f 20 6f 70 65 72 TLS/SSL I/O oper
1660: 61 74 69 6f 6e 20 63 6f 6d 70 6c 65 74 65 64 20 ation completed
1670: 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 */.. dprintf(
1680: 22 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 "The connection
1690: 69 73 20 67 6f 6f 64 22 29 3b 0a 09 20 20 20 20 is good");..
16a0: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 *errorCodePtr =
16b0: 30 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 0;.. break;..
16c0: 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f .case SSL_ERROR_
16d0: 5a 45 52 4f 5f 52 45 54 55 52 4e 3a 0a 09 20 20 ZERO_RETURN:..
16e0: 20 20 2f 2a 20 54 68 65 20 54 4c 53 2f 53 53 4c /* The TLS/SSL
16f0: 20 70 65 65 72 20 68 61 73 20 63 6c 6f 73 65 64 peer has closed
1700: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 the connection
1710: 66 6f 72 20 77 72 69 74 69 6e 67 20 62 79 20 73 for writing by s
1720: 65 6e 64 69 6e 67 20 74 68 65 20 63 6c 6f 73 65 ending the close
1730: 5f 6e 6f 74 69 66 79 20 61 6c 65 72 74 20 2a 2f _notify alert */
1740: 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 53 .. dprintf("S
1750: 53 4c 5f 45 52 52 4f 52 5f 5a 45 52 4f 5f 52 45 SL_ERROR_ZERO_RE
1760: 54 55 52 4e 3a 20 43 6f 6e 6e 65 63 74 20 72 65 TURN: Connect re
1770: 74 75 72 6e 65 64 20 61 6e 20 69 6e 76 61 6c 69 turned an invali
1780: 64 20 76 61 6c 75 65 2e 2e 2e 22 29 3b 0a 09 20 d value...");..
1790: 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 *errorCodePtr
17a0: 20 3d 20 45 49 4e 56 41 4c 3b 0a 09 20 20 20 20 = EINVAL;..
17b0: 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 Tls_Error(stateP
17c0: 74 72 2c 20 22 50 65 65 72 20 68 61 73 20 63 6c tr, "Peer has cl
17d0: 6f 73 65 64 20 74 68 65 20 63 6f 6e 6e 65 63 74 osed the connect
17e0: 69 6f 6e 20 66 6f 72 20 77 72 69 74 69 6e 67 20 ion for writing
17f0: 62 79 20 73 65 6e 64 69 6e 67 20 74 68 65 20 63 by sending the c
1800: 6c 6f 73 65 5f 6e 6f 74 69 66 79 20 61 6c 65 72 lose_notify aler
1810: 74 22 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e t");.. return
1820: 28 2d 31 29 3b 0a 0a 09 63 61 73 65 20 53 53 4c (-1);...case SSL
1830: 5f 45 52 52 4f 52 5f 53 59 53 43 41 4c 4c 3a 0a _ERROR_SYSCALL:.
1840: 09 20 20 20 20 2f 2a 20 53 6f 6d 65 20 6e 6f 6e . /* Some non
1850: 2d 72 65 63 6f 76 65 72 61 62 6c 65 2c 20 66 61 -recoverable, fa
1860: 74 61 6c 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 tal I/O error oc
1870: 63 75 72 72 65 64 20 2a 2f 0a 09 20 20 20 20 64 curred */.. d
1880: 70 72 69 6e 74 66 28 22 53 53 4c 5f 45 52 52 4f printf("SSL_ERRO
1890: 52 5f 53 59 53 43 41 4c 4c 22 29 3b 0a 09 20 20 R_SYSCALL");..
18a0: 20 20 69 66 20 28 62 61 63 6b 69 6e 67 45 72 72 if (backingErr
18b0: 6f 72 20 3d 3d 20 30 20 26 26 20 65 72 72 20 3d or == 0 && err =
18c0: 3d 20 30 29 20 7b 0a 09 09 64 70 72 69 6e 74 66 = 0) {...dprintf
18d0: 28 22 45 4f 46 20 72 65 61 63 68 65 64 22 29 0a ("EOF reached").
18e0: 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 ..*errorCodePtr
18f0: 3d 20 45 43 4f 4e 4e 52 45 53 45 54 3b 0a 09 09 = ECONNRESET;...
1900: 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 Tls_Error(stateP
1910: 74 72 2c 20 22 28 75 6e 65 78 70 65 63 74 65 64 tr, "(unexpected
1920: 29 20 45 4f 46 20 72 65 61 63 68 65 64 22 29 3b ) EOF reached");
1930: 0a 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 ... } else if
1940: 20 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 20 3d (backingError =
1950: 3d 20 30 20 26 26 20 65 72 72 20 3d 3d 20 2d 31 = 0 && err == -1
1960: 29 20 7b 0a 09 09 64 70 72 69 6e 74 66 28 22 49 ) {...dprintf("I
1970: 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 /O error occurre
1980: 64 20 28 65 72 72 6e 6f 20 3d 20 25 6c 75 29 22 d (errno = %lu)"
1990: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 , (unsigned long
19a0: 29 20 54 63 6c 5f 47 65 74 45 72 72 6e 6f 28 29 ) Tcl_GetErrno()
19b0: 29 3b 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 );...*errorCodeP
19c0: 74 72 20 3d 20 54 63 6c 5f 47 65 74 45 72 72 6e tr = Tcl_GetErrn
19d0: 6f 28 29 3b 0a 09 09 69 66 20 28 2a 65 72 72 6f o();...if (*erro
19e0: 72 43 6f 64 65 50 74 72 20 3d 3d 20 45 43 4f 4e rCodePtr == ECON
19f0: 4e 52 45 53 45 54 29 20 7b 0a 09 09 20 20 20 20 NRESET) {...
1a00: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 *errorCodePtr =
1a10: 45 43 4f 4e 4e 41 42 4f 52 54 45 44 3b 0a 09 09 ECONNABORTED;...
1a20: 7d 0a 09 09 54 6c 73 5f 45 72 72 6f 72 28 73 74 }...Tls_Error(st
1a30: 61 74 65 50 74 72 2c 20 28 63 68 61 72 20 2a 29 atePtr, (char *)
1a40: 20 54 63 6c 5f 45 72 72 6e 6f 4d 73 67 28 54 63 Tcl_ErrnoMsg(Tc
1a50: 6c 5f 47 65 74 45 72 72 6e 6f 28 29 29 29 3b 0a l_GetErrno()));.
1a60: 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 .. } else {..
1a70: 09 64 70 72 69 6e 74 66 28 22 49 2f 4f 20 65 72 .dprintf("I/O er
1a80: 72 6f 72 20 6f 63 63 75 72 72 65 64 20 28 62 61 ror occurred (ba
1a90: 63 6b 69 6e 67 45 72 72 6f 72 20 3d 20 25 6c 75 ckingError = %lu
1aa0: 29 22 2c 20 62 61 63 6b 69 6e 67 45 72 72 6f 72 )", backingError
1ab0: 29 3b 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 );...*errorCodeP
1ac0: 74 72 20 3d 20 62 61 63 6b 69 6e 67 45 72 72 6f tr = backingErro
1ad0: 72 3b 0a 09 09 69 66 20 28 2a 65 72 72 6f 72 43 r;...if (*errorC
1ae0: 6f 64 65 50 74 72 20 3d 3d 20 45 43 4f 4e 4e 52 odePtr == ECONNR
1af0: 45 53 45 54 29 20 7b 0a 09 09 20 20 20 20 2a 65 ESET) {... *e
1b00: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 43 rrorCodePtr = EC
1b10: 4f 4e 4e 41 42 4f 52 54 45 44 3b 0a 09 09 7d 0a ONNABORTED;...}.
1b20: 09 09 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 ..Tls_Error(stat
1b30: 65 50 74 72 2c 20 28 63 68 61 72 20 2a 29 20 45 ePtr, (char *) E
1b40: 52 52 5f 72 65 61 73 6f 6e 5f 65 72 72 6f 72 5f RR_reason_error_
1b50: 73 74 72 69 6e 67 28 62 61 63 6b 69 6e 67 45 72 string(backingEr
1b60: 72 6f 72 29 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 ror));.. }...
1b70: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 66 6c statePtr->fl
1b80: 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 48 ags |= TLS_TCL_H
1b90: 41 4e 44 53 48 41 4b 45 5f 46 41 49 4c 45 44 3b ANDSHAKE_FAILED;
1ba0: 0a 09 20 20 20 20 72 65 74 75 72 6e 28 2d 31 29 .. return(-1)
1bb0: 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52 ;...case SSL_ERR
1bc0: 4f 52 5f 53 53 4c 3a 0a 09 20 20 20 20 2f 2a 20 OR_SSL:.. /*
1bd0: 41 20 6e 6f 6e 2d 72 65 63 6f 76 65 72 61 62 6c A non-recoverabl
1be0: 65 2c 20 66 61 74 61 6c 20 65 72 72 6f 72 20 69 e, fatal error i
1bf0: 6e 20 74 68 65 20 53 53 4c 20 6c 69 62 72 61 72 n the SSL librar
1c00: 79 20 6f 63 63 75 72 72 65 64 2c 20 75 73 75 61 y occurred, usua
1c10: 6c 6c 79 20 61 20 70 72 6f 74 6f 63 6f 6c 20 65 lly a protocol e
1c20: 72 72 6f 72 20 2a 2f 0a 09 20 20 20 20 64 70 72 rror */.. dpr
1c30: 69 6e 74 66 28 22 53 53 4c 5f 45 52 52 4f 52 5f intf("SSL_ERROR_
1c40: 53 53 4c 3a 20 47 6f 74 20 70 65 72 6d 61 6e 65 SSL: Got permane
1c50: 6e 74 20 66 61 74 61 6c 20 53 53 4c 20 65 72 72 nt fatal SSL err
1c60: 6f 72 2c 20 61 62 6f 72 74 69 6e 67 20 69 6d 6d or, aborting imm
1c70: 65 64 69 61 74 65 6c 79 22 29 3b 0a 09 20 20 20 ediately");..
1c80: 20 69 66 20 28 62 61 63 6b 69 6e 67 45 72 72 6f if (backingErro
1c90: 72 20 21 3d 20 30 29 20 7b 0a 09 09 54 6c 73 5f r != 0) {...Tls_
1ca0: 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20 Error(statePtr,
1cb0: 28 63 68 61 72 20 2a 29 20 45 52 52 5f 72 65 61 (char *) ERR_rea
1cc0: 73 6f 6e 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 son_error_string
1cd0: 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 29 29 3b (backingError));
1ce0: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 69 66 20 .. }.. if
1cf0: 28 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f (SSL_get_verify_
1d00: 72 65 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d result(statePtr-
1d10: 3e 73 73 6c 29 20 21 3d 20 58 35 30 39 5f 56 5f >ssl) != X509_V_
1d20: 4f 4b 29 20 7b 0a 09 09 54 6c 73 5f 45 72 72 6f OK) {...Tls_Erro
1d30: 72 28 73 74 61 74 65 50 74 72 2c 20 28 63 68 61 r(statePtr, (cha
1d40: 72 20 2a 29 20 58 35 30 39 5f 76 65 72 69 66 79 r *) X509_verify
1d50: 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 _cert_error_stri
1d60: 6e 67 28 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 ng(SSL_get_verif
1d70: 79 5f 72 65 73 75 6c 74 28 73 74 61 74 65 50 74 y_result(statePt
1d80: 72 2d 3e 73 73 6c 29 29 29 3b 0a 09 20 20 20 20 r->ssl)));..
1d90: 7d 0a 09 20 20 20 20 73 74 61 74 65 50 74 72 2d }.. statePtr-
1da0: 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 >flags |= TLS_TC
1db0: 4c 5f 48 41 4e 44 53 48 41 4b 45 5f 46 41 49 4c L_HANDSHAKE_FAIL
1dc0: 45 44 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 ED;.. *errorC
1dd0: 6f 64 65 50 74 72 20 3d 20 45 43 4f 4e 4e 41 42 odePtr = ECONNAB
1de0: 4f 52 54 45 44 3b 0a 09 20 20 20 20 72 65 74 75 ORTED;.. retu
1df0: 72 6e 28 2d 31 29 3b 0a 0a 09 63 61 73 65 20 53 rn(-1);...case S
1e00: 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 52 45 SL_ERROR_WANT_RE
1e10: 41 44 3a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 AD:..case SSL_ER
1e20: 52 4f 52 5f 57 41 4e 54 5f 57 52 49 54 45 3a 0a ROR_WANT_WRITE:.
1e30: 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f .case SSL_ERROR_
1e40: 57 41 4e 54 5f 58 35 30 39 5f 4c 4f 4f 4b 55 50 WANT_X509_LOOKUP
1e50: 3a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f :..case SSL_ERRO
1e60: 52 5f 57 41 4e 54 5f 43 4f 4e 4e 45 43 54 3a 0a R_WANT_CONNECT:.
1e70: 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f .case SSL_ERROR_
1e80: 57 41 4e 54 5f 41 43 43 45 50 54 3a 0a 09 63 61 WANT_ACCEPT:..ca
1e90: 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e se SSL_ERROR_WAN
1ea0: 54 5f 41 53 59 4e 43 3a 0a 09 63 61 73 65 20 53 T_ASYNC:..case S
1eb0: 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 41 53 SL_ERROR_WANT_AS
1ec0: 59 4e 43 5f 4a 4f 42 3a 0a 09 63 61 73 65 20 53 YNC_JOB:..case S
1ed0: 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 43 4c SL_ERROR_WANT_CL
1ee0: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 43 42 3a 0a 09 IENT_HELLO_CB:..
1ef0: 64 65 66 61 75 6c 74 3a 0a 09 20 20 20 20 2f 2a default:.. /*
1f00: 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 64 The operation d
1f10: 69 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 id not complete
1f20: 61 6e 64 20 73 68 6f 75 6c 64 20 62 65 20 72 65 and should be re
1f30: 74 72 69 65 64 20 6c 61 74 65 72 2e 20 2a 2f 0a tried later. */.
1f40: 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 4f 70 . dprintf("Op
1f50: 65 72 61 74 69 6f 6e 20 64 69 64 20 6e 6f 74 20 eration did not
1f60: 63 6f 6d 70 6c 65 74 65 2c 20 63 61 6c 6c 20 66 complete, call f
1f70: 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 20 6c 61 unction again la
1f80: 74 65 72 3a 20 25 69 22 2c 20 72 63 29 3b 0a 09 ter: %i", rc);..
1f90: 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 *errorCodePt
1fa0: 72 20 3d 20 45 41 47 41 49 4e 3b 0a 09 20 20 20 r = EAGAIN;..
1fb0: 20 64 70 72 69 6e 74 66 28 22 45 52 52 28 25 64 dprintf("ERR(%d
1fc0: 2c 20 25 64 29 20 22 2c 20 72 63 2c 20 2a 65 72 , %d) ", rc, *er
1fd0: 72 6f 72 43 6f 64 65 50 74 72 29 3b 0a 09 20 20 rorCodePtr);..
1fe0: 20 20 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 Tls_Error(stat
1ff0: 65 50 74 72 2c 20 22 4f 70 65 72 61 74 69 6f 6e ePtr, "Operation
2000: 20 64 69 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 did not complet
2010: 65 2c 20 63 61 6c 6c 20 66 75 6e 63 74 69 6f 6e e, call function
2020: 20 61 67 61 69 6e 20 6c 61 74 65 72 22 29 3b 0a again later");.
2030: 09 20 20 20 20 72 65 74 75 72 6e 28 2d 31 29 3b . return(-1);
2040: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 . }.. dpri
2050: 6e 74 66 28 22 52 65 6d 6f 76 69 6e 67 20 74 68 ntf("Removing th
2060: 65 20 5c 22 54 4c 53 5f 54 43 4c 5f 49 4e 49 54 e \"TLS_TCL_INIT
2070: 5c 22 20 66 6c 61 67 20 73 69 6e 63 65 20 77 65 \" flag since we
2080: 20 68 61 76 65 20 63 6f 6d 70 6c 65 74 65 64 20 have completed
2090: 74 68 65 20 68 61 6e 64 73 68 61 6b 65 22 29 3b the handshake");
20a0: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 66 . statePtr->f
20b0: 6c 61 67 73 20 26 3d 20 7e 54 4c 53 5f 54 43 4c lags &= ~TLS_TCL
20c0: 5f 49 4e 49 54 3b 0a 0a 20 20 20 20 64 70 72 69 _INIT;.. dpri
20d0: 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20 69 ntf("Returning i
20e0: 6e 20 73 75 63 63 65 73 73 22 29 3b 0a 20 20 20 n success");.
20f0: 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d *errorCodePtr =
2100: 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 30 0;. return(0
2110: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d );.}../*. *-----
2120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
2160: 2a 0a 20 2a 20 54 6c 73 49 6e 70 75 74 50 72 6f *. * TlsInputPro
2170: 63 20 2d 2d 0a 20 2a 0a 20 2a 20 20 20 20 54 68 c --. *. * Th
2180: 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 is procedure is
2190: 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20 67 invoked by the g
21a0: 65 6e 65 72 69 63 20 49 4f 20 6c 65 76 65 6c 0a eneric IO level.
21b0: 20 2a 20 20 20 20 20 20 20 74 6f 20 72 65 61 64 * to read
21c0: 20 69 6e 70 75 74 20 66 72 6f 6d 20 61 20 53 53 input from a SS
21d0: 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63 L socket based c
21e0: 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 52 65 hannel.. *. * Re
21f0: 73 75 6c 74 73 3a 0a 20 2a 20 20 20 20 52 65 74 sults:. * Ret
2200: 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 urns the number
2210: 6f 66 20 62 79 74 65 73 20 72 65 61 64 20 6f 72 of bytes read or
2220: 20 2d 31 20 6f 6e 20 65 72 72 6f 72 2e 20 53 65 -1 on error. Se
2230: 74 73 20 65 72 72 6f 72 43 6f 64 65 50 74 72 0a ts errorCodePtr.
2240: 20 2a 20 20 20 20 74 6f 20 61 20 50 4f 53 49 58 * to a POSIX
2250: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 error code if a
2260: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 n error occurred
2270: 2c 20 6f 72 20 30 20 69 66 20 6e 6f 6e 65 2e 0a , or 0 if none..
2280: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
2290: 74 73 3a 0a 20 2a 20 20 20 20 52 65 61 64 73 20 ts:. * Reads
22a0: 69 6e 70 75 74 20 66 72 6f 6d 20 74 68 65 20 69 input from the i
22b0: 6e 70 75 74 20 64 65 76 69 63 65 20 6f 66 20 74 nput device of t
22c0: 68 65 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 he channel.. *.
22d0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
22e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
22f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2310: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
2320: 69 6e 74 20 54 6c 73 49 6e 70 75 74 50 72 6f 63 int TlsInputProc
2330: 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 (ClientData inst
2340: 61 6e 63 65 44 61 74 61 2c 20 63 68 61 72 20 2a anceData, char *
2350: 62 75 66 2c 20 69 6e 74 20 62 75 66 53 69 7a 65 buf, int bufSize
2360: 2c 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 , int *errorCode
2370: 50 74 72 29 20 7b 0a 20 20 20 20 75 6e 73 69 67 Ptr) {. unsig
2380: 6e 65 64 20 6c 6f 6e 67 20 62 61 63 6b 69 6e 67 ned long backing
2390: 45 72 72 6f 72 3b 0a 20 20 20 20 53 74 61 74 65 Error;. State
23a0: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 *statePtr = (St
23b0: 61 74 65 20 2a 29 20 69 6e 73 74 61 6e 63 65 44 ate *) instanceD
23c0: 61 74 61 3b 0a 20 20 20 20 69 6e 74 20 62 79 74 ata;. int byt
23d0: 65 73 52 65 61 64 3b 0a 20 20 20 20 69 6e 74 20 esRead;. int
23e0: 74 6c 73 43 6f 6e 6e 65 63 74 3b 0a 20 20 20 20 tlsConnect;.
23f0: 69 6e 74 20 65 72 72 3b 0a 0a 20 20 20 20 2a 65 int err;.. *e
2400: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 30 3b rrorCodePtr = 0;
2410: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 42 .. dprintf("B
2420: 49 4f 5f 72 65 61 64 28 25 64 29 22 2c 20 62 75 IO_read(%d)", bu
2430: 66 53 69 7a 65 29 3b 0a 0a 20 20 20 20 69 66 20 fSize);.. if
2440: 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 (statePtr->flags
2450: 20 26 20 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 & TLS_TCL_CALLB
2460: 41 43 4b 29 20 7b 0a 09 2f 2a 20 64 6f 6e 27 74 ACK) {../* don't
2470: 20 70 72 6f 63 65 73 73 20 61 6e 79 20 62 79 74 process any byt
2480: 65 73 20 77 68 69 6c 65 20 76 65 72 69 66 79 20 es while verify
2490: 63 61 6c 6c 62 61 63 6b 20 69 73 20 72 75 6e 6e callback is runn
24a0: 69 6e 67 20 2a 2f 0a 09 64 70 72 69 6e 74 66 28 ing */..dprintf(
24b0: 22 43 61 6c 6c 62 61 63 6b 20 69 73 20 72 75 6e "Callback is run
24c0: 6e 69 6e 67 2c 20 72 65 61 64 69 6e 67 20 30 20 ning, reading 0
24d0: 62 79 74 65 73 22 29 3b 0a 09 72 65 74 75 72 6e bytes");..return
24e0: 28 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 (0);. }..
24f0: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 69 6e 67 dprintf("Calling
2500: 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e Tls_WaitForConn
2510: 65 63 74 22 29 3b 0a 20 20 20 20 74 6c 73 43 6f ect");. tlsCo
2520: 6e 6e 65 63 74 20 3d 20 54 6c 73 5f 57 61 69 74 nnect = Tls_Wait
2530: 46 6f 72 43 6f 6e 6e 65 63 74 28 73 74 61 74 65 ForConnect(state
2540: 50 74 72 2c 20 65 72 72 6f 72 43 6f 64 65 50 74 Ptr, errorCodePt
2550: 72 2c 20 30 29 3b 0a 20 20 20 20 69 66 20 28 74 r, 0);. if (t
2560: 6c 73 43 6f 6e 6e 65 63 74 20 3c 20 30 29 20 7b lsConnect < 0) {
2570: 0a 09 64 70 72 69 6e 74 66 28 22 47 6f 74 20 61 ..dprintf("Got a
2580: 6e 20 65 72 72 6f 72 20 77 61 69 74 69 6e 67 20 n error waiting
2590: 74 6f 20 63 6f 6e 6e 65 63 74 20 28 74 6c 73 43 to connect (tlsC
25a0: 6f 6e 6e 65 63 74 20 3d 20 25 69 2c 20 2a 65 72 onnect = %i, *er
25b0: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 25 69 29 rorCodePtr = %i)
25c0: 22 2c 20 74 6c 73 43 6f 6e 6e 65 63 74 2c 20 2a ", tlsConnect, *
25d0: 65 72 72 6f 72 43 6f 64 65 50 74 72 29 3b 0a 09 errorCodePtr);..
25e0: 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 Tls_Error(stateP
25f0: 74 72 2c 20 73 74 72 65 72 72 6f 72 28 2a 65 72 tr, strerror(*er
2600: 72 6f 72 43 6f 64 65 50 74 72 29 29 3b 0a 0a 09 rorCodePtr));...
2610: 62 79 74 65 73 52 65 61 64 20 3d 20 2d 31 3b 0a bytesRead = -1;.
2620: 09 69 66 20 28 2a 65 72 72 6f 72 43 6f 64 65 50 .if (*errorCodeP
2630: 74 72 20 3d 3d 20 45 43 4f 4e 4e 52 45 53 45 54 tr == ECONNRESET
2640: 29 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 ) {.. dprintf
2650: 28 22 47 6f 74 20 63 6f 6e 6e 65 63 74 69 6f 6e ("Got connection
2660: 20 72 65 73 65 74 22 29 3b 0a 09 20 20 20 20 2f reset");.. /
2670: 2a 20 53 6f 66 74 20 45 4f 46 20 2a 2f 0a 09 20 * Soft EOF */..
2680: 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 *errorCodePtr
2690: 20 3d 20 30 3b 0a 09 20 20 20 20 62 79 74 65 73 = 0;.. bytes
26a0: 52 65 61 64 20 3d 20 30 3b 0a 09 7d 0a 09 72 65 Read = 0;..}..re
26b0: 74 75 72 6e 28 62 79 74 65 73 52 65 61 64 29 3b turn(bytesRead);
26c0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 . }.. /*.
26d0: 20 20 20 20 2a 20 57 65 20 6e 65 65 64 20 74 6f * We need to
26e0: 20 63 6c 65 61 72 20 74 68 65 20 53 53 4c 20 65 clear the SSL e
26f0: 72 72 6f 72 20 73 74 61 63 6b 20 6e 6f 77 20 62 rror stack now b
2700: 65 63 61 75 73 65 20 77 65 20 73 6f 6d 65 74 69 ecause we someti
2710: 6d 65 73 20 72 65 61 63 68 0a 20 20 20 20 20 2a mes reach. *
2720: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 this function w
2730: 69 74 68 20 6c 65 66 74 6f 76 65 72 20 65 72 72 ith leftover err
2740: 6f 72 73 20 69 6e 20 74 68 65 20 73 74 61 63 6b ors in the stack
2750: 2e 20 20 49 66 20 42 49 4f 5f 72 65 61 64 0a 20 . If BIO_read.
2760: 20 20 20 20 2a 20 72 65 74 75 72 6e 73 20 2d 31 * returns -1
2770: 20 61 6e 64 20 69 6e 74 65 6e 64 73 20 45 41 47 and intends EAG
2780: 41 49 4e 2c 20 74 68 65 72 65 20 69 73 20 61 20 AIN, there is a
2790: 6c 65 66 74 6f 76 65 72 20 65 72 72 6f 72 2c 20 leftover error,
27a0: 69 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 it will be.
27b0: 2a 20 6d 69 73 63 6f 6e 73 74 72 75 65 64 20 61 * misconstrued a
27c0: 73 20 61 6e 20 65 72 72 6f 72 2c 20 6e 6f 74 20 s an error, not
27d0: 45 41 47 41 49 4e 2e 0a 20 20 20 20 20 2a 0a 20 EAGAIN.. *.
27e0: 20 20 20 20 2a 20 41 6c 74 65 72 6e 61 74 69 76 * Alternativ
27f0: 65 6c 79 2c 20 77 65 20 6d 61 79 20 77 61 6e 74 ely, we may want
2800: 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 3c to handle the <
2810: 30 20 72 65 74 75 72 6e 20 63 6f 64 65 73 20 66 0 return codes f
2820: 72 6f 6d 0a 20 20 20 20 20 2a 20 42 49 4f 5f 72 rom. * BIO_r
2830: 65 61 64 20 73 70 65 63 69 61 6c 6c 79 20 28 61 ead specially (a
2840: 73 20 61 64 76 69 73 65 64 20 69 6e 20 74 68 65 s advised in the
2850: 20 52 53 41 20 64 6f 63 73 29 2e 20 20 54 4c 53 RSA docs). TLS
2860: 27 73 20 6c 6f 77 65 72 20 6c 65 76 65 6c 20 42 's lower level B
2870: 49 4f 0a 20 20 20 20 20 2a 20 66 75 6e 63 74 69 IO. * functi
2880: 6f 6e 73 20 70 6c 61 79 20 77 69 74 68 20 74 68 ons play with th
2890: 65 20 72 65 74 72 79 20 66 6c 61 67 73 20 74 68 e retry flags th
28a0: 6f 75 67 68 2c 20 61 6e 64 20 74 68 69 73 20 73 ough, and this s
28b0: 65 65 6d 73 20 74 6f 20 77 6f 72 6b 0a 20 20 20 eems to work.
28c0: 20 20 2a 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 * correctly.
28d0: 53 69 6d 69 6c 61 72 20 66 69 78 20 69 6e 20 54 Similar fix in T
28e0: 6c 73 4f 75 74 70 75 74 50 72 6f 63 2e 20 2d 20 lsOutputProc. -
28f0: 68 6f 62 62 73 0a 20 20 20 20 20 2a 2f 0a 20 20 hobbs. */.
2900: 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f ERR_clear_erro
2910: 72 28 29 3b 0a 20 20 20 20 62 79 74 65 73 52 65 r();. bytesRe
2920: 61 64 20 3d 20 42 49 4f 5f 72 65 61 64 28 73 74 ad = BIO_read(st
2930: 61 74 65 50 74 72 2d 3e 62 69 6f 2c 20 62 75 66 atePtr->bio, buf
2940: 2c 20 62 75 66 53 69 7a 65 29 3b 0a 20 20 20 20 , bufSize);.
2950: 64 70 72 69 6e 74 66 28 22 42 49 4f 5f 72 65 61 dprintf("BIO_rea
2960: 64 20 2d 3e 20 25 64 22 2c 20 62 79 74 65 73 52 d -> %d", bytesR
2970: 65 61 64 29 3b 0a 0a 20 20 20 20 65 72 72 20 3d ead);.. err =
2980: 20 53 53 4c 5f 67 65 74 5f 65 72 72 6f 72 28 73 SSL_get_error(s
2990: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 62 79 tatePtr->ssl, by
29a0: 74 65 73 52 65 61 64 29 3b 0a 20 20 20 20 62 61 tesRead);. ba
29b0: 63 6b 69 6e 67 45 72 72 6f 72 20 3d 20 45 52 52 ckingError = ERR
29c0: 5f 67 65 74 5f 65 72 72 6f 72 28 29 3b 0a 0a 23 _get_error();..#
29d0: 69 66 20 30 0a 20 20 20 20 69 66 20 28 62 79 74 if 0. if (byt
29e0: 65 73 52 65 61 64 20 3c 3d 20 30 29 20 7b 0a 09 esRead <= 0) {..
29f0: 69 66 20 28 42 49 4f 5f 73 68 6f 75 6c 64 5f 72 if (BIO_should_r
2a00: 65 74 72 79 28 73 74 61 74 65 50 74 72 2d 3e 62 etry(statePtr->b
2a10: 69 6f 29 29 20 7b 0a 09 20 20 20 20 64 70 72 69 io)) {.. dpri
2a20: 6e 74 66 28 22 49 2f 4f 20 66 61 69 6c 65 64 2c ntf("I/O failed,
2a30: 20 77 69 6c 6c 20 72 65 74 72 79 20 62 61 73 65 will retry base
2a40: 64 20 6f 6e 20 45 41 47 41 49 4e 22 29 3b 0a 09 d on EAGAIN");..
2a50: 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 *errorCodePt
2a60: 72 20 3d 20 45 41 47 41 49 4e 3b 0a 09 7d 0a 20 r = EAGAIN;..}.
2a70: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 }.#endif..
2a80: 20 73 77 69 74 63 68 20 28 65 72 72 29 20 7b 0a switch (err) {.
2a90: 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f .case SSL_ERROR_
2aa0: 4e 4f 4e 45 3a 0a 09 20 20 20 20 64 70 72 69 6e NONE:.. dprin
2ab0: 74 42 75 66 66 65 72 28 62 75 66 2c 20 62 79 74 tBuffer(buf, byt
2ac0: 65 73 52 65 61 64 29 3b 0a 09 20 20 20 20 62 72 esRead);.. br
2ad0: 65 61 6b 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f eak;...case SSL_
2ae0: 45 52 52 4f 52 5f 53 53 4c 3a 0a 09 20 20 20 20 ERROR_SSL:..
2af0: 2f 2a 20 41 20 6e 6f 6e 2d 72 65 63 6f 76 65 72 /* A non-recover
2b00: 61 62 6c 65 2c 20 66 61 74 61 6c 20 65 72 72 6f able, fatal erro
2b10: 72 20 69 6e 20 74 68 65 20 53 53 4c 20 6c 69 62 r in the SSL lib
2b20: 72 61 72 79 20 6f 63 63 75 72 72 65 64 2c 20 75 rary occurred, u
2b30: 73 75 61 6c 6c 79 20 61 20 70 72 6f 74 6f 63 6f sually a protoco
2b40: 6c 20 65 72 72 6f 72 20 2a 2f 0a 09 20 20 20 20 l error */..
2b50: 64 70 72 69 6e 74 66 28 22 53 53 4c 20 65 72 72 dprintf("SSL err
2b60: 6f 72 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 or, indicating t
2b70: 68 61 74 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 hat the connecti
2b80: 6f 6e 20 68 61 73 20 62 65 65 6e 20 61 62 6f 72 on has been abor
2b90: 74 65 64 22 29 3b 0a 09 20 20 20 20 69 66 20 28 ted");.. if (
2ba0: 62 61 63 6b 69 6e 67 45 72 72 6f 72 20 21 3d 20 backingError !=
2bb0: 30 29 20 7b 0a 09 09 54 6c 73 5f 45 72 72 6f 72 0) {...Tls_Error
2bc0: 28 73 74 61 74 65 50 74 72 2c 20 28 63 68 61 72 (statePtr, (char
2bd0: 20 2a 29 20 45 52 52 5f 72 65 61 73 6f 6e 5f 65 *) ERR_reason_e
2be0: 72 72 6f 72 5f 73 74 72 69 6e 67 28 62 61 63 6b rror_string(back
2bf0: 69 6e 67 45 72 72 6f 72 29 29 3b 0a 09 20 20 20 ingError));..
2c00: 20 7d 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f }.. *errorCo
2c10: 64 65 50 74 72 20 3d 20 45 43 4f 4e 4e 41 42 4f dePtr = ECONNABO
2c20: 52 54 45 44 3b 0a 09 20 20 20 20 62 79 74 65 73 RTED;.. bytes
2c30: 52 65 61 64 20 3d 20 2d 31 3b 0a 0a 23 69 66 20 Read = -1;..#if
2c40: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f OPENSSL_VERSION_
2c50: 4e 55 4d 42 45 52 20 3e 3d 20 30 78 33 30 30 30 NUMBER >= 0x3000
2c60: 30 30 30 30 4c 0a 09 20 20 20 20 2f 2a 20 55 6e 0000L.. /* Un
2c70: 65 78 70 65 63 74 65 64 20 45 4f 46 20 66 72 6f expected EOF fro
2c80: 6d 20 74 68 65 20 70 65 65 72 20 66 6f 72 20 4f m the peer for O
2c90: 70 65 6e 53 53 4c 20 33 2e 30 2b 20 2a 2f 0a 09 penSSL 3.0+ */..
2ca0: 20 20 20 20 69 66 20 28 45 52 52 5f 47 45 54 5f if (ERR_GET_
2cb0: 52 45 41 53 4f 4e 28 62 61 63 6b 69 6e 67 45 72 REASON(backingEr
2cc0: 72 6f 72 29 20 3d 3d 20 53 53 4c 5f 52 5f 55 4e ror) == SSL_R_UN
2cd0: 45 58 50 45 43 54 45 44 5f 45 4f 46 5f 57 48 49 EXPECTED_EOF_WHI
2ce0: 4c 45 5f 52 45 41 44 49 4e 47 29 20 7b 0a 09 09 LE_READING) {...
2cf0: 64 70 72 69 6e 74 66 28 22 28 55 6e 65 78 70 65 dprintf("(Unexpe
2d00: 63 74 65 64 29 20 45 4f 46 20 72 65 61 63 68 65 cted) EOF reache
2d10: 64 22 29 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65 d")...*errorCode
2d20: 50 74 72 20 3d 20 30 3b 0a 09 09 62 79 74 65 73 Ptr = 0;...bytes
2d30: 52 65 61 64 20 3d 20 30 3b 0a 09 09 54 6c 73 5f Read = 0;...Tls_
2d40: 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20 Error(statePtr,
2d50: 22 45 4f 46 20 72 65 61 63 68 65 64 22 29 3b 0a "EOF reached");.
2d60: 09 20 20 20 20 7d 20 20 20 20 0a 23 65 6e 64 69 . } .#endi
2d70: 66 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 f.. break;...
2d80: 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 53 case SSL_ERROR_S
2d90: 59 53 43 41 4c 4c 3a 0a 09 20 20 20 20 2f 2a 20 YSCALL:.. /*
2da0: 53 6f 6d 65 20 6e 6f 6e 2d 72 65 63 6f 76 65 72 Some non-recover
2db0: 61 62 6c 65 2c 20 66 61 74 61 6c 20 49 2f 4f 20 able, fatal I/O
2dc0: 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 2a error occurred *
2dd0: 2f 0a 09 20 20 20 20 69 66 20 28 62 61 63 6b 69 /.. if (backi
2de0: 6e 67 45 72 72 6f 72 20 3d 3d 20 30 20 26 26 20 ngError == 0 &&
2df0: 62 79 74 65 73 52 65 61 64 20 3d 3d 20 30 29 20 bytesRead == 0)
2e00: 7b 0a 09 09 2f 2a 20 55 6e 65 78 70 65 63 74 65 {.../* Unexpecte
2e10: 64 20 45 4f 46 20 66 72 6f 6d 20 74 68 65 20 70 d EOF from the p
2e20: 65 65 72 20 66 6f 72 20 4f 70 65 6e 53 53 4c 20 eer for OpenSSL
2e30: 31 2e 31 20 2a 2f 0a 09 09 64 70 72 69 6e 74 66 1.1 */...dprintf
2e40: 28 22 28 55 6e 65 78 70 65 63 74 65 64 29 20 45 ("(Unexpected) E
2e50: 4f 46 20 72 65 61 63 68 65 64 22 29 0a 09 09 2a OF reached")...*
2e60: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 30 errorCodePtr = 0
2e70: 3b 0a 09 09 62 79 74 65 73 52 65 61 64 20 3d 20 ;...bytesRead =
2e80: 30 3b 0a 09 09 54 6c 73 5f 45 72 72 6f 72 28 73 0;...Tls_Error(s
2e90: 74 61 74 65 50 74 72 2c 20 22 45 4f 46 20 72 65 tatePtr, "EOF re
2ea0: 61 63 68 65 64 22 29 3b 0a 0a 09 20 20 20 20 7d ached");... }
2eb0: 20 65 6c 73 65 20 69 66 20 28 62 61 63 6b 69 6e else if (backin
2ec0: 67 45 72 72 6f 72 20 3d 3d 20 30 20 26 26 20 62 gError == 0 && b
2ed0: 79 74 65 73 52 65 61 64 20 3d 3d 20 2d 31 29 20 ytesRead == -1)
2ee0: 7b 0a 09 09 64 70 72 69 6e 74 66 28 22 49 2f 4f {...dprintf("I/O
2ef0: 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 error occurred
2f00: 28 65 72 72 6e 6f 20 3d 20 25 6c 75 29 22 2c 20 (errno = %lu)",
2f10: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
2f20: 54 63 6c 5f 47 65 74 45 72 72 6e 6f 28 29 29 3b Tcl_GetErrno());
2f30: 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 ...*errorCodePtr
2f40: 20 3d 20 54 63 6c 5f 47 65 74 45 72 72 6e 6f 28 = Tcl_GetErrno(
2f50: 29 3b 0a 09 09 62 79 74 65 73 52 65 61 64 20 3d );...bytesRead =
2f60: 20 2d 31 3b 0a 09 09 54 6c 73 5f 45 72 72 6f 72 -1;...Tls_Error
2f70: 28 73 74 61 74 65 50 74 72 2c 20 28 63 68 61 72 (statePtr, (char
2f80: 20 2a 29 20 54 63 6c 5f 45 72 72 6e 6f 4d 73 67 *) Tcl_ErrnoMsg
2f90: 28 54 63 6c 5f 47 65 74 45 72 72 6e 6f 28 29 29 (Tcl_GetErrno())
2fa0: 29 3b 0a 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 );... } else
2fb0: 7b 0a 09 09 64 70 72 69 6e 74 66 28 22 49 2f 4f {...dprintf("I/O
2fc0: 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 error occurred
2fd0: 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 20 3d 20 (backingError =
2fe0: 25 6c 75 29 22 2c 20 62 61 63 6b 69 6e 67 45 72 %lu)", backingEr
2ff0: 72 6f 72 29 3b 0a 09 09 2a 65 72 72 6f 72 43 6f ror);...*errorCo
3000: 64 65 50 74 72 20 3d 20 62 61 63 6b 69 6e 67 45 dePtr = backingE
3010: 72 72 6f 72 3b 0a 09 09 62 79 74 65 73 52 65 61 rror;...bytesRea
3020: 64 20 3d 20 2d 31 3b 0a 09 09 54 6c 73 5f 45 72 d = -1;...Tls_Er
3030: 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20 28 63 ror(statePtr, (c
3040: 68 61 72 20 2a 29 20 45 52 52 5f 72 65 61 73 6f har *) ERR_reaso
3050: 6e 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 62 n_error_string(b
3060: 61 63 6b 69 6e 67 45 72 72 6f 72 29 29 3b 0a 09 ackingError));..
3070: 20 20 20 20 7d 0a 09 20 20 20 20 62 72 65 61 6b }.. break
3080: 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52 ;...case SSL_ERR
3090: 4f 52 5f 5a 45 52 4f 5f 52 45 54 55 52 4e 3a 0a OR_ZERO_RETURN:.
30a0: 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 47 6f . dprintf("Go
30b0: 74 20 53 53 4c 5f 45 52 52 4f 52 5f 5a 45 52 4f t SSL_ERROR_ZERO
30c0: 5f 52 45 54 55 52 4e 2c 20 74 68 69 73 20 6d 65 _RETURN, this me
30d0: 61 6e 73 20 61 6e 20 45 4f 46 20 68 61 73 20 62 ans an EOF has b
30e0: 65 65 6e 20 72 65 61 63 68 65 64 22 29 3b 0a 09 een reached");..
30f0: 20 20 20 20 62 79 74 65 73 52 65 61 64 20 3d 20 bytesRead =
3100: 30 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 0;.. *errorCo
3110: 64 65 50 74 72 20 3d 20 30 3b 0a 09 20 20 20 20 dePtr = 0;..
3120: 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 Tls_Error(stateP
3130: 74 72 2c 20 22 50 65 65 72 20 68 61 73 20 63 6c tr, "Peer has cl
3140: 6f 73 65 64 20 74 68 65 20 63 6f 6e 6e 65 63 74 osed the connect
3150: 69 6f 6e 20 66 6f 72 20 77 72 69 74 69 6e 67 20 ion for writing
3160: 62 79 20 73 65 6e 64 69 6e 67 20 74 68 65 20 63 by sending the c
3170: 6c 6f 73 65 5f 6e 6f 74 69 66 79 20 61 6c 65 72 lose_notify aler
3180: 74 22 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b t");.. break;
3190: 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f ...case SSL_ERRO
31a0: 52 5f 57 41 4e 54 5f 52 45 41 44 3a 0a 09 20 20 R_WANT_READ:..
31b0: 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20 53 dprintf("Got S
31c0: 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 52 45 SL_ERROR_WANT_RE
31d0: 41 44 2c 20 6d 61 70 70 69 6e 67 20 74 68 69 73 AD, mapping this
31e0: 20 74 6f 20 45 41 47 41 49 4e 22 29 3b 0a 09 20 to EAGAIN");..
31f0: 20 20 20 62 79 74 65 73 52 65 61 64 20 3d 20 2d bytesRead = -
3200: 31 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 1;.. *errorCo
3210: 64 65 50 74 72 20 3d 20 45 41 47 41 49 4e 3b 0a dePtr = EAGAIN;.
3220: 09 20 20 20 20 54 6c 73 5f 45 72 72 6f 72 28 73 . Tls_Error(s
3230: 74 61 74 65 50 74 72 2c 20 22 53 53 4c 5f 45 52 tatePtr, "SSL_ER
3240: 52 4f 52 5f 57 41 4e 54 5f 52 45 41 44 22 29 3b ROR_WANT_READ");
3250: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 64 .. break;...d
3260: 65 66 61 75 6c 74 3a 0a 09 20 20 20 20 64 70 72 efault:.. dpr
3270: 69 6e 74 66 28 22 55 6e 6b 6e 6f 77 6e 20 65 72 intf("Unknown er
3280: 72 6f 72 20 28 65 72 72 20 3d 20 25 69 29 2c 20 ror (err = %i),
3290: 6d 61 70 70 69 6e 67 20 74 6f 20 45 4f 46 22 2c mapping to EOF",
32a0: 20 65 72 72 29 3b 0a 09 20 20 20 20 2a 65 72 72 err);.. *err
32b0: 6f 72 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a 09 orCodePtr = 0;..
32c0: 20 20 20 20 62 79 74 65 73 52 65 61 64 20 3d 20 bytesRead =
32d0: 30 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 20 0;.. break;.
32e0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 2a 65 }.. if (*e
32f0: 72 72 6f 72 43 6f 64 65 50 74 72 20 3c 20 30 29 rrorCodePtr < 0)
3300: 20 7b 0a 09 54 6c 73 5f 45 72 72 6f 72 28 73 74 {..Tls_Error(st
3310: 61 74 65 50 74 72 2c 20 73 74 72 65 72 72 6f 72 atePtr, strerror
3320: 28 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29 29 (*errorCodePtr))
3330: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 70 72 69 ;. }. dpri
3340: 6e 74 66 28 22 49 6e 70 75 74 28 25 64 29 20 2d ntf("Input(%d) -
3350: 3e 20 25 64 20 5b 25 64 5d 22 2c 20 62 75 66 53 > %d [%d]", bufS
3360: 69 7a 65 2c 20 62 79 74 65 73 52 65 61 64 2c 20 ize, bytesRead,
3370: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29 3b 0a *errorCodePtr);.
3380: 20 20 20 20 72 65 74 75 72 6e 28 62 79 74 65 73 return(bytes
3390: 52 65 61 64 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d Read);.}../*. *-
33a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
33b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
33c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
33d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
33e0: 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 4f 75 74 70 --. *. * TlsOutp
33f0: 75 74 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 20 utProc --. *. *
3400: 20 20 20 54 68 69 73 20 70 72 6f 63 65 64 75 72 This procedur
3410: 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 20 e is invoked by
3420: 74 68 65 20 67 65 6e 65 72 69 63 20 49 4f 20 6c the generic IO l
3430: 65 76 65 6c 0a 20 2a 20 20 20 20 20 20 20 74 6f evel. * to
3440: 20 77 72 69 74 65 20 6f 75 74 70 75 74 20 74 6f write output to
3450: 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 a SSL socket ba
3460: 73 65 64 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a sed channel.. *.
3470: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 20 20 * Results:. *
3480: 20 20 52 65 74 75 72 6e 73 20 74 68 65 20 6e 75 Returns the nu
3490: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 72 mber of bytes wr
34a0: 69 74 74 65 6e 20 6f 72 20 2d 31 20 6f 6e 20 65 itten or -1 on e
34b0: 72 72 6f 72 2e 20 53 65 74 73 20 65 72 72 6f 72 rror. Sets error
34c0: 43 6f 64 65 50 74 72 0a 20 2a 20 20 20 20 74 6f CodePtr. * to
34d0: 20 61 20 50 4f 53 49 58 20 65 72 72 6f 72 20 63 a POSIX error c
34e0: 6f 64 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 ode if an error
34f0: 6f 63 63 75 72 72 65 64 2c 20 6f 72 20 30 20 69 occurred, or 0 i
3500: 66 20 6e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69 f none.. *. * Si
3510: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 20 20 de effects:. *
3520: 20 20 57 72 69 74 65 73 20 6f 75 74 70 75 74 20 Writes output
3530: 6f 6e 20 74 68 65 20 6f 75 74 70 75 74 20 64 65 on the output de
3540: 76 69 63 65 20 6f 66 20 74 68 65 20 63 68 61 6e vice of the chan
3550: 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d nel.. *. *------
3560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
35a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 54 6c 73 /.static int Tls
35b0: 4f 75 74 70 75 74 50 72 6f 63 28 43 6c 69 65 6e OutputProc(Clien
35c0: 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 tData instanceDa
35d0: 74 61 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a ta, const char *
35e0: 62 75 66 2c 20 69 6e 74 20 74 6f 57 72 69 74 65 buf, int toWrite
35f0: 2c 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 , int *errorCode
3600: 50 74 72 29 20 7b 0a 20 20 20 20 75 6e 73 69 67 Ptr) {. unsig
3610: 6e 65 64 20 6c 6f 6e 67 20 62 61 63 6b 69 6e 67 ned long backing
3620: 45 72 72 6f 72 3b 0a 20 20 20 20 53 74 61 74 65 Error;. State
3630: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 *statePtr = (St
3640: 61 74 65 20 2a 29 20 69 6e 73 74 61 6e 63 65 44 ate *) instanceD
3650: 61 74 61 3b 0a 20 20 20 20 69 6e 74 20 77 72 69 ata;. int wri
3660: 74 74 65 6e 2c 20 65 72 72 3b 0a 20 20 20 20 69 tten, err;. i
3670: 6e 74 20 74 6c 73 43 6f 6e 6e 65 63 74 3b 0a 0a nt tlsConnect;..
3680: 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 *errorCodePt
3690: 72 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 r = 0;.. dpri
36a0: 6e 74 66 28 22 42 49 4f 5f 77 72 69 74 65 28 25 ntf("BIO_write(%
36b0: 70 2c 20 25 64 29 22 2c 20 28 76 6f 69 64 20 2a p, %d)", (void *
36c0: 29 20 73 74 61 74 65 50 74 72 2c 20 74 6f 57 72 ) statePtr, toWr
36d0: 69 74 65 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 ite);. dprint
36e0: 42 75 66 66 65 72 28 62 75 66 2c 20 74 6f 57 72 Buffer(buf, toWr
36f0: 69 74 65 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 ite);.. if (s
3700: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 tatePtr->flags &
3710: 20 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 41 43 TLS_TCL_CALLBAC
3720: 4b 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 44 K) {..dprintf("D
3730: 6f 6e 27 74 20 70 72 6f 63 65 73 73 20 6f 75 74 on't process out
3740: 70 75 74 20 77 68 69 6c 65 20 63 61 6c 6c 62 61 put while callba
3750: 63 6b 73 20 61 72 65 20 72 75 6e 6e 69 6e 67 22 cks are running"
3760: 29 3b 0a 09 77 72 69 74 74 65 6e 20 3d 20 2d 31 );..written = -1
3770: 3b 0a 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 ;..*errorCodePtr
3780: 20 3d 20 45 41 47 41 49 4e 3b 0a 09 72 65 74 75 = EAGAIN;..retu
3790: 72 6e 28 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 rn(-1);. }..
37a0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
37b0: 69 6e 67 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 ing Tls_WaitForC
37c0: 6f 6e 6e 65 63 74 22 29 3b 0a 20 20 20 20 74 6c onnect");. tl
37d0: 73 43 6f 6e 6e 65 63 74 20 3d 20 54 6c 73 5f 57 sConnect = Tls_W
37e0: 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 28 73 74 aitForConnect(st
37f0: 61 74 65 50 74 72 2c 20 65 72 72 6f 72 43 6f 64 atePtr, errorCod
3800: 65 50 74 72 2c 20 31 29 3b 0a 20 20 20 20 69 66 ePtr, 1);. if
3810: 20 28 74 6c 73 43 6f 6e 6e 65 63 74 20 3c 20 30 (tlsConnect < 0
3820: 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 47 6f ) {..dprintf("Go
3830: 74 20 61 6e 20 65 72 72 6f 72 20 77 61 69 74 69 t an error waiti
3840: 6e 67 20 74 6f 20 63 6f 6e 6e 65 63 74 20 28 74 ng to connect (t
3850: 6c 73 43 6f 6e 6e 65 63 74 20 3d 20 25 69 2c 20 lsConnect = %i,
3860: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 *errorCodePtr =
3870: 25 69 29 22 2c 20 74 6c 73 43 6f 6e 6e 65 63 74 %i)", tlsConnect
3880: 2c 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29 , *errorCodePtr)
3890: 3b 0a 09 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 ;..Tls_Error(sta
38a0: 74 65 50 74 72 2c 20 73 74 72 65 72 72 6f 72 28 tePtr, strerror(
38b0: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29 29 3b *errorCodePtr));
38c0: 0a 0a 09 77 72 69 74 74 65 6e 20 3d 20 2d 31 3b ...written = -1;
38d0: 0a 09 69 66 20 28 2a 65 72 72 6f 72 43 6f 64 65 ..if (*errorCode
38e0: 50 74 72 20 3d 3d 20 45 43 4f 4e 4e 52 45 53 45 Ptr == ECONNRESE
38f0: 54 29 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 T) {.. dprint
3900: 66 28 22 47 6f 74 20 63 6f 6e 6e 65 63 74 69 6f f("Got connectio
3910: 6e 20 72 65 73 65 74 22 29 3b 0a 09 20 20 20 20 n reset");..
3920: 2f 2a 20 53 6f 66 74 20 45 4f 46 20 2a 2f 0a 09 /* Soft EOF */..
3930: 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 *errorCodePt
3940: 72 20 3d 20 30 3b 0a 09 20 20 20 20 77 72 69 74 r = 0;.. writ
3950: 74 65 6e 20 3d 20 30 3b 0a 09 7d 0a 09 72 65 74 ten = 0;..}..ret
3960: 75 72 6e 28 77 72 69 74 74 65 6e 29 3b 0a 20 20 urn(written);.
3970: 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 74 6f 57 }.. if (toW
3980: 72 69 74 65 20 3d 3d 20 30 29 20 7b 0a 09 64 70 rite == 0) {..dp
3990: 72 69 6e 74 66 28 22 7a 65 72 6f 2d 77 72 69 74 rintf("zero-writ
39a0: 65 22 29 3b 0a 09 65 72 72 20 3d 20 42 49 4f 5f e");..err = BIO_
39b0: 66 6c 75 73 68 28 73 74 61 74 65 50 74 72 2d 3e flush(statePtr->
39c0: 62 69 6f 29 3b 0a 0a 09 69 66 20 28 65 72 72 20 bio);...if (err
39d0: 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 64 70 72 <= 0) {.. dpr
39e0: 69 6e 74 66 28 22 46 6c 75 73 68 69 6e 67 20 66 intf("Flushing f
39f0: 61 69 6c 65 64 22 29 3b 0a 0a 09 20 20 20 20 2a ailed");... *
3a00: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 errorCodePtr = E
3a10: 49 4f 3b 0a 09 20 20 20 20 77 72 69 74 74 65 6e IO;.. written
3a20: 20 3d 20 30 3b 0a 09 20 20 20 20 72 65 74 75 72 = 0;.. retur
3a30: 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 77 72 69 74 n(-1);..}...writ
3a40: 74 65 6e 20 3d 20 30 3b 0a 09 2a 65 72 72 6f 72 ten = 0;..*error
3a50: 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a 09 72 65 CodePtr = 0;..re
3a60: 74 75 72 6e 28 30 29 3b 0a 20 20 20 20 7d 0a 0a turn(0);. }..
3a70: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 57 65 /*. * We
3a80: 20 6e 65 65 64 20 74 6f 20 63 6c 65 61 72 20 74 need to clear t
3a90: 68 65 20 53 53 4c 20 65 72 72 6f 72 20 73 74 61 he SSL error sta
3aa0: 63 6b 20 6e 6f 77 20 62 65 63 61 75 73 65 20 77 ck now because w
3ab0: 65 20 73 6f 6d 65 74 69 6d 65 73 20 72 65 61 63 e sometimes reac
3ac0: 68 0a 20 20 20 20 20 2a 20 74 68 69 73 20 66 75 h. * this fu
3ad0: 6e 63 74 69 6f 6e 20 77 69 74 68 20 6c 65 66 74 nction with left
3ae0: 6f 76 65 72 20 65 72 72 6f 72 73 20 69 6e 20 74 over errors in t
3af0: 68 65 20 73 74 61 63 6b 2e 20 20 49 66 20 42 49 he stack. If BI
3b00: 4f 5f 77 72 69 74 65 0a 20 20 20 20 20 2a 20 72 O_write. * r
3b10: 65 74 75 72 6e 73 20 2d 31 20 61 6e 64 20 69 6e eturns -1 and in
3b20: 74 65 6e 64 73 20 45 41 47 41 49 4e 2c 20 74 68 tends EAGAIN, th
3b30: 65 72 65 20 69 73 20 61 20 6c 65 66 74 6f 76 65 ere is a leftove
3b40: 72 20 65 72 72 6f 72 2c 20 69 74 20 77 69 6c 6c r error, it will
3b50: 20 62 65 0a 20 20 20 20 20 2a 20 6d 69 73 63 6f be. * misco
3b60: 6e 73 74 72 75 65 64 20 61 73 20 61 6e 20 65 72 nstrued as an er
3b70: 72 6f 72 2c 20 6e 6f 74 20 45 41 47 41 49 4e 2e ror, not EAGAIN.
3b80: 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 41 . *. * A
3b90: 6c 74 65 72 6e 61 74 69 76 65 6c 79 2c 20 77 65 lternatively, we
3ba0: 20 6d 61 79 20 77 61 6e 74 20 74 6f 20 68 61 6e may want to han
3bb0: 64 6c 65 20 74 68 65 20 3c 30 20 72 65 74 75 72 dle the <0 retur
3bc0: 6e 20 63 6f 64 65 73 20 66 72 6f 6d 0a 20 20 20 n codes from.
3bd0: 20 20 2a 20 42 49 4f 5f 77 72 69 74 65 20 73 70 * BIO_write sp
3be0: 65 63 69 61 6c 6c 79 20 28 61 73 20 61 64 76 69 ecially (as advi
3bf0: 73 65 64 20 69 6e 20 74 68 65 20 52 53 41 20 64 sed in the RSA d
3c00: 6f 63 73 29 2e 20 20 54 4c 53 27 73 20 6c 6f 77 ocs). TLS's low
3c10: 65 72 20 6c 65 76 65 6c 0a 20 20 20 20 20 2a 20 er level. *
3c20: 42 49 4f 20 66 75 6e 63 74 69 6f 6e 73 20 70 6c BIO functions pl
3c30: 61 79 20 77 69 74 68 20 74 68 65 20 72 65 74 72 ay with the retr
3c40: 79 20 66 6c 61 67 73 20 74 68 6f 75 67 68 2c 20 y flags though,
3c50: 61 6e 64 20 74 68 69 73 20 73 65 65 6d 73 20 74 and this seems t
3c60: 6f 0a 20 20 20 20 20 2a 20 77 6f 72 6b 20 63 6f o. * work co
3c70: 72 72 65 63 74 6c 79 2e 20 20 53 69 6d 69 6c 61 rrectly. Simila
3c80: 72 20 66 69 78 20 69 6e 20 54 6c 73 49 6e 70 75 r fix in TlsInpu
3c90: 74 50 72 6f 63 2e 20 2d 20 68 6f 62 62 73 0a 20 tProc. - hobbs.
3ca0: 20 20 20 20 2a 2f 0a 20 20 20 20 45 52 52 5f 63 */. ERR_c
3cb0: 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 20 20 lear_error();.
3cc0: 20 20 77 72 69 74 74 65 6e 20 3d 20 42 49 4f 5f written = BIO_
3cd0: 77 72 69 74 65 28 73 74 61 74 65 50 74 72 2d 3e write(statePtr->
3ce0: 62 69 6f 2c 20 62 75 66 2c 20 74 6f 57 72 69 74 bio, buf, toWrit
3cf0: 65 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 e);. dprintf(
3d00: 22 42 49 4f 5f 77 72 69 74 65 28 25 70 2c 20 25 "BIO_write(%p, %
3d10: 64 29 20 2d 3e 20 5b 25 64 5d 22 2c 20 28 76 6f d) -> [%d]", (vo
3d20: 69 64 20 2a 29 20 73 74 61 74 65 50 74 72 2c 20 id *) statePtr,
3d30: 74 6f 57 72 69 74 65 2c 20 77 72 69 74 74 65 6e toWrite, written
3d40: 29 3b 0a 0a 20 20 20 20 65 72 72 20 3d 20 53 53 );.. err = SS
3d50: 4c 5f 67 65 74 5f 65 72 72 6f 72 28 73 74 61 74 L_get_error(stat
3d60: 65 50 74 72 2d 3e 73 73 6c 2c 20 77 72 69 74 74 ePtr->ssl, writt
3d70: 65 6e 29 3b 0a 20 20 20 20 62 61 63 6b 69 6e 67 en);. backing
3d80: 45 72 72 6f 72 20 3d 20 45 52 52 5f 67 65 74 5f Error = ERR_get_
3d90: 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 73 77 error();.. sw
3da0: 69 74 63 68 20 28 65 72 72 29 20 7b 0a 09 63 61 itch (err) {..ca
3db0: 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 4e 4f 4e se SSL_ERROR_NON
3dc0: 45 3a 0a 09 20 20 20 20 69 66 20 28 77 72 69 74 E:.. if (writ
3dd0: 74 65 6e 20 3c 20 30 29 20 7b 0a 09 09 77 72 69 ten < 0) {...wri
3de0: 74 74 65 6e 20 3d 20 30 3b 0a 09 20 20 20 20 7d tten = 0;.. }
3df0: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 63 .. break;...c
3e00: 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 ase SSL_ERROR_WA
3e10: 4e 54 5f 57 52 49 54 45 3a 0a 09 20 20 20 20 64 NT_WRITE:.. d
3e20: 70 72 69 6e 74 66 28 22 47 6f 74 20 53 53 4c 5f printf("Got SSL_
3e30: 45 52 52 4f 52 5f 57 41 4e 54 5f 57 52 49 54 45 ERROR_WANT_WRITE
3e40: 2c 20 6d 61 70 70 69 6e 67 20 69 74 20 74 6f 20 , mapping it to
3e50: 45 41 47 41 49 4e 22 29 3b 0a 09 20 20 20 20 2a EAGAIN");.. *
3e60: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 errorCodePtr = E
3e70: 41 47 41 49 4e 3b 0a 09 20 20 20 20 77 72 69 74 AGAIN;.. writ
3e80: 74 65 6e 20 3d 20 2d 31 3b 0a 09 20 20 20 20 54 ten = -1;.. T
3e90: 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 ls_Error(statePt
3ea0: 72 2c 20 22 53 53 4c 5f 45 52 52 4f 52 5f 57 41 r, "SSL_ERROR_WA
3eb0: 4e 54 5f 57 52 49 54 45 22 29 3b 0a 09 20 20 20 NT_WRITE");..
3ec0: 20 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20 53 break;...case S
3ed0: 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 52 45 SL_ERROR_WANT_RE
3ee0: 41 44 3a 0a 09 20 20 20 20 64 70 72 69 6e 74 66 AD:.. dprintf
3ef0: 28 22 20 77 72 69 74 65 20 52 20 42 4c 4f 43 4b (" write R BLOCK
3f00: 22 29 3b 0a 09 20 20 20 20 54 6c 73 5f 45 72 72 ");.. Tls_Err
3f10: 6f 72 28 73 74 61 74 65 50 74 72 2c 20 22 53 53 or(statePtr, "SS
3f20: 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 52 45 41 L_ERROR_WANT_REA
3f30: 44 22 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b D");.. break;
3f40: 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f ...case SSL_ERRO
3f50: 52 5f 57 41 4e 54 5f 58 35 30 39 5f 4c 4f 4f 4b R_WANT_X509_LOOK
3f60: 55 50 3a 0a 09 20 20 20 20 64 70 72 69 6e 74 66 UP:.. dprintf
3f70: 28 22 20 77 72 69 74 65 20 58 20 42 4c 4f 43 4b (" write X BLOCK
3f80: 22 29 3b 0a 09 20 20 20 20 54 6c 73 5f 45 72 72 ");.. Tls_Err
3f90: 6f 72 28 73 74 61 74 65 50 74 72 2c 20 22 53 53 or(statePtr, "SS
3fa0: 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 58 35 30 L_ERROR_WANT_X50
3fb0: 39 5f 4c 4f 4f 4b 55 50 22 29 3b 0a 09 20 20 20 9_LOOKUP");..
3fc0: 20 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20 53 break;...case S
3fd0: 53 4c 5f 45 52 52 4f 52 5f 5a 45 52 4f 5f 52 45 SL_ERROR_ZERO_RE
3fe0: 54 55 52 4e 3a 0a 09 20 20 20 20 64 70 72 69 6e TURN:.. dprin
3ff0: 74 66 28 22 20 63 6c 6f 73 65 64 22 29 3b 0a 09 tf(" closed");..
4000: 20 20 20 20 77 72 69 74 74 65 6e 20 3d 20 30 3b written = 0;
4010: 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 .. *errorCode
4020: 50 74 72 20 3d 20 30 3b 0a 09 20 20 20 20 54 6c Ptr = 0;.. Tl
4030: 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 s_Error(statePtr
4040: 2c 20 22 50 65 65 72 20 68 61 73 20 63 6c 6f 73 , "Peer has clos
4050: 65 64 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f ed the connectio
4060: 6e 20 66 6f 72 20 77 72 69 74 69 6e 67 20 62 79 n for writing by
4070: 20 73 65 6e 64 69 6e 67 20 74 68 65 20 63 6c 6f sending the clo
4080: 73 65 5f 6e 6f 74 69 66 79 20 61 6c 65 72 74 22 se_notify alert"
4090: 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a );.. break;..
40a0: 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f .case SSL_ERROR_
40b0: 53 59 53 43 41 4c 4c 3a 0a 09 20 20 20 20 2f 2a SYSCALL:.. /*
40c0: 20 53 6f 6d 65 20 6e 6f 6e 2d 72 65 63 6f 76 65 Some non-recove
40d0: 72 61 62 6c 65 2c 20 66 61 74 61 6c 20 49 2f 4f rable, fatal I/O
40e0: 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 error occurred
40f0: 2a 2f 0a 09 20 20 20 20 69 66 20 28 62 61 63 6b */.. if (back
4100: 69 6e 67 45 72 72 6f 72 20 3d 3d 20 30 20 26 26 ingError == 0 &&
4110: 20 77 72 69 74 74 65 6e 20 3d 3d 20 30 29 20 7b written == 0) {
4120: 0a 09 09 64 70 72 69 6e 74 66 28 22 45 4f 46 20 ...dprintf("EOF
4130: 72 65 61 63 68 65 64 22 29 0a 09 09 2a 65 72 72 reached")...*err
4140: 6f 72 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a 09 orCodePtr = 0;..
4150: 09 77 72 69 74 74 65 6e 20 3d 20 30 3b 0a 09 09 .written = 0;...
4160: 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 Tls_Error(stateP
4170: 74 72 2c 20 22 45 4f 46 20 72 65 61 63 68 65 64 tr, "EOF reached
4180: 22 29 3b 0a 0a 09 20 20 20 20 7d 20 65 6c 73 65 ");... } else
4190: 20 69 66 20 28 62 61 63 6b 69 6e 67 45 72 72 6f if (backingErro
41a0: 72 20 3d 3d 20 30 20 26 26 20 77 72 69 74 74 65 r == 0 && writte
41b0: 6e 20 3d 3d 20 2d 31 29 20 7b 0a 09 09 64 70 72 n == -1) {...dpr
41c0: 69 6e 74 66 28 22 49 2f 4f 20 65 72 72 6f 72 20 intf("I/O error
41d0: 6f 63 63 75 72 72 65 64 20 28 65 72 72 6e 6f 20 occurred (errno
41e0: 3d 20 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e = %lu)", (unsign
41f0: 65 64 20 6c 6f 6e 67 29 20 54 63 6c 5f 47 65 74 ed long) Tcl_Get
4200: 45 72 72 6e 6f 28 29 29 3b 0a 09 09 2a 65 72 72 Errno());...*err
4210: 6f 72 43 6f 64 65 50 74 72 20 3d 20 54 63 6c 5f orCodePtr = Tcl_
4220: 47 65 74 45 72 72 6e 6f 28 29 3b 0a 09 09 77 72 GetErrno();...wr
4230: 69 74 74 65 6e 20 3d 20 2d 31 3b 0a 09 09 54 6c itten = -1;...Tl
4240: 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 s_Error(statePtr
4250: 2c 20 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 45 , (char *) Tcl_E
4260: 72 72 6e 6f 4d 73 67 28 54 63 6c 5f 47 65 74 45 rrnoMsg(Tcl_GetE
4270: 72 72 6e 6f 28 29 29 29 3b 0a 0a 09 20 20 20 20 rrno()));...
4280: 7d 20 65 6c 73 65 20 7b 0a 09 09 64 70 72 69 6e } else {...dprin
4290: 74 66 28 22 49 2f 4f 20 65 72 72 6f 72 20 6f 63 tf("I/O error oc
42a0: 63 75 72 72 65 64 20 28 62 61 63 6b 69 6e 67 45 curred (backingE
42b0: 72 72 6f 72 20 3d 20 25 6c 75 29 22 2c 20 62 61 rror = %lu)", ba
42c0: 63 6b 69 6e 67 45 72 72 6f 72 29 3b 0a 09 09 2a ckingError);...*
42d0: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 62 errorCodePtr = b
42e0: 61 63 6b 69 6e 67 45 72 72 6f 72 3b 0a 09 09 77 ackingError;...w
42f0: 72 69 74 74 65 6e 20 3d 20 2d 31 3b 0a 09 09 54 ritten = -1;...T
4300: 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 ls_Error(statePt
4310: 72 2c 20 28 63 68 61 72 20 2a 29 20 45 52 52 5f r, (char *) ERR_
4320: 72 65 61 73 6f 6e 5f 65 72 72 6f 72 5f 73 74 72 reason_error_str
4330: 69 6e 67 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 ing(backingError
4340: 29 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 ));.. }..
4350: 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20 53 53 break;...case SS
4360: 4c 5f 45 52 52 4f 52 5f 53 53 4c 3a 0a 09 20 20 L_ERROR_SSL:..
4370: 20 20 2f 2a 20 41 20 6e 6f 6e 2d 72 65 63 6f 76 /* A non-recov
4380: 65 72 61 62 6c 65 2c 20 66 61 74 61 6c 20 65 72 erable, fatal er
4390: 72 6f 72 20 69 6e 20 74 68 65 20 53 53 4c 20 6c ror in the SSL l
43a0: 69 62 72 61 72 79 20 6f 63 63 75 72 72 65 64 2c ibrary occurred,
43b0: 20 75 73 75 61 6c 6c 79 20 61 20 70 72 6f 74 6f usually a proto
43c0: 63 6f 6c 20 65 72 72 6f 72 20 2a 2f 0a 09 20 20 col error */..
43d0: 20 20 64 70 72 69 6e 74 66 28 22 53 53 4c 20 65 dprintf("SSL e
43e0: 72 72 6f 72 2c 20 69 6e 64 69 63 61 74 69 6e 67 rror, indicating
43f0: 20 74 68 61 74 20 74 68 65 20 63 6f 6e 6e 65 63 that the connec
4400: 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 61 62 tion has been ab
4410: 6f 72 74 65 64 22 29 3b 0a 09 20 20 20 20 69 66 orted");.. if
4420: 20 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 20 21 (backingError !
4430: 3d 20 30 29 20 7b 0a 09 09 54 6c 73 5f 45 72 72 = 0) {...Tls_Err
4440: 6f 72 28 73 74 61 74 65 50 74 72 2c 20 28 63 68 or(statePtr, (ch
4450: 61 72 20 2a 29 20 45 52 52 5f 72 65 61 73 6f 6e ar *) ERR_reason
4460: 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 62 61 _error_string(ba
4470: 63 6b 69 6e 67 45 72 72 6f 72 29 29 3b 0a 09 20 ckingError));..
4480: 20 20 20 7d 0a 09 20 20 20 20 2a 65 72 72 6f 72 }.. *error
4490: 43 6f 64 65 50 74 72 20 3d 20 45 43 4f 4e 4e 41 CodePtr = ECONNA
44a0: 42 4f 52 54 45 44 3b 0a 09 20 20 20 20 77 72 69 BORTED;.. wri
44b0: 74 74 65 6e 20 3d 20 2d 31 3b 0a 09 20 20 20 20 tten = -1;..
44c0: 62 72 65 61 6b 3b 0a 0a 09 64 65 66 61 75 6c 74 break;...default
44d0: 3a 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 :.. dprintf("
44e0: 75 6e 6b 6e 6f 77 6e 20 65 72 72 6f 72 3a 20 25 unknown error: %
44f0: 64 22 2c 20 65 72 72 29 3b 0a 09 20 20 20 20 62 d", err);.. b
4500: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 reak;. }..
4510: 20 69 66 20 28 2a 65 72 72 6f 72 43 6f 64 65 50 if (*errorCodeP
4520: 74 72 20 3c 20 30 29 20 7b 0a 09 54 6c 73 5f 45 tr < 0) {..Tls_E
4530: 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20 73 rror(statePtr, s
4540: 74 72 65 72 72 6f 72 28 2a 65 72 72 6f 72 43 6f trerror(*errorCo
4550: 64 65 50 74 72 29 29 3b 0a 20 20 20 20 7d 0a 20 dePtr));. }.
4560: 20 20 20 64 70 72 69 6e 74 66 28 22 4f 75 74 70 dprintf("Outp
4570: 75 74 28 25 64 29 20 2d 3e 20 25 64 22 2c 20 74 ut(%d) -> %d", t
4580: 6f 57 72 69 74 65 2c 20 77 72 69 74 74 65 6e 29 oWrite, written)
4590: 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 77 72 69 ;. return(wri
45a0: 74 74 65 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d tten);.}../*. *-
45b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
45c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
45d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
45e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
45f0: 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 53 65 74 4f --. *. * TlsSetO
4600: 70 74 69 6f 6e 50 72 6f 63 20 2d 2d 0a 20 2a 0a ptionProc --. *.
4610: 20 2a 20 20 20 20 53 65 74 73 20 61 6e 20 6f 70 * Sets an op
4620: 74 69 6f 6e 20 76 61 6c 75 65 20 66 6f 72 20 61 tion value for a
4630: 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 SSL socket base
4640: 64 20 63 68 61 6e 6e 65 6c 2c 20 6f 72 20 61 0a d channel, or a.
4650: 20 2a 20 20 20 20 6c 69 73 74 20 6f 66 20 61 6c * list of al
4660: 6c 20 6f 70 74 69 6f 6e 73 20 61 6e 64 20 74 68 l options and th
4670: 65 69 72 20 76 61 6c 75 65 73 2e 0a 20 2a 0a 20 eir values.. *.
4680: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 20 20 20 * Results:. *
4690: 20 54 43 4c 5f 4f 4b 20 69 66 20 73 75 63 63 65 TCL_OK if succe
46a0: 73 73 66 75 6c 20 6f 72 20 54 43 4c 5f 45 52 52 ssful or TCL_ERR
46b0: 4f 52 20 69 66 20 66 61 69 6c 65 64 2e 0a 20 2a OR if failed.. *
46c0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
46d0: 3a 0a 20 2a 20 20 20 20 55 70 64 61 74 65 73 20 :. * Updates
46e0: 63 68 61 6e 6e 65 6c 20 6f 70 74 69 6f 6e 20 74 channel option t
46f0: 6f 20 6e 65 77 20 76 61 6c 75 65 2e 0a 20 2a 0a o new value.. *.
4700: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
4710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4740: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 -----. */.static
4750: 20 69 6e 74 0a 54 6c 73 53 65 74 4f 70 74 69 6f int.TlsSetOptio
4760: 6e 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 nProc(ClientData
4770: 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 20 instanceData,
4780: 20 20 2f 2a 20 53 6f 63 6b 65 74 20 73 74 61 74 /* Socket stat
4790: 65 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e e. */. Tcl_In
47a0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 09 09 2f terp *interp,../
47b0: 2a 20 46 6f 72 20 65 72 72 6f 72 73 20 2d 20 63 * For errors - c
47c0: 61 6e 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 an be NULL. */.
47d0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6f const char *o
47e0: 70 74 69 6f 6e 4e 61 6d 65 2c 09 2f 2a 20 4e 61 ptionName,./* Na
47f0: 6d 65 20 6f 66 20 74 68 65 20 6f 70 74 69 6f 6e me of the option
4800: 20 74 6f 20 73 65 74 20 74 68 65 20 76 61 6c 75 to set the valu
4810: 65 20 66 6f 72 2c 20 6f 72 0a 09 09 09 09 20 2a e for, or..... *
4820: 20 4e 55 4c 4c 20 74 6f 20 67 65 74 20 61 6c 6c NULL to get all
4830: 20 6f 70 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 options and the
4840: 69 72 20 76 61 6c 75 65 73 2e 20 2a 2f 0a 20 20 ir values. */.
4850: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6f 70 const char *op
4860: 74 69 6f 6e 56 61 6c 75 65 29 09 2f 2a 20 56 61 tionValue)./* Va
4870: 6c 75 65 20 66 6f 72 20 6f 70 74 69 6f 6e 2e 20 lue for option.
4880: 2a 2f 0a 7b 0a 20 20 20 20 53 74 61 74 65 20 2a */.{. State *
4890: 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 statePtr = (Stat
48a0: 65 20 2a 29 20 69 6e 73 74 61 6e 63 65 44 61 74 e *) instanceDat
48b0: 61 3b 0a 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e a;.. Tcl_Chan
48c0: 6e 65 6c 20 64 6f 77 6e 43 68 61 6e 20 3d 20 54 nel downChan = T
48d0: 6c 73 5f 47 65 74 50 61 72 65 6e 74 28 73 74 61 ls_GetParent(sta
48e0: 74 65 50 74 72 2c 20 54 4c 53 5f 54 43 4c 5f 46 tePtr, TLS_TCL_F
48f0: 41 53 54 50 41 54 48 29 3b 0a 20 20 20 20 54 63 ASTPATH);. Tc
4900: 6c 5f 44 72 69 76 65 72 53 65 74 4f 70 74 69 6f l_DriverSetOptio
4910: 6e 50 72 6f 63 20 2a 73 65 74 4f 70 74 69 6f 6e nProc *setOption
4920: 50 72 6f 63 3b 0a 0a 20 20 20 20 73 65 74 4f 70 Proc;.. setOp
4930: 74 69 6f 6e 50 72 6f 63 20 3d 20 54 63 6c 5f 43 tionProc = Tcl_C
4940: 68 61 6e 6e 65 6c 53 65 74 4f 70 74 69 6f 6e 50 hannelSetOptionP
4950: 72 6f 63 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e roc(Tcl_GetChann
4960: 65 6c 54 79 70 65 28 64 6f 77 6e 43 68 61 6e 29 elType(downChan)
4970: 29 3b 0a 20 20 20 20 69 66 20 28 73 65 74 4f 70 );. if (setOp
4980: 74 69 6f 6e 50 72 6f 63 20 21 3d 20 4e 55 4c 4c tionProc != NULL
4990: 29 20 7b 0a 09 72 65 74 75 72 6e 20 28 2a 73 65 ) {..return (*se
49a0: 74 4f 70 74 69 6f 6e 50 72 6f 63 29 28 54 63 6c tOptionProc)(Tcl
49b0: 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 _GetChannelInsta
49c0: 6e 63 65 44 61 74 61 28 64 6f 77 6e 43 68 61 6e nceData(downChan
49d0: 29 2c 20 69 6e 74 65 72 70 2c 20 6f 70 74 69 6f ), interp, optio
49e0: 6e 4e 61 6d 65 2c 20 6f 70 74 69 6f 6e 56 61 6c nName, optionVal
49f0: 75 65 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 ue);. } else
4a00: 69 66 20 28 6f 70 74 69 6f 6e 4e 61 6d 65 20 3d if (optionName =
4a10: 3d 20 28 63 68 61 72 2a 29 20 4e 55 4c 4c 29 20 = (char*) NULL)
4a20: 7b 0a 09 2f 2a 0a 09 20 2a 20 52 65 71 75 65 73 {../*.. * Reques
4a30: 74 20 69 73 20 71 75 65 72 79 20 66 6f 72 20 61 t is query for a
4a40: 6c 6c 20 6f 70 74 69 6f 6e 73 2c 20 74 68 69 73 ll options, this
4a50: 20 69 73 20 6f 6b 2e 0a 09 20 2a 2f 0a 09 72 65 is ok... */..re
4a60: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 turn TCL_OK;.
4a70: 20 7d 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a }. /*. *
4a80: 20 52 65 71 75 65 73 74 20 66 6f 72 20 61 20 73 Request for a s
4a90: 70 65 63 69 66 69 63 20 6f 70 74 69 6f 6e 20 68 pecific option h
4aa0: 61 73 20 74 6f 20 66 61 69 6c 2c 20 77 65 20 64 as to fail, we d
4ab0: 6f 6e 27 74 20 68 61 76 65 20 61 6e 79 2e 0a 20 on't have any..
4ac0: 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 */. retur
4ad0: 6e 20 54 63 6c 5f 42 61 64 43 68 61 6e 6e 65 6c n Tcl_BadChannel
4ae0: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 6f Option(interp, o
4af0: 70 74 69 6f 6e 4e 61 6d 65 2c 20 22 22 29 3b 0a ptionName, "");.
4b00: 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d }../*. *--------
4b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
4b50: 2a 20 54 6c 73 47 65 74 4f 70 74 69 6f 6e 50 72 * TlsGetOptionPr
4b60: 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 20 20 20 20 47 oc --. *. * G
4b70: 65 74 73 20 61 6e 20 6f 70 74 69 6f 6e 20 76 61 ets an option va
4b80: 6c 75 65 20 66 6f 72 20 61 20 53 53 4c 20 73 6f lue for a SSL so
4b90: 63 6b 65 74 20 62 61 73 65 64 20 63 68 61 6e 6e cket based chann
4ba0: 65 6c 2c 20 6f 72 20 61 0a 20 2a 20 20 20 20 6c el, or a. * l
4bb0: 69 73 74 20 6f 66 20 61 6c 6c 20 6f 70 74 69 6f ist of all optio
4bc0: 6e 73 20 61 6e 64 20 74 68 65 69 72 20 76 61 6c ns and their val
4bd0: 75 65 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c ues.. *. * Resul
4be0: 74 73 3a 0a 20 2a 20 20 20 20 41 20 73 74 61 6e ts:. * A stan
4bf0: 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e dard Tcl result.
4c00: 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 The value of th
4c10: 65 20 73 70 65 63 69 66 69 65 64 20 6f 70 74 69 e specified opti
4c20: 6f 6e 20 6f 72 20 61 0a 20 2a 20 20 20 20 6c 69 on or a. * li
4c30: 73 74 20 6f 66 20 61 6c 6c 20 6f 70 74 69 6f 6e st of all option
4c40: 73 20 61 6e 64 20 74 68 65 69 72 20 76 61 6c 75 s and their valu
4c50: 65 73 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 es is returned i
4c60: 6e 20 74 68 65 0a 20 2a 20 20 20 20 73 75 70 70 n the. * supp
4c70: 6c 69 65 64 20 44 53 74 72 69 6e 67 2e 0a 20 2a lied DString.. *
4c80: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
4c90: 3a 0a 20 2a 20 20 20 20 4e 6f 6e 65 2e 0a 20 2a :. * None.. *
4ca0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
4cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4ce0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 ------. */.stati
4cf0: 63 20 69 6e 74 0a 54 6c 73 47 65 74 4f 70 74 69 c int.TlsGetOpti
4d00: 6f 6e 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 onProc(ClientDat
4d10: 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 a instanceData,
4d20: 20 20 20 2f 2a 20 53 6f 63 6b 65 74 20 73 74 61 /* Socket sta
4d30: 74 65 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 te. */. Tcl_I
4d40: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 09 09 nterp *interp,..
4d50: 2f 2a 20 46 6f 72 20 65 72 72 6f 72 73 20 2d 20 /* For errors -
4d60: 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a can be NULL. */.
4d70: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a const char *
4d80: 6f 70 74 69 6f 6e 4e 61 6d 65 2c 09 2f 2a 20 4e optionName,./* N
4d90: 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 74 69 6f ame of the optio
4da0: 6e 20 74 6f 20 72 65 74 72 69 65 76 65 20 74 68 n to retrieve th
4db0: 65 20 76 61 6c 75 65 20 66 6f 72 2c 20 6f 72 0a e value for, or.
4dc0: 09 09 09 09 20 2a 20 4e 55 4c 4c 20 74 6f 20 67 .... * NULL to g
4dd0: 65 74 20 61 6c 6c 20 6f 70 74 69 6f 6e 73 20 61 et all options a
4de0: 6e 64 20 74 68 65 69 72 20 76 61 6c 75 65 73 2e nd their values.
4df0: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 */. Tcl_DStr
4e00: 69 6e 67 20 2a 6f 70 74 69 6f 6e 56 61 6c 75 65 ing *optionValue
4e10: 29 09 2f 2a 20 57 68 65 72 65 20 74 6f 20 73 74 )./* Where to st
4e20: 6f 72 65 20 74 68 65 20 63 6f 6d 70 75 74 65 64 ore the computed
4e30: 20 76 61 6c 75 65 20 69 6e 69 74 69 61 6c 69 7a value initializ
4e40: 65 64 20 62 79 20 63 61 6c 6c 65 72 2e 20 2a 2f ed by caller. */
4e50: 0a 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 .{. State *st
4e60: 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 atePtr = (State
4e70: 2a 29 20 69 6e 73 74 61 6e 63 65 44 61 74 61 3b *) instanceData;
4e80: 0a 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 .. Tcl_Channe
4e90: 6c 20 64 6f 77 6e 43 68 61 6e 20 3d 20 54 6c 73 l downChan = Tls
4ea0: 5f 47 65 74 50 61 72 65 6e 74 28 73 74 61 74 65 _GetParent(state
4eb0: 50 74 72 2c 20 54 4c 53 5f 54 43 4c 5f 46 41 53 Ptr, TLS_TCL_FAS
4ec0: 54 50 41 54 48 29 3b 0a 20 20 20 20 54 63 6c 5f TPATH);. Tcl_
4ed0: 44 72 69 76 65 72 47 65 74 4f 70 74 69 6f 6e 50 DriverGetOptionP
4ee0: 72 6f 63 20 2a 67 65 74 4f 70 74 69 6f 6e 50 72 roc *getOptionPr
4ef0: 6f 63 3b 0a 0a 20 20 20 20 67 65 74 4f 70 74 69 oc;.. getOpti
4f00: 6f 6e 50 72 6f 63 20 3d 20 54 63 6c 5f 43 68 61 onProc = Tcl_Cha
4f10: 6e 6e 65 6c 47 65 74 4f 70 74 69 6f 6e 50 72 6f nnelGetOptionPro
4f20: 63 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c c(Tcl_GetChannel
4f30: 54 79 70 65 28 64 6f 77 6e 43 68 61 6e 29 29 3b Type(downChan));
4f40: 0a 20 20 20 20 69 66 20 28 67 65 74 4f 70 74 69 . if (getOpti
4f50: 6f 6e 50 72 6f 63 20 21 3d 20 4e 55 4c 4c 29 20 onProc != NULL)
4f60: 7b 0a 09 72 65 74 75 72 6e 20 28 2a 67 65 74 4f {..return (*getO
4f70: 70 74 69 6f 6e 50 72 6f 63 29 28 54 63 6c 5f 47 ptionProc)(Tcl_G
4f80: 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 etChannelInstanc
4f90: 65 44 61 74 61 28 64 6f 77 6e 43 68 61 6e 29 2c eData(downChan),
4fa0: 20 69 6e 74 65 72 70 2c 20 6f 70 74 69 6f 6e 4e interp, optionN
4fb0: 61 6d 65 2c 20 6f 70 74 69 6f 6e 56 61 6c 75 65 ame, optionValue
4fc0: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 );. } else if
4fd0: 20 28 6f 70 74 69 6f 6e 4e 61 6d 65 20 3d 3d 20 (optionName ==
4fe0: 28 63 68 61 72 2a 29 20 4e 55 4c 4c 29 20 7b 0a (char*) NULL) {.
4ff0: 09 2f 2a 0a 09 20 2a 20 52 65 71 75 65 73 74 20 ./*.. * Request
5000: 69 73 20 71 75 65 72 79 20 66 6f 72 20 61 6c 6c is query for all
5010: 20 6f 70 74 69 6f 6e 73 2c 20 74 68 69 73 20 69 options, this i
5020: 73 20 6f 6b 2e 0a 09 20 2a 2f 0a 09 72 65 74 75 s ok... */..retu
5030: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d rn TCL_OK;. }
5040: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 52 . /*. * R
5050: 65 71 75 65 73 74 20 66 6f 72 20 61 20 73 70 65 equest for a spe
5060: 63 69 66 69 63 20 6f 70 74 69 6f 6e 20 68 61 73 cific option has
5070: 20 74 6f 20 66 61 69 6c 2c 20 77 65 20 64 6f 6e to fail, we don
5080: 27 74 20 68 61 76 65 20 61 6e 79 2e 0a 20 20 20 't have any..
5090: 20 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 */. return
50a0: 54 63 6c 5f 42 61 64 43 68 61 6e 6e 65 6c 4f 70 Tcl_BadChannelOp
50b0: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 6f 70 74 tion(interp, opt
50c0: 69 6f 6e 4e 61 6d 65 2c 20 22 22 29 3b 0a 7d 0a ionName, "");.}.
50d0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
50e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
50f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
5120: 54 6c 73 57 61 74 63 68 50 72 6f 63 20 2d 2d 0a TlsWatchProc --.
5130: 20 2a 0a 20 2a 20 20 20 20 49 6e 69 74 69 61 6c *. * Initial
5140: 69 7a 65 20 74 68 65 20 6e 6f 74 69 66 69 65 72 ize the notifier
5150: 20 74 6f 20 77 61 74 63 68 20 54 63 6c 5f 46 69 to watch Tcl_Fi
5160: 6c 65 73 20 66 72 6f 6d 20 74 68 69 73 20 63 68 les from this ch
5170: 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 52 65 73 annel.. *. * Res
5180: 75 6c 74 73 3a 0a 20 2a 20 20 20 20 4e 6f 6e 65 ults:. * None
5190: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 .. *. * Side eff
51a0: 65 63 74 73 3a 0a 20 2a 20 20 20 20 53 65 74 73 ects:. * Sets
51b0: 20 75 70 20 74 68 65 20 6e 6f 74 69 66 69 65 72 up the notifier
51c0: 20 73 6f 20 74 68 61 74 20 61 20 66 75 74 75 72 so that a futur
51d0: 65 20 65 76 65 6e 74 20 6f 6e 20 74 68 65 20 63 e event on the c
51e0: 68 61 6e 6e 65 6c 0a 20 2a 20 20 20 20 77 69 6c hannel. * wil
51f0: 6c 20 62 65 20 73 65 65 6e 20 62 79 20 54 63 6c l be seen by Tcl
5200: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d .. *. *---------
5210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 ----------. */.s
5250: 74 61 74 69 63 20 76 6f 69 64 0a 54 6c 73 57 61 tatic void.TlsWa
5260: 74 63 68 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 tchProc(ClientDa
5270: 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c ta instanceData,
5280: 20 20 20 20 2f 2a 20 54 68 65 20 73 6f 63 6b 65 /* The socke
5290: 74 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 20 20 t state. */.
52a0: 69 6e 74 20 6d 61 73 6b 29 09 09 09 2f 2a 20 45 int mask).../* E
52b0: 76 65 6e 74 73 20 6f 66 20 69 6e 74 65 72 65 73 vents of interes
52c0: 74 3b 20 61 6e 20 4f 52 2d 65 64 20 63 6f 6d 62 t; an OR-ed comb
52d0: 69 6e 61 74 69 6f 6e 20 6f 66 0a 09 09 09 09 20 ination of.....
52e0: 2a 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 2c 20 * TCL_READABLE,
52f0: 54 43 4c 5f 57 52 49 54 41 42 4c 45 20 61 6e 64 TCL_WRITABLE and
5300: 20 54 43 4c 5f 45 58 43 45 50 54 49 4f 4e 2e 20 TCL_EXCEPTION.
5310: 2a 2f 0a 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 */.{. Tcl_Cha
5320: 6e 6e 65 6c 20 20 20 20 20 64 6f 77 6e 43 68 61 nnel downCha
5330: 6e 3b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 n;. State *st
5340: 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 atePtr = (State
5350: 2a 29 20 69 6e 73 74 61 6e 63 65 44 61 74 61 3b *) instanceData;
5360: 0a 20 20 20 20 54 63 6c 5f 44 72 69 76 65 72 57 . Tcl_DriverW
5370: 61 74 63 68 50 72 6f 63 20 2a 77 61 74 63 68 50 atchProc *watchP
5380: 72 6f 63 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 roc;.. dprint
5390: 66 28 22 54 6c 73 57 61 74 63 68 50 72 6f 63 28 f("TlsWatchProc(
53a0: 30 78 25 78 29 22 2c 20 6d 61 73 6b 29 3b 0a 0a 0x%x)", mask);..
53b0: 20 20 20 20 2f 2a 20 50 72 65 74 65 6e 64 20 74 /* Pretend t
53c0: 6f 20 62 65 20 64 65 61 64 20 61 73 20 6c 6f 6e o be dead as lon
53d0: 67 20 61 73 20 74 68 65 20 76 65 72 69 66 79 20 g as the verify
53e0: 63 61 6c 6c 62 61 63 6b 20 69 73 20 72 75 6e 6e callback is runn
53f0: 69 6e 67 2e 0a 20 20 20 20 20 2a 20 4f 74 68 65 ing.. * Othe
5400: 72 77 69 73 65 20 74 68 61 74 20 63 61 6c 6c 62 rwise that callb
5410: 61 63 6b 20 63 6f 75 6c 64 20 62 65 20 69 6e 76 ack could be inv
5420: 6f 6b 65 64 20 72 65 63 75 72 73 69 76 65 6c 79 oked recursively
5430: 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 . */. if (sta
5440: 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 tePtr->flags & T
5450: 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 29 LS_TCL_CALLBACK)
5460: 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 43 61 6c {..dprintf("Cal
5470: 6c 62 61 63 6b 20 69 73 20 6f 6e 2d 67 6f 69 6e lback is on-goin
5480: 67 2c 20 64 6f 69 6e 67 20 6e 6f 74 68 69 6e 67 g, doing nothing
5490: 22 29 3b 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 ");..return;.
54a0: 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 46 6c }.. dprintFl
54b0: 61 67 73 28 73 74 61 74 65 50 74 72 29 3b 0a 0a ags(statePtr);..
54c0: 20 20 20 20 64 6f 77 6e 43 68 61 6e 20 3d 20 54 downChan = T
54d0: 6c 73 5f 47 65 74 50 61 72 65 6e 74 28 73 74 61 ls_GetParent(sta
54e0: 74 65 50 74 72 2c 20 54 4c 53 5f 54 43 4c 5f 46 tePtr, TLS_TCL_F
54f0: 41 53 54 50 41 54 48 29 3b 0a 0a 20 20 20 20 69 ASTPATH);.. i
5500: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 f (statePtr->fla
5510: 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f 48 41 4e gs & TLS_TCL_HAN
5520: 44 53 48 41 4b 45 5f 46 41 49 4c 45 44 29 20 7b DSHAKE_FAILED) {
5530: 0a 09 64 70 72 69 6e 74 66 28 22 41 73 6b 65 64 ..dprintf("Asked
5540: 20 74 6f 20 77 61 74 63 68 20 61 20 73 6f 63 6b to watch a sock
5550: 65 74 20 77 69 74 68 20 61 20 66 61 69 6c 65 64 et with a failed
5560: 20 68 61 6e 64 73 68 61 6b 65 20 2d 2d 20 6e 6f handshake -- no
5570: 74 68 69 6e 67 20 63 61 6e 20 68 61 70 70 65 6e thing can happen
5580: 20 68 65 72 65 22 29 3b 0a 09 64 70 72 69 6e 74 here");..dprint
5590: 66 28 22 55 6e 72 65 67 69 73 74 65 72 69 6e 67 f("Unregistering
55a0: 20 69 6e 74 65 72 65 73 74 20 69 6e 20 74 68 65 interest in the
55b0: 20 6c 6f 77 65 72 20 63 68 61 6e 6e 65 6c 22 29 lower channel")
55c0: 3b 0a 0a 09 77 61 74 63 68 50 72 6f 63 20 3d 20 ;...watchProc =
55d0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 57 61 74 63 68 Tcl_ChannelWatch
55e0: 50 72 6f 63 28 54 63 6c 5f 47 65 74 43 68 61 6e Proc(Tcl_GetChan
55f0: 6e 65 6c 54 79 70 65 28 64 6f 77 6e 43 68 61 6e nelType(downChan
5600: 29 29 3b 0a 09 77 61 74 63 68 50 72 6f 63 28 54 ));..watchProc(T
5610: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 cl_GetChannelIns
5620: 74 61 6e 63 65 44 61 74 61 28 64 6f 77 6e 43 68 tanceData(downCh
5630: 61 6e 29 2c 20 30 29 3b 0a 09 73 74 61 74 65 50 an), 0);..stateP
5640: 74 72 2d 3e 77 61 74 63 68 4d 61 73 6b 20 3d 20 tr->watchMask =
5650: 30 3b 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 0;..return;.
5660: 7d 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d }.. statePtr-
5670: 3e 77 61 74 63 68 4d 61 73 6b 20 3d 20 6d 61 73 >watchMask = mas
5680: 6b 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 20 63 68 k;.. /* No ch
5690: 61 6e 6e 65 6c 20 68 61 6e 64 6c 65 72 73 20 61 annel handlers a
56a0: 6e 79 20 6d 6f 72 65 2e 20 57 65 20 77 69 6c 6c ny more. We will
56b0: 20 62 65 20 6e 6f 74 69 66 69 65 64 20 61 75 74 be notified aut
56c0: 6f 6d 61 74 69 63 61 6c 6c 79 0a 20 20 20 20 20 omatically.
56d0: 2a 20 61 62 6f 75 74 20 65 76 65 6e 74 73 20 6f * about events o
56e0: 6e 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 62 65 n the channel be
56f0: 6c 6f 77 20 76 69 61 20 61 20 63 61 6c 6c 20 74 low via a call t
5700: 6f 20 6f 75 72 0a 20 20 20 20 20 2a 20 27 54 72 o our. * 'Tr
5710: 61 6e 73 66 6f 72 6d 4e 6f 74 69 66 79 50 72 6f ansformNotifyPro
5720: 63 27 2e 20 42 75 74 20 77 65 20 68 61 76 65 20 c'. But we have
5730: 74 6f 20 70 61 73 73 20 74 68 65 20 69 6e 74 65 to pass the inte
5740: 72 65 73 74 20 64 6f 77 6e 20 6e 6f 77 2e 0a 20 rest down now..
5750: 20 20 20 20 2a 20 57 65 20 61 72 65 20 61 6c 6c * We are all
5760: 6f 77 65 64 20 74 6f 20 61 64 64 20 61 64 64 69 owed to add addi
5770: 74 69 6f 6e 61 6c 20 27 69 6e 74 65 72 65 73 74 tional 'interest
5780: 27 20 74 6f 20 74 68 65 20 6d 61 73 6b 20 69 66 ' to the mask if
5790: 20 77 65 20 77 61 6e 74 0a 20 20 20 20 20 2a 20 we want. *
57a0: 74 6f 2e 20 42 75 74 20 74 68 69 73 20 74 72 61 to. But this tra
57b0: 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 68 61 73 20 nsformation has
57c0: 6e 6f 20 73 75 63 68 20 69 6e 74 65 72 65 73 74 no such interest
57d0: 2e 20 49 74 20 6a 75 73 74 20 70 61 73 73 65 73 . It just passes
57e0: 0a 20 20 20 20 20 2a 20 74 68 65 20 72 65 71 75 . * the requ
57f0: 65 73 74 20 64 6f 77 6e 2c 20 75 6e 63 68 61 6e est down, unchan
5800: 67 65 64 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 ged.. */.
5810: 20 64 70 72 69 6e 74 66 28 22 52 65 67 69 73 74 dprintf("Regist
5820: 65 72 69 6e 67 20 6f 75 72 20 69 6e 74 65 72 65 ering our intere
5830: 73 74 20 69 6e 20 74 68 65 20 6c 6f 77 65 72 20 st in the lower
5840: 63 68 61 6e 6e 65 6c 20 28 63 68 61 6e 3d 25 70 channel (chan=%p
5850: 29 22 2c 20 28 76 6f 69 64 20 2a 29 20 64 6f 77 )", (void *) dow
5860: 6e 43 68 61 6e 29 3b 0a 20 20 20 20 77 61 74 63 nChan);. watc
5870: 68 50 72 6f 63 20 3d 20 54 63 6c 5f 43 68 61 6e hProc = Tcl_Chan
5880: 6e 65 6c 57 61 74 63 68 50 72 6f 63 28 54 63 6c nelWatchProc(Tcl
5890: 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 _GetChannelType(
58a0: 64 6f 77 6e 43 68 61 6e 29 29 3b 0a 20 20 20 20 downChan));.
58b0: 77 61 74 63 68 50 72 6f 63 28 54 63 6c 5f 47 65 watchProc(Tcl_Ge
58c0: 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 tChannelInstance
58d0: 44 61 74 61 28 64 6f 77 6e 43 68 61 6e 29 2c 20 Data(downChan),
58e0: 6d 61 73 6b 29 3b 0a 0a 0a 20 20 20 20 2f 2a 0a mask);... /*.
58f0: 20 20 20 20 20 2a 20 4d 61 6e 61 67 65 6d 65 6e * Managemen
5900: 74 20 6f 66 20 74 68 65 20 69 6e 74 65 72 6e 61 t of the interna
5910: 6c 20 74 69 6d 65 72 2e 0a 20 20 20 20 20 2a 2f l timer.. */
5920: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
5930: 72 2d 3e 74 69 6d 65 72 20 21 3d 20 28 54 63 6c r->timer != (Tcl
5940: 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c _TimerToken) NUL
5950: 4c 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 41 L) {..dprintf("A
5960: 20 74 69 6d 65 72 20 77 61 73 20 66 6f 75 6e 64 timer was found
5970: 2c 20 64 65 6c 65 74 69 6e 67 20 69 74 22 29 3b , deleting it");
5980: 0a 09 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 ..Tcl_DeleteTime
5990: 72 48 61 6e 64 6c 65 72 28 73 74 61 74 65 50 74 rHandler(statePt
59a0: 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 73 74 61 74 r->timer);..stat
59b0: 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 28 54 ePtr->timer = (T
59c0: 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e cl_TimerToken) N
59d0: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ULL;. }..
59e0: 69 66 20 28 28 6d 61 73 6b 20 26 20 54 43 4c 5f if ((mask & TCL_
59f0: 52 45 41 44 41 42 4c 45 29 20 26 26 0a 09 28 28 READABLE) &&..((
5a00: 54 63 6c 5f 49 6e 70 75 74 42 75 66 66 65 72 65 Tcl_InputBuffere
5a10: 64 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 d(statePtr->self
5a20: 29 20 3e 20 30 29 20 7c 7c 20 28 42 49 4f 5f 63 ) > 0) || (BIO_c
5a30: 74 72 6c 5f 70 65 6e 64 69 6e 67 28 73 74 61 74 trl_pending(stat
5a40: 65 50 74 72 2d 3e 62 69 6f 29 20 3e 20 30 29 29 ePtr->bio) > 0))
5a50: 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 54 68 65 72 ) {../*.. * Ther
5a60: 65 20 69 73 20 69 6e 74 65 72 65 73 74 20 69 6e e is interest in
5a70: 20 72 65 61 64 61 62 6c 65 20 65 76 65 6e 74 73 readable events
5a80: 20 61 6e 64 20 77 65 20 61 63 74 75 61 6c 6c 79 and we actually
5a90: 20 68 61 76 65 0a 09 20 2a 20 64 61 74 61 20 77 have.. * data w
5aa0: 61 69 74 69 6e 67 2c 20 73 6f 20 67 65 6e 65 72 aiting, so gener
5ab0: 61 74 65 20 61 20 74 69 6d 65 72 20 74 6f 20 66 ate a timer to f
5ac0: 6c 75 73 68 20 74 68 61 74 2e 0a 09 20 2a 2f 0a lush that... */.
5ad0: 09 64 70 72 69 6e 74 66 28 22 43 72 65 61 74 69 .dprintf("Creati
5ae0: 6e 67 20 61 20 6e 65 77 20 74 69 6d 65 72 20 73 ng a new timer s
5af0: 69 6e 63 65 20 64 61 74 61 20 61 70 70 65 61 72 ince data appear
5b00: 73 20 74 6f 20 62 65 20 77 61 69 74 69 6e 67 22 s to be waiting"
5b10: 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 69 );..statePtr->ti
5b20: 6d 65 72 20 3d 20 54 63 6c 5f 43 72 65 61 74 65 mer = Tcl_Create
5b30: 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 54 4c 53 TimerHandler(TLS
5b40: 5f 54 43 4c 5f 44 45 4c 41 59 2c 20 54 6c 73 43 _TCL_DELAY, TlsC
5b50: 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 54 69 6d hannelHandlerTim
5b60: 65 72 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 er, (ClientData)
5b70: 20 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 statePtr);.
5b80: 7d 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d }.}../*. *------
5b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
5bd0: 0a 20 2a 20 54 6c 73 47 65 74 48 61 6e 64 6c 65 . * TlsGetHandle
5be0: 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 20 20 20 Proc --. *. *
5bf0: 20 43 61 6c 6c 65 64 20 66 72 6f 6d 20 54 63 6c Called from Tcl
5c00: 5f 47 65 74 43 68 61 6e 6e 65 6c 46 69 6c 65 20 _GetChannelFile
5c10: 74 6f 20 72 65 74 72 69 65 76 65 20 6f 2f 73 20 to retrieve o/s
5c20: 66 69 6c 65 20 68 61 6e 64 6c 65 72 0a 20 2a 20 file handler. *
5c30: 20 20 20 66 72 6f 6d 20 74 68 65 20 53 53 4c 20 from the SSL
5c40: 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63 68 61 socket based cha
5c50: 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 nnel.. *. * Resu
5c60: 6c 74 73 3a 0a 20 2a 20 20 20 20 54 68 65 20 61 lts:. * The a
5c70: 70 70 72 6f 70 72 69 61 74 65 20 54 63 6c 5f 46 ppropriate Tcl_F
5c80: 69 6c 65 20 68 61 6e 64 6c 65 20 6f 72 20 4e 55 ile handle or NU
5c90: 4c 4c 20 69 66 20 6e 6f 6e 65 2e 0a 20 2a 0a 20 LL if none.. *.
5ca0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
5cb0: 20 2a 20 20 20 20 4e 6f 6e 65 2e 0a 20 2a 0a 20 * None.. *.
5cc0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
5cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5d00: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
5d10: 69 6e 74 20 54 6c 73 47 65 74 48 61 6e 64 6c 65 int TlsGetHandle
5d20: 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20 Proc(ClientData
5d30: 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 20 20 instanceData,
5d40: 20 2f 2a 20 53 6f 63 6b 65 74 20 73 74 61 74 65 /* Socket state
5d50: 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 64 69 72 . */. int dir
5d60: 65 63 74 69 6f 6e 2c 09 09 2f 2a 20 54 43 4c 5f ection,../* TCL_
5d70: 52 45 41 44 41 42 4c 45 20 6f 72 20 54 43 4c 5f READABLE or TCL_
5d80: 57 52 49 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20 WRITABLE */.
5d90: 43 6c 69 65 6e 74 44 61 74 61 20 2a 68 61 6e 64 ClientData *hand
5da0: 6c 65 50 74 72 29 09 2f 2a 20 48 61 6e 64 6c 65 lePtr)./* Handle
5db0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 associated with
5dc0: 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a the channel */.
5dd0: 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 {. State *sta
5de0: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a tePtr = (State *
5df0: 29 20 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a ) instanceData;.
5e00: 0a 20 20 20 20 72 65 74 75 72 6e 28 54 63 6c 5f . return(Tcl_
5e10: 47 65 74 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 GetChannelHandle
5e20: 28 54 6c 73 5f 47 65 74 50 61 72 65 6e 74 28 73 (Tls_GetParent(s
5e30: 74 61 74 65 50 74 72 2c 20 54 4c 53 5f 54 43 4c tatePtr, TLS_TCL
5e40: 5f 46 41 53 54 50 41 54 48 29 2c 20 64 69 72 65 _FASTPATH), dire
5e50: 63 74 69 6f 6e 2c 20 68 61 6e 64 6c 65 50 74 72 ction, handlePtr
5e60: 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d ));.}../*. *----
5e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
5eb0: 20 2a 0a 20 2a 20 54 6c 73 4e 6f 74 69 66 79 50 *. * TlsNotifyP
5ec0: 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 20 20 20 20 roc --. *. *
5ed0: 48 61 6e 64 6c 65 72 20 63 61 6c 6c 65 64 20 62 Handler called b
5ee0: 79 20 54 63 6c 20 74 6f 20 69 6e 66 6f 72 6d 20 y Tcl to inform
5ef0: 75 73 20 6f 66 20 61 63 74 69 76 69 74 79 0a 20 us of activity.
5f00: 2a 20 20 20 20 6f 6e 20 74 68 65 20 75 6e 64 65 * on the unde
5f10: 72 6c 79 69 6e 67 20 63 68 61 6e 6e 65 6c 2e 0a rlying channel..
5f20: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 *. * Results:.
5f30: 2a 20 20 20 20 54 79 70 65 20 6f 66 20 65 76 65 * Type of eve
5f40: 6e 74 20 6f 72 20 30 20 69 66 20 66 61 69 6c 65 nt or 0 if faile
5f50: 64 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 d. *. * Side eff
5f60: 65 63 74 73 3a 0a 20 2a 20 20 20 20 4d 61 79 20 ects:. * May
5f70: 70 72 6f 63 65 73 73 20 74 68 65 20 69 6e 63 6f process the inco
5f80: 6d 69 6e 67 20 65 76 65 6e 74 20 62 79 20 69 74 ming event by it
5f90: 73 65 6c 66 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d self.. *. *-----
5fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
5fe0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 54 6c */.static int Tl
5ff0: 73 4e 6f 74 69 66 79 50 72 6f 63 28 43 6c 69 65 sNotifyProc(Clie
6000: 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 ntData instanceD
6010: 61 74 61 2c 20 20 20 20 2f 2a 20 53 6f 63 6b 65 ata, /* Socke
6020: 74 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 20 20 t state. */.
6030: 69 6e 74 20 6d 61 73 6b 29 09 09 09 2f 2a 20 74 int mask).../* t
6040: 79 70 65 20 6f 66 20 65 76 65 6e 74 20 74 68 61 ype of event tha
6050: 74 20 6f 63 63 75 72 72 65 64 3a 0a 09 09 09 09 t occurred:.....
6060: 20 2a 20 4f 52 2d 65 64 20 63 6f 6d 62 69 6e 61 * OR-ed combina
6070: 74 69 6f 6e 20 6f 66 20 54 43 4c 5f 52 45 41 44 tion of TCL_READ
6080: 41 42 4c 45 20 6f 72 20 54 43 4c 5f 57 52 49 54 ABLE or TCL_WRIT
6090: 41 42 4c 45 20 2a 2f 0a 7b 0a 20 20 20 20 53 74 ABLE */.{. St
60a0: 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 ate *statePtr =
60b0: 28 53 74 61 74 65 20 2a 29 20 69 6e 73 74 61 6e (State *) instan
60c0: 63 65 44 61 74 61 3b 0a 20 20 20 20 69 6e 74 20 ceData;. int
60d0: 65 72 72 6f 72 43 6f 64 65 3b 0a 0a 20 20 20 20 errorCode;..
60e0: 2f 2a 0a 20 20 20 20 20 2a 20 41 6e 20 65 76 65 /*. * An eve
60f0: 6e 74 20 6f 63 63 75 72 72 65 64 20 69 6e 20 74 nt occurred in t
6100: 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 63 68 he underlying ch
6110: 61 6e 6e 65 6c 2e 20 20 54 68 69 73 0a 20 20 20 annel. This.
6120: 20 20 2a 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 * transformati
6130: 6f 6e 20 64 6f 65 73 6e 27 74 20 70 72 6f 63 65 on doesn't proce
6140: 73 73 20 73 75 63 68 20 65 76 65 6e 74 73 20 74 ss such events t
6150: 68 75 73 20 72 65 74 75 72 6e 73 20 74 68 65 0a hus returns the.
6160: 20 20 20 20 20 2a 20 69 6e 63 6f 6d 69 6e 67 20 * incoming
6170: 6d 61 73 6b 20 75 6e 63 68 61 6e 67 65 64 2e 0a mask unchanged..
6180: 20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 20 28 */. if (
6190: 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 statePtr->timer
61a0: 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b != (Tcl_TimerTok
61b0: 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 0a en) NULL) {../*.
61c0: 09 20 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 78 . * Delete an ex
61d0: 69 73 74 69 6e 67 20 74 69 6d 65 72 2e 20 49 74 isting timer. It
61e0: 20 77 61 73 20 6e 6f 74 20 66 69 72 65 64 2c 20 was not fired,
61f0: 79 65 74 20 77 65 20 61 72 65 0a 09 20 2a 20 68 yet we are.. * h
6200: 65 72 65 2c 20 73 6f 20 74 68 65 20 63 68 61 6e ere, so the chan
6210: 6e 65 6c 20 62 65 6c 6f 77 20 67 65 6e 65 72 61 nel below genera
6220: 74 65 64 20 73 75 63 68 20 61 6e 20 65 76 65 6e ted such an even
6230: 74 20 61 6e 64 20 77 65 0a 09 20 2a 20 64 6f 6e t and we.. * don
6240: 27 74 20 68 61 76 65 20 74 6f 2e 20 54 68 65 20 't have to. The
6250: 72 65 6e 65 77 61 6c 20 6f 66 20 74 68 65 20 69 renewal of the i
6260: 6e 74 65 72 65 73 74 20 61 66 74 65 72 20 74 68 nterest after th
6270: 65 0a 09 20 2a 20 65 78 65 63 75 74 69 6f 6e 20 e.. * execution
6280: 6f 66 20 63 68 61 6e 6e 65 6c 20 68 61 6e 64 6c of channel handl
6290: 65 72 73 20 77 69 6c 6c 20 65 76 65 6e 74 75 61 ers will eventua
62a0: 6c 6c 79 20 63 61 75 73 65 20 75 73 20 74 6f 0a lly cause us to.
62b0: 09 20 2a 20 72 65 63 72 65 61 74 65 20 74 68 65 . * recreate the
62c0: 20 74 69 6d 65 72 20 28 69 6e 20 57 61 74 63 68 timer (in Watch
62d0: 50 72 6f 63 29 2e 0a 09 20 2a 2f 0a 09 54 63 6c Proc)... */..Tcl
62e0: 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 61 6e 64 _DeleteTimerHand
62f0: 6c 65 72 28 73 74 61 74 65 50 74 72 2d 3e 74 69 ler(statePtr->ti
6300: 6d 65 72 29 3b 0a 09 73 74 61 74 65 50 74 72 2d mer);..statePtr-
6310: 3e 74 69 6d 65 72 20 3d 20 28 54 63 6c 5f 54 69 >timer = (Tcl_Ti
6320: 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 3b 0a merToken) NULL;.
6330: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 }.. if (s
6340: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 tatePtr->flags &
6350: 20 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 41 43 TLS_TCL_CALLBAC
6360: 4b 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 52 K) {..dprintf("R
6370: 65 74 75 72 6e 69 6e 67 20 30 20 64 75 65 20 74 eturning 0 due t
6380: 6f 20 63 61 6c 6c 62 61 63 6b 22 29 3b 0a 09 72 o callback");..r
6390: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a eturn 0;. }..
63a0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
63b0: 6c 69 6e 67 20 54 6c 73 5f 57 61 69 74 46 6f 72 ling Tls_WaitFor
63c0: 43 6f 6e 6e 65 63 74 22 29 3b 0a 20 20 20 20 65 Connect");. e
63d0: 72 72 6f 72 43 6f 64 65 20 3d 20 30 3b 0a 20 20 rrorCode = 0;.
63e0: 20 20 69 66 20 28 54 6c 73 5f 57 61 69 74 46 6f if (Tls_WaitFo
63f0: 72 43 6f 6e 6e 65 63 74 28 73 74 61 74 65 50 74 rConnect(statePt
6400: 72 2c 20 26 65 72 72 6f 72 43 6f 64 65 2c 20 31 r, &errorCode, 1
6410: 29 20 3c 20 30 29 20 7b 0a 09 54 6c 73 5f 45 72 ) < 0) {..Tls_Er
6420: 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20 73 74 ror(statePtr, st
6430: 72 65 72 72 6f 72 28 65 72 72 6f 72 43 6f 64 65 rerror(errorCode
6440: 29 29 3b 0a 09 69 66 20 28 65 72 72 6f 72 43 6f ));..if (errorCo
6450: 64 65 20 3d 3d 20 45 41 47 41 49 4e 29 20 7b 0a de == EAGAIN) {.
6460: 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 41 73 . dprintf("As
6470: 79 6e 63 20 66 6c 61 67 20 63 6f 75 6c 64 20 62 ync flag could b
6480: 65 20 73 65 74 20 28 64 69 64 6e 27 74 20 63 68 e set (didn't ch
6490: 65 63 6b 29 20 61 6e 64 20 65 72 72 6f 72 43 6f eck) and errorCo
64a0: 64 65 20 3d 3d 20 45 41 47 41 49 4e 3a 20 20 52 de == EAGAIN: R
64b0: 65 74 75 72 6e 69 6e 67 20 30 22 29 3b 0a 0a 09 eturning 0");...
64c0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 09 7d return 0;..}
64d0: 0a 0a 09 64 70 72 69 6e 74 66 28 22 54 6c 73 5f ...dprintf("Tls_
64e0: 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 20 72 WaitForConnect r
64f0: 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 eturned an error
6500: 22 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 ");. }.. d
6510: 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e printf("Returnin
6520: 67 20 25 69 22 2c 20 6d 61 73 6b 29 3b 0a 0a 20 g %i", mask);..
6530: 20 20 20 72 65 74 75 72 6e 28 6d 61 73 6b 29 3b return(mask);
6540: 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d .}../*. *-------
6550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a ---------------*
6580: 0a 20 2a 0a 20 2a 20 20 20 20 54 6c 73 43 68 61 . *. * TlsCha
6590: 6e 6e 65 6c 48 61 6e 64 6c 65 72 54 69 6d 65 72 nnelHandlerTimer
65a0: 20 2d 2d 0a 20 2a 0a 20 2a 20 20 20 20 2d 2d 2d --. *. * ---
65b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
65c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
65d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 -------------*.
65e0: 2a 20 20 20 20 43 61 6c 6c 65 64 20 62 79 20 74 * Called by t
65f0: 68 65 20 6e 6f 74 69 66 69 65 72 20 28 2d 3e 20 he notifier (->
6600: 74 69 6d 65 72 29 20 74 6f 20 66 6c 75 73 68 20 timer) to flush
6610: 6f 75 74 0a 20 2a 20 20 20 20 69 6e 66 6f 72 6d out. * inform
6620: 61 74 69 6f 6e 20 77 61 69 74 69 6e 67 20 69 6e ation waiting in
6630: 20 63 68 61 6e 6e 65 6c 20 62 75 66 66 65 72 73 channel buffers
6640: 2e 0a 20 2a 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d .. * --------
6650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6670: 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 20 --------*. *. *
6680: 20 20 20 53 69 64 65 20 65 66 66 65 63 74 73 3a Side effects:
6690: 0a 20 2a 20 20 20 20 20 20 20 20 41 73 20 6f 66 . * As of
66a0: 20 27 54 6c 73 43 68 61 6e 6e 65 6c 48 61 6e 64 'TlsChannelHand
66b0: 6c 65 72 27 2e 0a 20 2a 0a 20 2a 20 20 20 20 52 ler'.. *. * R
66c0: 65 73 75 6c 74 3a 0a 20 2a 20 20 20 20 20 20 20 esult:. *
66d0: 20 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d None.. *. *----
66e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
66f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6710: 2d 2d 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 --*. */.static v
6720: 6f 69 64 20 54 6c 73 43 68 61 6e 6e 65 6c 48 61 oid TlsChannelHa
6730: 6e 64 6c 65 72 54 69 6d 65 72 28 43 6c 69 65 6e ndlerTimer(Clien
6740: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 tData clientData
6750: 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 ) {. State *s
6760: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 tatePtr = (State
6770: 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a *) clientData;.
6780: 20 20 20 20 69 6e 74 20 6d 61 73 6b 20 3d 20 30 int mask = 0
6790: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
67a0: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 73 Called");.. s
67b0: 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d tatePtr->timer =
67c0: 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e (Tcl_TimerToken
67d0: 29 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 69 66 20 ) NULL;.. if
67e0: 28 42 49 4f 5f 77 70 65 6e 64 69 6e 67 28 73 74 (BIO_wpending(st
67f0: 61 74 65 50 74 72 2d 3e 62 69 6f 29 29 20 7b 0a atePtr->bio)) {.
6800: 09 64 70 72 69 6e 74 66 28 22 5b 63 68 61 6e 3d .dprintf("[chan=
6810: 25 70 5d 20 42 49 4f 20 77 72 69 74 61 62 6c 65 %p] BIO writable
6820: 22 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c ", statePtr->sel
6830: 66 29 3b 0a 0a 09 6d 61 73 6b 20 7c 3d 20 54 43 f);...mask |= TC
6840: 4c 5f 57 52 49 54 41 42 4c 45 3b 0a 20 20 20 20 L_WRITABLE;.
6850: 7d 0a 0a 20 20 20 20 69 66 20 28 42 49 4f 5f 70 }.. if (BIO_p
6860: 65 6e 64 69 6e 67 28 73 74 61 74 65 50 74 72 2d ending(statePtr-
6870: 3e 62 69 6f 29 29 20 7b 0a 09 64 70 72 69 6e 74 >bio)) {..dprint
6880: 66 28 22 5b 63 68 61 6e 3d 25 70 5d 20 42 49 4f f("[chan=%p] BIO
6890: 20 72 65 61 64 61 62 6c 65 22 2c 20 73 74 61 74 readable", stat
68a0: 65 50 74 72 2d 3e 73 65 6c 66 29 3b 0a 0a 09 6d ePtr->self);...m
68b0: 61 73 6b 20 7c 3d 20 54 43 4c 5f 52 45 41 44 41 ask |= TCL_READA
68c0: 42 4c 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 BLE;. }..
68d0: 64 70 72 69 6e 74 66 28 22 4e 6f 74 69 66 79 69 dprintf("Notifyi
68e0: 6e 67 20 6f 75 72 73 65 6c 76 65 73 22 29 3b 0a ng ourselves");.
68f0: 20 20 20 20 54 63 6c 5f 4e 6f 74 69 66 79 43 68 Tcl_NotifyCh
6900: 61 6e 6e 65 6c 28 73 74 61 74 65 50 74 72 2d 3e annel(statePtr->
6910: 73 65 6c 66 2c 20 6d 61 73 6b 29 3b 0a 0a 20 20 self, mask);..
6920: 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 dprintf("Retur
6930: 6e 69 6e 67 22 29 3b 0a 0a 20 20 20 20 72 65 74 ning");.. ret
6940: 75 72 6e 3b 0a 7d 0a 0a 54 63 6c 5f 43 68 61 6e urn;.}..Tcl_Chan
6950: 6e 65 6c 20 54 6c 73 5f 47 65 74 50 61 72 65 6e nel Tls_GetParen
6960: 74 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 t(State *statePt
6970: 72 2c 20 69 6e 74 20 6d 61 73 6b 46 6c 61 67 73 r, int maskFlags
6980: 29 20 7b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 ) {. dprintf(
6990: 22 52 65 71 75 65 73 74 65 64 20 74 6f 20 67 65 "Requested to ge
69a0: 74 20 70 61 72 65 6e 74 20 6f 66 20 63 68 61 6e t parent of chan
69b0: 6e 65 6c 20 25 70 22 2c 20 73 74 61 74 65 50 74 nel %p", statePt
69c0: 72 2d 3e 73 65 6c 66 29 3b 0a 0a 20 20 20 20 69 r->self);.. i
69d0: 66 20 28 28 73 74 61 74 65 50 74 72 2d 3e 66 6c f ((statePtr->fl
69e0: 61 67 73 20 26 20 7e 6d 61 73 6b 46 6c 61 67 73 ags & ~maskFlags
69f0: 29 20 26 20 54 4c 53 5f 54 43 4c 5f 46 41 53 54 ) & TLS_TCL_FAST
6a00: 50 41 54 48 29 20 7b 0a 09 64 70 72 69 6e 74 66 PATH) {..dprintf
6a10: 28 22 41 73 6b 65 64 20 74 6f 20 67 65 74 20 74 ("Asked to get t
6a20: 68 65 20 70 61 72 65 6e 74 20 63 68 61 6e 6e 65 he parent channe
6a30: 6c 20 77 68 69 6c 65 20 77 65 20 61 72 65 20 75 l while we are u
6a40: 73 69 6e 67 20 46 61 73 74 50 61 74 68 20 2d 2d sing FastPath --
6a50: 20 72 65 74 75 72 6e 69 6e 67 20 4e 55 4c 4c 22 returning NULL"
6a60: 29 3b 0a 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 );..return(NULL)
6a70: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 ;. }. retu
6a80: 72 6e 28 54 63 6c 5f 47 65 74 53 74 61 63 6b 65 rn(Tcl_GetStacke
6a90: 64 43 68 61 6e 6e 65 6c 28 73 74 61 74 65 50 74 dChannel(statePt
6aa0: 72 2d 3e 73 65 6c 66 29 29 3b 0a 7d 0a 0a 2f 2a r->self));.}../*
6ab0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
6ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6af0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 ------. *. * Tls
6b00: 5f 43 68 61 6e 6e 65 6c 54 79 70 65 20 2d 2d 0a _ChannelType --.
6b10: 20 2a 0a 20 2a 20 20 20 20 52 65 74 75 72 6e 20 *. * Return
6b20: 74 68 65 20 63 6f 72 72 65 63 74 20 54 4c 53 20 the correct TLS
6b30: 63 68 61 6e 6e 65 6c 20 64 72 69 76 65 72 20 69 channel driver i
6b40: 6e 66 6f 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 nfo. *. * Result
6b50: 73 3a 0a 20 2a 20 20 20 20 54 68 65 20 63 6f 72 s:. * The cor
6b60: 72 65 63 74 20 63 68 61 6e 6e 65 6c 20 64 72 69 rect channel dri
6b70: 76 65 72 20 66 6f 72 20 74 68 65 20 63 75 72 72 ver for the curr
6b80: 65 6e 74 20 76 65 72 73 69 6f 6e 20 6f 66 20 54 ent version of T
6b90: 63 6c 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 cl.. *. * Side e
6ba0: 66 66 65 63 74 73 3a 0a 20 2a 20 20 20 20 4e 6f ffects:. * No
6bb0: 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ne.. *. *-------
6bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
6c00: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 54 63 .static const Tc
6c10: 6c 5f 43 68 61 6e 6e 65 6c 54 79 70 65 20 74 6c l_ChannelType tl
6c20: 73 43 68 61 6e 6e 65 6c 54 79 70 65 20 3d 20 7b sChannelType = {
6c30: 0a 20 20 20 20 22 74 6c 73 22 2c 09 09 09 2f 2a . "tls",.../*
6c40: 20 54 79 70 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 Type name */.
6c50: 20 20 54 43 4c 5f 43 48 41 4e 4e 45 4c 5f 56 45 TCL_CHANNEL_VE
6c60: 52 53 49 4f 4e 5f 35 2c 09 2f 2a 20 76 35 20 63 RSION_5,./* v5 c
6c70: 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 54 6c hannel */. Tl
6c80: 73 43 6c 6f 73 65 50 72 6f 63 2c 09 09 2f 2a 20 sCloseProc,../*
6c90: 43 6c 6f 73 65 20 70 72 6f 63 20 2a 2f 0a 20 20 Close proc */.
6ca0: 20 20 54 6c 73 49 6e 70 75 74 50 72 6f 63 2c 09 TlsInputProc,.
6cb0: 09 2f 2a 20 49 6e 70 75 74 20 70 72 6f 63 20 2a ./* Input proc *
6cc0: 2f 0a 20 20 20 20 54 6c 73 4f 75 74 70 75 74 50 /. TlsOutputP
6cd0: 72 6f 63 2c 09 09 2f 2a 20 4f 75 74 70 75 74 20 roc,../* Output
6ce0: 70 72 6f 63 20 2a 2f 0a 20 20 20 20 4e 55 4c 4c proc */. NULL
6cf0: 2c 09 09 09 2f 2a 20 53 65 65 6b 20 70 72 6f 63 ,.../* Seek proc
6d00: 20 2a 2f 0a 20 20 20 20 54 6c 73 53 65 74 4f 70 */. TlsSetOp
6d10: 74 69 6f 6e 50 72 6f 63 2c 09 09 2f 2a 20 53 65 tionProc,../* Se
6d20: 74 20 6f 70 74 69 6f 6e 20 70 72 6f 63 20 2a 2f t option proc */
6d30: 0a 20 20 20 20 54 6c 73 47 65 74 4f 70 74 69 6f . TlsGetOptio
6d40: 6e 50 72 6f 63 2c 09 09 2f 2a 20 47 65 74 20 6f nProc,../* Get o
6d50: 70 74 69 6f 6e 20 70 72 6f 63 20 2a 2f 0a 20 20 ption proc */.
6d60: 20 20 54 6c 73 57 61 74 63 68 50 72 6f 63 2c 09 TlsWatchProc,.
6d70: 09 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6e ./* Initialize n
6d80: 6f 74 69 66 69 65 72 20 2a 2f 0a 20 20 20 20 54 otifier */. T
6d90: 6c 73 47 65 74 48 61 6e 64 6c 65 50 72 6f 63 2c lsGetHandleProc,
6da0: 09 09 2f 2a 20 47 65 74 20 4f 53 20 68 61 6e 64 ../* Get OS hand
6db0: 6c 65 73 20 6f 75 74 20 6f 66 20 63 68 61 6e 6e les out of chann
6dc0: 65 6c 20 2a 2f 0a 20 20 20 20 54 6c 73 43 6c 6f el */. TlsClo
6dd0: 73 65 32 50 72 6f 63 2c 09 09 2f 2a 20 63 6c 6f se2Proc,../* clo
6de0: 73 65 32 70 72 6f 63 20 2a 2f 0a 20 20 20 20 54 se2proc */. T
6df0: 6c 73 42 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 2c lsBlockModeProc,
6e00: 09 09 2f 2a 20 53 65 74 20 62 6c 6f 63 6b 69 6e ../* Set blockin
6e10: 67 2f 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 20 6d 6f g/nonblocking mo
6e20: 64 65 2a 2f 0a 20 20 20 20 4e 55 4c 4c 2c 09 09 de*/. NULL,..
6e30: 09 2f 2a 20 46 6c 75 73 68 20 70 72 6f 63 20 2a ./* Flush proc *
6e40: 2f 0a 20 20 20 20 54 6c 73 4e 6f 74 69 66 79 50 /. TlsNotifyP
6e50: 72 6f 63 2c 09 09 2f 2a 20 48 61 6e 64 6c 69 6e roc,../* Handlin
6e60: 67 20 6f 66 20 65 76 65 6e 74 73 20 62 75 62 62 g of events bubb
6e70: 6c 69 6e 67 20 75 70 20 2a 2f 0a 20 20 20 20 4e ling up */. N
6e80: 55 4c 4c 2c 09 09 09 2f 2a 20 57 69 64 65 20 73 ULL,.../* Wide s
6e90: 65 65 6b 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20 eek proc */.
6ea0: 4e 55 4c 4c 2c 09 09 09 2f 2a 20 54 68 72 65 61 NULL,.../* Threa
6eb0: 64 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 d action */.
6ec0: 4e 55 4c 4c 09 09 09 2f 2a 20 54 72 75 6e 63 61 NULL.../* Trunca
6ed0: 74 65 20 2a 2f 0a 7d 3b 0a 0a 63 6f 6e 73 74 20 te */.};..const
6ee0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 54 79 70 65 20 Tcl_ChannelType
6ef0: 2a 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 *Tls_ChannelType
6f00: 28 76 6f 69 64 29 20 7b 0a 20 20 20 20 72 65 74 (void) {. ret
6f10: 75 72 6e 20 26 74 6c 73 43 68 61 6e 6e 65 6c 54 urn &tlsChannelT
6f20: 79 70 65 3b 0a 7d 0a ype;.}.