0000: 2f 2a 0a 20 2a 20 50 72 6f 76 69 64 65 73 20 49 /*. * Provides I
0010: 4f 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 69 O functions to i
0020: 6e 74 65 72 66 61 63 65 20 62 65 74 77 65 65 6e nterface between
0030: 20 74 68 65 20 42 49 4f 20 62 75 66 66 65 72 73 the BIO buffers
0040: 20 61 6e 64 20 54 43 4c 0a 20 2a 20 61 70 70 6c and TCL. * appl
0050: 69 63 61 74 69 6f 6e 73 20 77 68 65 6e 20 75 73 ications when us
0060: 69 6e 67 20 73 74 61 63 6b 65 64 20 63 68 61 6e ing stacked chan
0070: 6e 65 6c 73 2e 0a 20 2a 0a 20 2a 20 43 6f 70 79 nels.. *. * Copy
0080: 72 69 67 68 74 20 28 43 29 20 31 39 39 37 2d 32 right (C) 1997-2
0090: 30 30 30 20 4d 61 74 74 20 4e 65 77 6d 61 6e 20 000 Matt Newman
00a0: 3c 6d 61 74 74 40 6e 6f 76 61 64 69 67 6d 2e 63 <matt@novadigm.c
00b0: 6f 6d 3e 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 om>. * Copyright
00c0: 20 28 43 29 20 32 30 30 30 20 41 6a 75 62 61 20 (C) 2000 Ajuba
00d0: 53 6f 6c 75 74 69 6f 6e 73 0a 20 2a 20 43 6f 70 Solutions. * Cop
00e0: 79 72 69 67 68 74 20 28 43 29 20 32 30 32 34 20 yright (C) 2024
00f0: 42 72 69 61 6e 20 4f 27 48 61 67 61 6e 0a 20 2a Brian O'Hagan. *
0100: 0a 20 2a 20 54 4c 53 20 28 61 6b 61 20 53 53 4c . * TLS (aka SSL
0110: 29 20 43 68 61 6e 6e 65 6c 20 2d 20 63 61 6e 20 ) Channel - can
0120: 62 65 20 6c 61 79 65 72 65 64 20 6f 6e 20 61 6e be layered on an
0130: 79 20 62 69 2d 64 69 72 65 63 74 69 6f 6e 61 6c y bi-directional
0140: 0a 20 2a 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 . * Tcl_Channel
0150: 28 4e 6f 74 65 3a 20 52 65 71 75 69 72 65 73 20 (Note: Requires
0160: 54 72 66 20 43 6f 72 65 20 50 61 74 63 68 29 0a Trf Core Patch).
0170: 20 2a 0a 20 2a 20 54 68 69 73 20 77 61 73 20 62 *. * This was b
0180: 75 69 6c 74 20 66 72 6f 6d 20 73 63 72 61 74 63 uilt from scratc
0190: 68 20 62 61 73 65 64 20 75 70 6f 6e 20 6f 62 73 h based upon obs
01a0: 65 72 76 61 74 69 6f 6e 20 6f 66 20 4f 70 65 6e ervation of Open
01b0: 53 53 4c 20 30 2e 39 2e 32 42 0a 20 2a 0a 20 2a SSL 0.9.2B. *. *
01c0: 20 41 64 64 69 74 69 6f 6e 20 63 72 65 64 69 74 Addition credit
01d0: 20 69 73 20 64 75 65 20 66 6f 72 20 41 6e 64 72 is due for Andr
01e0: 65 61 73 20 4b 75 70 72 69 65 73 20 28 61 2e 6b eas Kupries (a.k
01f0: 75 70 72 69 65 73 40 77 65 73 74 65 6e 64 2e 63 upries@westend.c
0200: 6f 6d 29 2c 20 66 6f 72 0a 20 2a 20 70 72 6f 76 om), for. * prov
0210: 69 64 69 6e 67 20 74 68 65 20 54 63 6c 5f 52 65 iding the Tcl_Re
0220: 70 6c 61 63 65 43 68 61 6e 6e 65 6c 20 6d 65 63 placeChannel mec
0230: 68 61 6e 69 73 6d 20 61 6e 64 20 77 6f 72 6b 69 hanism and worki
0240: 6e 67 20 63 6c 6f 73 65 6c 79 20 77 69 74 68 20 ng closely with
0250: 6d 65 0a 20 2a 20 74 6f 20 65 6e 68 61 6e 63 65 me. * to enhance
0260: 20 69 74 20 74 6f 20 73 75 70 70 6f 72 74 20 66 it to support f
0270: 75 6c 6c 20 66 69 6c 65 65 76 65 6e 74 20 73 65 ull fileevent se
0280: 6d 61 6e 74 69 63 73 2e 0a 20 2a 0a 20 2a 20 41 mantics.. *. * A
0290: 6c 73 6f 20 77 6f 72 6b 20 64 6f 6e 65 20 62 79 lso work done by
02a0: 20 74 68 65 20 66 6f 6c 6c 6f 77 20 70 65 6f 70 the follow peop
02b0: 6c 65 20 70 72 6f 76 69 64 65 64 20 74 68 65 20 le provided the
02c0: 69 6d 70 65 74 75 73 20 74 6f 20 64 6f 20 74 68 impetus to do th
02d0: 69 73 20 22 72 69 67 68 74 22 3a 0a 20 2a 20 20 is "right":. *
02e0: 20 20 74 63 6c 53 53 4c 20 28 43 6f 6c 69 6e 20 tclSSL (Colin
02f0: 4d 63 43 6f 72 6d 61 63 6b 2c 20 53 68 61 72 65 McCormack, Share
0300: 64 20 54 65 63 68 6e 6f 6c 6f 67 79 29 0a 20 2a d Technology). *
0310: 20 20 20 20 53 53 4c 74 63 6c 20 28 50 65 74 65 SSLtcl (Pete
0320: 72 20 41 6e 74 6d 61 6e 29 0a 20 2a 0a 20 2a 2f r Antman). *. */
0330: 0a 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c 73 49 ..#include "tlsI
0340: 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c nt.h".#include <
0350: 65 72 72 6e 6f 2e 68 3e 0a 0a 2f 2a 0a 20 2a 2d errno.h>../*. *-
0360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
03a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
03b0: 20 2a 20 54 6c 73 42 6c 6f 63 6b 4d 6f 64 65 50 * TlsBlockModeP
03c0: 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 roc --. *. *.Thi
03d0: 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 s procedure is i
03e0: 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20 67 65 nvoked by the ge
03f0: 6e 65 72 69 63 20 49 4f 20 6c 65 76 65 6c 20 74 neric IO level t
0400: 6f 20 73 65 74 20 63 68 61 6e 6e 65 6c 20 74 6f o set channel to
0410: 0a 20 2a 09 62 6c 6f 63 6b 69 6e 67 20 6f 72 20 . *.blocking or
0420: 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 nonblocking mode
0430: 2e 20 43 61 6c 6c 65 64 20 62 79 20 74 68 65 20 . Called by the
0440: 67 65 6e 65 72 69 63 20 49 2f 4f 20 6c 61 79 65 generic I/O laye
0450: 72 20 77 68 65 6e 65 76 65 72 0a 20 2a 09 74 68 r whenever. *.th
0460: 65 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c e Tcl_SetChannel
0470: 4f 70 74 69 6f 6e 28 29 20 66 75 6e 63 74 69 6f Option() functio
0480: 6e 20 69 73 20 75 73 65 64 20 77 69 74 68 20 6f n is used with o
0490: 70 74 69 6f 6e 20 2d 62 6c 6f 63 6b 69 6e 67 2e ption -blocking.
04a0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
04b0: 20 2a 20 20 20 20 30 20 69 66 20 73 75 63 63 65 * 0 if succe
04c0: 73 73 66 75 6c 20 6f 72 20 50 4f 53 49 58 20 65 ssful or POSIX e
04d0: 72 72 6f 72 20 63 6f 64 65 20 69 66 20 66 61 69 rror code if fai
04e0: 6c 65 64 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 led.. *. * Side
04f0: 65 66 66 65 63 74 73 3a 0a 20 2a 20 20 20 20 53 effects:. * S
0500: 65 74 73 20 74 68 65 20 64 65 76 69 63 65 20 69 ets the device i
0510: 6e 74 6f 20 62 6c 6f 63 6b 69 6e 67 20 6f 72 20 nto blocking or
0520: 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 nonblocking mode
0530: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d .. *. *---------
0540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0580: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
0590: 69 6e 74 20 54 6c 73 42 6c 6f 63 6b 4d 6f 64 65 int TlsBlockMode
05a0: 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20 Proc(ClientData
05b0: 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 69 6e instanceData, in
05c0: 74 20 6d 6f 64 65 29 20 7b 0a 20 20 20 20 53 74 t mode) {. St
05d0: 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 ate *statePtr =
05e0: 28 53 74 61 74 65 20 2a 29 20 69 6e 73 74 61 6e (State *) instan
05f0: 63 65 44 61 74 61 3b 0a 0a 20 20 20 20 69 66 20 ceData;.. if
0600: 28 6d 6f 64 65 20 3d 3d 20 54 43 4c 5f 4d 4f 44 (mode == TCL_MOD
0610: 45 5f 4e 4f 4e 42 4c 4f 43 4b 49 4e 47 29 20 7b E_NONBLOCKING) {
0620: 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 ..statePtr->flag
0630: 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 41 53 59 s |= TLS_TCL_ASY
0640: 4e 43 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b NC;. } else {
0650: 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 ..statePtr->flag
0660: 73 20 26 3d 20 7e 28 54 4c 53 5f 54 43 4c 5f 41 s &= ~(TLS_TCL_A
0670: 53 59 4e 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 SYNC);. }.
0680: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a return 0;.}../*
0690: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
06a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
06b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
06c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
06d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
06e0: 0a 20 2a 0a 20 2a 20 54 6c 73 43 6c 6f 73 65 50 . *. * TlsCloseP
06f0: 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 roc --. *. *.Thi
0700: 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 s procedure is i
0710: 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20 67 65 nvoked by the ge
0720: 6e 65 72 69 63 20 49 4f 20 6c 65 76 65 6c 20 74 neric IO level t
0730: 6f 20 70 65 72 66 6f 72 6d 20 63 68 61 6e 6e 65 o perform channe
0740: 6c 0a 20 2a 09 74 79 70 65 20 73 70 65 63 69 66 l. *.type specif
0750: 69 63 20 63 6c 65 61 6e 75 70 20 77 68 65 6e 20 ic cleanup when
0760: 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 a SSL socket bas
0770: 65 64 20 63 68 61 6e 6e 65 6c 20 69 73 20 63 6c ed channel is cl
0780: 6f 73 65 64 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 osed.. *. * Resu
0790: 6c 74 73 3a 0a 20 2a 20 20 20 20 30 20 69 66 20 lts:. * 0 if
07a0: 73 75 63 63 65 73 73 66 75 6c 20 6f 72 20 50 4f successful or PO
07b0: 53 49 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69 SIX error code i
07c0: 66 20 66 61 69 6c 65 64 2e 0a 20 2a 0a 20 2a 20 f failed.. *. *
07d0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
07e0: 20 20 20 20 43 6c 6f 73 65 73 20 74 68 65 20 73 Closes the s
07f0: 6f 63 6b 65 74 20 6f 66 20 74 68 65 20 63 68 61 ocket of the cha
0800: 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d nnel.. *. *-----
0810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0850: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 --------. */.sta
0860: 74 69 63 20 69 6e 74 20 54 6c 73 43 6c 6f 73 65 tic int TlsClose
0870: 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20 Proc(ClientData
0880: 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 54 63 instanceData, Tc
0890: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
08a0: 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 ) {. State *s
08b0: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 tatePtr = (State
08c0: 20 2a 29 20 69 6e 73 74 61 6e 63 65 44 61 74 61 *) instanceData
08d0: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
08e0: 54 6c 73 43 6c 6f 73 65 50 72 6f 63 28 25 70 29 TlsCloseProc(%p)
08f0: 22 2c 20 28 76 6f 69 64 20 2a 29 20 73 74 61 74 ", (void *) stat
0900: 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 ePtr);.. /* F
0910: 6c 75 73 68 20 61 6e 79 20 70 65 6e 64 69 6e 67 lush any pending
0920: 20 64 61 74 61 20 2a 2f 0a 0a 20 20 20 20 54 6c data */.. Tl
0930: 73 5f 43 6c 65 61 6e 28 73 74 61 74 65 50 74 72 s_Clean(statePtr
0940: 29 3b 0a 20 20 20 20 54 63 6c 5f 45 76 65 6e 74 );. Tcl_Event
0950: 75 61 6c 6c 79 46 72 65 65 28 28 43 6c 69 65 6e uallyFree((Clien
0960: 74 44 61 74 61 29 73 74 61 74 65 50 74 72 2c 20 tData)statePtr,
0970: 54 6c 73 5f 46 72 65 65 29 3b 0a 20 20 20 20 72 Tls_Free);. r
0980: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 20 eturn 0;.}../*.
0990: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
09a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
09b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
09c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
09d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
09e0: 2a 0a 20 2a 20 54 6c 73 43 6c 6f 73 65 32 50 72 *. * TlsClose2Pr
09f0: 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 53 69 6d 69 oc --. *. *.Simi
0a00: 6c 61 72 20 74 6f 20 54 6c 73 43 6c 6f 73 65 50 lar to TlsCloseP
0a10: 72 6f 63 2c 20 62 75 74 20 61 6c 6c 6f 77 73 20 roc, but allows
0a20: 66 6f 72 20 73 65 70 61 72 61 74 65 20 63 6c 6f for separate clo
0a30: 73 65 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 se read and writ
0a40: 65 0a 20 2a 09 73 69 64 65 20 6f 66 20 63 68 61 e. *.side of cha
0a50: 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d nnel.. *. *-----
0a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0aa0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 --------. */.sta
0ab0: 74 69 63 20 69 6e 74 20 54 6c 73 43 6c 6f 73 65 tic int TlsClose
0ac0: 32 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 2Proc(ClientData
0ad0: 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 20 instanceData,
0ae0: 20 20 2f 2a 20 54 68 65 20 73 6f 63 6b 65 74 20 /* The socket
0af0: 73 74 61 74 65 2e 20 2a 2f 0a 20 20 20 20 54 63 state. */. Tc
0b00: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
0b10: 2c 09 09 2f 2a 20 46 6f 72 20 65 72 72 6f 72 73 ,../* For errors
0b20: 20 2d 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 20 - can be NULL.
0b30: 2a 2f 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 */. int flags
0b40: 29 09 09 09 2f 2a 20 46 6c 61 67 73 20 74 6f 20 ).../* Flags to
0b50: 63 6c 6f 73 65 20 72 65 61 64 20 61 6e 64 2f 6f close read and/o
0b60: 72 20 77 72 69 74 65 20 73 69 64 65 20 6f 66 20 r write side of
0b70: 63 68 61 6e 6e 65 6c 20 2a 2f 0a 7b 0a 20 20 20 channel */.{.
0b80: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 State *statePtr
0b90: 20 3d 20 28 53 74 61 74 65 20 2a 29 20 69 6e 73 = (State *) ins
0ba0: 74 61 6e 63 65 44 61 74 61 3b 0a 0a 20 20 20 20 tanceData;..
0bb0: 64 70 72 69 6e 74 66 28 22 54 6c 73 43 6c 6f 73 dprintf("TlsClos
0bc0: 65 32 50 72 6f 63 28 25 70 29 22 2c 20 28 76 6f e2Proc(%p)", (vo
0bd0: 69 64 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b id *) statePtr);
0be0: 0a 0a 20 20 20 20 69 66 20 28 28 66 6c 61 67 73 .. if ((flags
0bf0: 20 26 20 28 54 43 4c 5f 43 4c 4f 53 45 5f 52 45 & (TCL_CLOSE_RE
0c00: 41 44 7c 54 43 4c 5f 43 4c 4f 53 45 5f 57 52 49 AD|TCL_CLOSE_WRI
0c10: 54 45 29 29 20 3d 3d 20 30 29 20 7b 0a 09 72 65 TE)) == 0) {..re
0c20: 74 75 72 6e 20 54 6c 73 43 6c 6f 73 65 50 72 6f turn TlsClosePro
0c30: 63 28 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 c(instanceData,
0c40: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 7d 0a 20 interp);. }.
0c50: 20 20 20 72 65 74 75 72 6e 20 45 49 4e 56 41 4c return EINVAL
0c60: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d ;.}../*. *------
0c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0cb0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c -------. *. * Tl
0cc0: 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 s_WaitForConnect
0cd0: 20 2d 2d 0a 20 2a 0a 20 2a 09 50 65 72 66 6f 72 --. *. *.Perfor
0ce0: 6d 20 63 6f 6e 6e 65 63 74 20 28 63 6c 69 65 6e m connect (clien
0cf0: 74 29 20 6f 72 20 61 63 63 65 70 74 20 28 73 65 t) or accept (se
0d00: 72 76 65 72 29 20 66 75 6e 63 74 69 6f 6e 2e 20 rver) function.
0d10: 41 6c 73 6f 20 70 65 72 66 6f 72 6d 73 0a 20 2a Also performs. *
0d20: 09 65 71 75 69 76 61 6c 65 6e 74 20 6f 66 20 68 .equivalent of h
0d30: 61 6e 64 73 68 61 6b 65 20 66 75 6e 63 74 69 6f andshake functio
0d40: 6e 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 3a n.. *. * Result:
0d50: 0a 20 2a 20 20 20 20 30 20 69 66 20 73 75 63 63 . * 0 if succ
0d60: 65 73 73 66 75 6c 2c 20 2d 31 20 69 66 20 66 61 essful, -1 if fa
0d70: 69 6c 65 64 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 iled.. *. * Side
0d80: 20 65 66 66 65 63 74 73 3a 0a 20 2a 20 20 20 20 effects:. *
0d90: 49 73 73 75 65 73 20 53 53 4c 5f 61 63 63 65 70 Issues SSL_accep
0da0: 74 20 6f 72 20 53 53 4c 5f 63 6f 6e 6e 65 63 74 t or SSL_connect
0db0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
0dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0e00: 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 54 6c 73 5f ---. */.int Tls_
0e10: 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 28 53 WaitForConnect(S
0e20: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c 20 tate *statePtr,
0e30: 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 int *errorCodePt
0e40: 72 2c 20 69 6e 74 20 68 61 6e 64 73 68 61 6b 65 r, int handshake
0e50: 46 61 69 6c 75 72 65 49 73 50 65 72 6d 61 6e 65 FailureIsPermane
0e60: 6e 74 29 20 7b 0a 20 20 20 20 75 6e 73 69 67 6e nt) {. unsign
0e70: 65 64 20 6c 6f 6e 67 20 62 61 63 6b 69 6e 67 45 ed long backingE
0e80: 72 72 6f 72 3b 0a 20 20 20 20 69 6e 74 20 65 72 rror;. int er
0e90: 72 2c 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 69 r, rc = 0;. i
0ea0: 6e 74 20 62 69 6f 53 68 6f 75 6c 64 52 65 74 72 nt bioShouldRetr
0eb0: 79 3b 0a 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 y;. *errorCod
0ec0: 65 50 74 72 20 3d 20 30 3b 0a 0a 20 20 20 20 64 ePtr = 0;.. d
0ed0: 70 72 69 6e 74 66 28 22 57 61 69 74 46 6f 72 43 printf("WaitForC
0ee0: 6f 6e 6e 65 63 74 28 25 70 29 22 2c 20 28 76 6f onnect(%p)", (vo
0ef0: 69 64 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b id *) statePtr);
0f00: 0a 20 20 20 20 64 70 72 69 6e 74 46 6c 61 67 73 . dprintFlags
0f10: 28 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 (statePtr);..
0f20: 20 2f 2a 20 43 61 6e 20 61 6c 73 6f 20 63 68 65 /* Can also che
0f30: 63 6b 20 53 53 4c 5f 69 73 5f 69 6e 69 74 5f 66 ck SSL_is_init_f
0f40: 69 6e 69 73 68 65 64 28 73 73 6c 29 20 2a 2f 0a inished(ssl) */.
0f50: 20 20 20 20 69 66 20 28 21 28 73 74 61 74 65 50 if (!(stateP
0f60: 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f tr->flags & TLS_
0f70: 54 43 4c 5f 49 4e 49 54 29 29 20 7b 0a 09 64 70 TCL_INIT)) {..dp
0f80: 72 69 6e 74 66 28 22 54 6c 73 5f 57 61 69 74 46 rintf("Tls_WaitF
0f90: 6f 72 43 6f 6e 6e 65 63 74 20 63 61 6c 6c 65 64 orConnect called
0fa0: 20 6f 6e 20 61 6c 72 65 61 64 79 20 69 6e 69 74 on already init
0fb0: 69 61 6c 69 7a 65 64 20 63 68 61 6e 6e 65 6c 20 ialized channel
0fc0: 2d 2d 20 72 65 74 75 72 6e 69 6e 67 20 77 69 74 -- returning wit
0fd0: 68 20 69 6d 6d 65 64 69 61 74 65 20 73 75 63 63 h immediate succ
0fe0: 65 73 73 22 29 3b 0a 09 72 65 74 75 72 6e 20 30 ess");..return 0
0ff0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 ;. }.. if
1000: 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 (statePtr->flags
1010: 20 26 20 54 4c 53 5f 54 43 4c 5f 48 41 4e 44 53 & TLS_TCL_HANDS
1020: 48 41 4b 45 5f 46 41 49 4c 45 44 29 20 7b 0a 09 HAKE_FAILED) {..
1030: 2f 2a 0a 09 20 2a 20 44 69 66 66 65 72 65 6e 74 /*.. * Different
1040: 20 74 79 70 65 73 20 6f 66 20 6f 70 65 72 61 74 types of operat
1050: 69 6f 6e 73 20 68 61 76 65 20 64 69 66 66 65 72 ions have differ
1060: 65 6e 74 20 72 65 71 75 69 72 65 6d 65 6e 74 73 ent requirements
1070: 0a 09 20 2a 20 53 53 4c 20 62 65 69 6e 67 20 65 .. * SSL being e
1080: 73 74 61 62 6c 69 73 68 65 64 0a 09 20 2a 2f 0a stablished.. */.
1090: 09 69 66 20 28 68 61 6e 64 73 68 61 6b 65 46 61 .if (handshakeFa
10a0: 69 6c 75 72 65 49 73 50 65 72 6d 61 6e 65 6e 74 ilureIsPermanent
10b0: 29 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 ) {.. dprintf
10c0: 28 22 41 73 6b 65 64 20 74 6f 20 77 61 69 74 20 ("Asked to wait
10d0: 66 6f 72 20 61 20 54 4c 53 20 68 61 6e 64 73 68 for a TLS handsh
10e0: 61 6b 65 20 74 68 61 74 20 68 61 73 20 61 6c 72 ake that has alr
10f0: 65 61 64 79 20 66 61 69 6c 65 64 2e 20 20 52 65 eady failed. Re
1100: 74 75 72 6e 69 6e 67 20 66 61 74 61 6c 20 65 72 turning fatal er
1110: 72 6f 72 22 29 3b 0a 09 20 20 20 20 2a 65 72 72 ror");.. *err
1120: 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 43 4f 4e orCodePtr = ECON
1130: 4e 41 42 4f 52 54 45 44 3b 0a 09 7d 20 65 6c 73 NABORTED;..} els
1140: 65 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 e {.. dprintf
1150: 28 22 41 73 6b 65 64 20 74 6f 20 77 61 69 74 20 ("Asked to wait
1160: 66 6f 72 20 61 20 54 4c 53 20 68 61 6e 64 73 68 for a TLS handsh
1170: 61 6b 65 20 74 68 61 74 20 68 61 73 20 61 6c 72 ake that has alr
1180: 65 61 64 79 20 66 61 69 6c 65 64 2e 20 20 52 65 eady failed. Re
1190: 74 75 72 6e 69 6e 67 20 73 6f 66 74 20 65 72 72 turning soft err
11a0: 6f 72 22 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f or");.. *erro
11b0: 72 43 6f 64 65 50 74 72 20 3d 20 45 43 4f 4e 4e rCodePtr = ECONN
11c0: 52 45 53 45 54 3b 0a 09 7d 0a 09 54 6c 73 5f 45 RESET;..}..Tls_E
11d0: 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20 22 rror(statePtr, "
11e0: 57 61 69 74 20 66 6f 72 20 66 61 69 6c 65 64 20 Wait for failed
11f0: 68 61 6e 64 73 68 61 6b 65 22 29 3b 0a 09 72 65 handshake");..re
1200: 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a turn -1;. }..
1210: 20 20 20 20 66 6f 72 20 28 3b 3b 29 20 7b 0a 09 for (;;) {..
1220: 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 ERR_clear_error(
1230: 29 3b 0a 0a 09 2f 2a 20 4e 6f 74 20 69 6e 69 74 );.../* Not init
1240: 69 61 6c 69 7a 65 64 20 79 65 74 21 20 41 6c 73 ialized yet! Als
1250: 6f 20 63 61 6c 6c 73 20 53 53 4c 5f 64 6f 5f 68 o calls SSL_do_h
1260: 61 6e 64 73 68 61 6b 65 28 29 2e 20 2a 2f 0a 09 andshake(). */..
1270: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 66 6c if (statePtr->fl
1280: 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f 53 45 ags & TLS_TCL_SE
1290: 52 56 45 52 29 20 7b 0a 09 20 20 20 20 64 70 72 RVER) {.. dpr
12a0: 69 6e 74 66 28 22 43 61 6c 6c 69 6e 67 20 53 53 intf("Calling SS
12b0: 4c 5f 61 63 63 65 70 74 28 29 22 29 3b 0a 09 20 L_accept()");..
12c0: 20 20 20 65 72 72 20 3d 20 53 53 4c 5f 61 63 63 err = SSL_acc
12d0: 65 70 74 28 73 74 61 74 65 50 74 72 2d 3e 73 73 ept(statePtr->ss
12e0: 6c 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 l);...} else {..
12f0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
1300: 6c 69 6e 67 20 53 53 4c 5f 63 6f 6e 6e 65 63 74 ling SSL_connect
1310: 28 29 22 29 3b 0a 09 20 20 20 20 65 72 72 20 3d ()");.. err =
1320: 20 53 53 4c 5f 63 6f 6e 6e 65 63 74 28 73 74 61 SSL_connect(sta
1330: 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 7d 0a tePtr->ssl);..}.
1340: 0a 09 69 66 20 28 65 72 72 20 3e 20 30 29 20 7b ..if (err > 0) {
1350: 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 41 .. dprintf("A
1360: 63 63 65 70 74 20 6f 72 20 63 6f 6e 6e 65 63 74 ccept or connect
1370: 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 22 was successful"
1380: 29 3b 0a 0a 09 20 20 20 20 65 72 72 20 3d 20 42 );... err = B
1390: 49 4f 5f 66 6c 75 73 68 28 73 74 61 74 65 50 74 IO_flush(statePt
13a0: 72 2d 3e 62 69 6f 29 3b 0a 09 20 20 20 20 69 66 r->bio);.. if
13b0: 20 28 65 72 72 20 3c 3d 20 30 29 20 7b 0a 09 09 (err <= 0) {...
13c0: 64 70 72 69 6e 74 66 28 22 46 6c 75 73 68 69 6e dprintf("Flushin
13d0: 67 20 74 68 65 20 6c 6f 77 65 72 20 6c 61 79 65 g the lower laye
13e0: 72 73 20 66 61 69 6c 65 64 2c 20 74 68 69 73 20 rs failed, this
13f0: 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20 74 65 will probably te
1400: 72 6d 69 6e 61 74 65 20 74 68 69 73 20 73 65 73 rminate this ses
1410: 73 69 6f 6e 22 29 3b 0a 09 20 20 20 20 7d 0a 09 sion");.. }..
1420: 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 64 70 } else {.. dp
1430: 72 69 6e 74 66 28 22 41 63 63 65 70 74 20 6f 72 rintf("Accept or
1440: 20 63 6f 6e 6e 65 63 74 20 66 61 69 6c 65 64 22 connect failed"
1450: 29 3b 0a 09 7d 0a 0a 09 72 63 20 3d 20 53 53 4c );..}...rc = SSL
1460: 5f 67 65 74 5f 65 72 72 6f 72 28 73 74 61 74 65 _get_error(state
1470: 50 74 72 2d 3e 73 73 6c 2c 20 65 72 72 29 3b 0a Ptr->ssl, err);.
1480: 09 62 61 63 6b 69 6e 67 45 72 72 6f 72 20 3d 20 .backingError =
1490: 45 52 52 5f 67 65 74 5f 65 72 72 6f 72 28 29 3b ERR_get_error();
14a0: 0a 09 69 66 20 28 72 63 20 21 3d 20 53 53 4c 5f ..if (rc != SSL_
14b0: 45 52 52 4f 52 5f 4e 4f 4e 45 29 20 7b 0a 09 20 ERROR_NONE) {..
14c0: 20 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20 dprintf("Got
14d0: 65 72 72 6f 72 3a 20 25 69 20 28 72 63 20 3d 20 error: %i (rc =
14e0: 25 69 29 22 2c 20 65 72 72 2c 20 72 63 29 3b 0a %i)", err, rc);.
14f0: 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 47 6f . dprintf("Go
1500: 74 20 65 72 72 6f 72 3a 20 25 73 22 2c 20 45 52 t error: %s", ER
1510: 52 5f 72 65 61 73 6f 6e 5f 65 72 72 6f 72 5f 73 R_reason_error_s
1520: 74 72 69 6e 67 28 62 61 63 6b 69 6e 67 45 72 72 tring(backingErr
1530: 6f 72 29 29 3b 0a 09 7d 0a 0a 09 62 69 6f 53 68 or));..}...bioSh
1540: 6f 75 6c 64 52 65 74 72 79 20 3d 20 30 3b 0a 09 ouldRetry = 0;..
1550: 69 66 20 28 65 72 72 20 3c 3d 20 30 29 20 7b 0a if (err <= 0) {.
1560: 09 20 20 20 20 69 66 20 28 72 63 20 3d 3d 20 53 . if (rc == S
1570: 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 43 4f SL_ERROR_WANT_CO
1580: 4e 4e 45 43 54 20 7c 7c 20 72 63 20 3d 3d 20 53 NNECT || rc == S
1590: 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 41 43 SL_ERROR_WANT_AC
15a0: 43 45 50 54 29 20 7b 0a 09 09 62 69 6f 53 68 6f CEPT) {...bioSho
15b0: 75 6c 64 52 65 74 72 79 20 3d 20 31 3b 0a 09 20 uldRetry = 1;..
15c0: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 72 63 } else if (rc
15d0: 20 3d 3d 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 == SSL_ERROR_WA
15e0: 4e 54 5f 52 45 41 44 29 20 7b 0a 09 09 62 69 6f NT_READ) {...bio
15f0: 53 68 6f 75 6c 64 52 65 74 72 79 20 3d 20 31 3b ShouldRetry = 1;
1600: 0a 09 09 73 74 61 74 65 50 74 72 2d 3e 77 61 6e ...statePtr->wan
1610: 74 20 3d 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 t = TCL_READABLE
1620: 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 ;.. } else if
1630: 20 28 72 63 20 3d 3d 20 53 53 4c 5f 45 52 52 4f (rc == SSL_ERRO
1640: 52 5f 57 41 4e 54 5f 57 52 49 54 45 29 20 7b 0a R_WANT_WRITE) {.
1650: 09 09 62 69 6f 53 68 6f 75 6c 64 52 65 74 72 79 ..bioShouldRetry
1660: 20 3d 20 31 3b 0a 09 09 73 74 61 74 65 50 74 72 = 1;...statePtr
1670: 2d 3e 77 61 6e 74 20 3d 20 54 43 4c 5f 57 52 49 ->want = TCL_WRI
1680: 54 41 42 4c 45 3b 0a 09 20 20 20 20 7d 20 65 6c TABLE;.. } el
1690: 73 65 20 69 66 20 28 42 49 4f 5f 73 68 6f 75 6c se if (BIO_shoul
16a0: 64 5f 72 65 74 72 79 28 73 74 61 74 65 50 74 72 d_retry(statePtr
16b0: 2d 3e 62 69 6f 29 29 20 7b 0a 09 09 62 69 6f 53 ->bio)) {...bioS
16c0: 68 6f 75 6c 64 52 65 74 72 79 20 3d 20 31 3b 0a houldRetry = 1;.
16d0: 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
16e0: 72 63 20 3d 3d 20 53 53 4c 5f 45 52 52 4f 52 5f rc == SSL_ERROR_
16f0: 53 59 53 43 41 4c 4c 20 26 26 20 54 63 6c 5f 47 SYSCALL && Tcl_G
1700: 65 74 45 72 72 6e 6f 28 29 20 3d 3d 20 45 41 47 etErrno() == EAG
1710: 41 49 4e 29 20 7b 0a 09 09 62 69 6f 53 68 6f 75 AIN) {...bioShou
1720: 6c 64 52 65 74 72 79 20 3d 20 31 3b 0a 09 20 20 ldRetry = 1;..
1730: 20 20 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 }..} else {..
1740: 20 20 20 69 66 20 28 21 53 53 4c 5f 69 73 5f 69 if (!SSL_is_i
1750: 6e 69 74 5f 66 69 6e 69 73 68 65 64 28 73 74 61 nit_finished(sta
1760: 74 65 50 74 72 2d 3e 73 73 6c 29 29 20 7b 0a 09 tePtr->ssl)) {..
1770: 09 62 69 6f 53 68 6f 75 6c 64 52 65 74 72 79 20 .bioShouldRetry
1780: 3d 20 31 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a = 1;.. }..}..
1790: 09 69 66 20 28 62 69 6f 53 68 6f 75 6c 64 52 65 .if (bioShouldRe
17a0: 74 72 79 29 20 7b 0a 09 20 20 20 20 64 70 72 69 try) {.. dpri
17b0: 6e 74 66 28 22 54 68 65 20 49 2f 4f 20 64 69 64 ntf("The I/O did
17c0: 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 2d 2d not complete --
17d0: 20 62 75 74 20 77 65 20 73 68 6f 75 6c 64 20 74 but we should t
17e0: 72 79 20 69 74 20 61 67 61 69 6e 22 29 3b 0a 0a ry it again");..
17f0: 09 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
1800: 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 r->flags & TLS_T
1810: 43 4c 5f 41 53 59 4e 43 29 20 7b 0a 09 09 64 70 CL_ASYNC) {...dp
1820: 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 rintf("Returning
1830: 20 45 41 47 41 49 4e 20 73 6f 20 74 68 61 74 20 EAGAIN so that
1840: 69 74 20 63 61 6e 20 62 65 20 72 65 74 72 69 65 it can be retrie
1850: 64 20 6c 61 74 65 72 22 29 3b 0a 09 09 2a 65 72 d later");...*er
1860: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 41 47 rorCodePtr = EAG
1870: 41 49 4e 3b 0a 09 09 54 6c 73 5f 45 72 72 6f 72 AIN;...Tls_Error
1880: 28 73 74 61 74 65 50 74 72 2c 20 22 48 61 6e 64 (statePtr, "Hand
1890: 73 68 61 6b 65 20 6e 6f 74 20 63 6f 6d 70 6c 65 shake not comple
18a0: 74 65 2c 20 77 69 6c 6c 20 72 65 74 72 79 20 6c te, will retry l
18b0: 61 74 65 72 22 29 3b 0a 09 09 72 65 74 75 72 6e ater");...return
18c0: 20 2d 31 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 -1;.. } else
18d0: 20 7b 0a 09 09 64 70 72 69 6e 74 66 28 22 44 6f {...dprintf("Do
18e0: 69 6e 67 20 73 6f 20 6e 6f 77 22 29 3b 0a 09 09 ing so now");...
18f0: 63 6f 6e 74 69 6e 75 65 3b 0a 09 20 20 20 20 7d continue;.. }
1900: 0a 09 7d 0a 0a 09 64 70 72 69 6e 74 66 28 22 57 ..}...dprintf("W
1910: 65 20 68 61 76 65 20 65 69 74 68 65 72 20 63 6f e have either co
1920: 6d 70 6c 65 74 65 6c 79 20 65 73 74 61 62 6c 69 mpletely establi
1930: 73 68 65 64 20 74 68 65 20 73 65 73 73 69 6f 6e shed the session
1940: 20 6f 72 20 63 6f 6d 70 6c 65 74 65 6c 79 20 66 or completely f
1950: 61 69 6c 65 64 20 69 74 20 2d 2d 20 74 68 65 72 ailed it -- ther
1960: 65 20 69 73 20 6e 6f 20 6d 6f 72 65 20 6e 65 65 e is no more nee
1970: 64 20 74 6f 20 65 76 65 72 20 72 65 74 72 79 20 d to ever retry
1980: 69 74 20 74 68 6f 75 67 68 22 29 3b 0a 09 62 72 it though");..br
1990: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 eak;. }..
19a0: 73 77 69 74 63 68 20 28 72 63 29 20 7b 0a 09 63 switch (rc) {..c
19b0: 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 4e 4f ase SSL_ERROR_NO
19c0: 4e 45 3a 0a 09 20 20 20 20 2f 2a 20 54 68 65 20 NE:.. /* The
19d0: 54 4c 53 2f 53 53 4c 20 49 2f 4f 20 6f 70 65 72 TLS/SSL I/O oper
19e0: 61 74 69 6f 6e 20 63 6f 6d 70 6c 65 74 65 64 20 ation completed
19f0: 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 */.. dprintf(
1a00: 22 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 "The connection
1a10: 69 73 20 67 6f 6f 64 22 29 3b 0a 09 20 20 20 20 is good");..
1a20: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 *errorCodePtr =
1a30: 30 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 0;.. break;..
1a40: 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f .case SSL_ERROR_
1a50: 53 53 4c 3a 0a 09 20 20 20 20 2f 2a 20 41 20 6e SSL:.. /* A n
1a60: 6f 6e 2d 72 65 63 6f 76 65 72 61 62 6c 65 2c 20 on-recoverable,
1a70: 66 61 74 61 6c 20 65 72 72 6f 72 20 69 6e 20 74 fatal error in t
1a80: 68 65 20 53 53 4c 20 6c 69 62 72 61 72 79 20 6f he SSL library o
1a90: 63 63 75 72 72 65 64 2c 20 75 73 75 61 6c 6c 79 ccurred, usually
1aa0: 20 61 20 70 72 6f 74 6f 63 6f 6c 20 65 72 72 6f a protocol erro
1ab0: 72 20 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e 74 r */.. dprint
1ac0: 66 28 22 53 53 4c 5f 45 52 52 4f 52 5f 53 53 4c f("SSL_ERROR_SSL
1ad0: 3a 20 47 6f 74 20 70 65 72 6d 61 6e 65 6e 74 20 : Got permanent
1ae0: 66 61 74 61 6c 20 53 53 4c 20 65 72 72 6f 72 2c fatal SSL error,
1af0: 20 61 62 6f 72 74 69 6e 67 20 69 6d 6d 65 64 69 aborting immedi
1b00: 61 74 65 6c 79 22 29 3b 0a 09 20 20 20 20 69 66 ately");.. if
1b10: 20 28 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 (SSL_get_verify
1b20: 5f 72 65 73 75 6c 74 28 73 74 61 74 65 50 74 72 _result(statePtr
1b30: 2d 3e 73 73 6c 29 20 21 3d 20 58 35 30 39 5f 56 ->ssl) != X509_V
1b40: 5f 4f 4b 29 20 7b 0a 09 09 54 6c 73 5f 45 72 72 _OK) {...Tls_Err
1b50: 6f 72 28 73 74 61 74 65 50 74 72 2c 20 58 35 30 or(statePtr, X50
1b60: 39 5f 76 65 72 69 66 79 5f 63 65 72 74 5f 65 72 9_verify_cert_er
1b70: 72 6f 72 5f 73 74 72 69 6e 67 28 53 53 4c 5f 67 ror_string(SSL_g
1b80: 65 74 5f 76 65 72 69 66 79 5f 72 65 73 75 6c 74 et_verify_result
1b90: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 29 (statePtr->ssl))
1ba0: 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 69 );.. }.. i
1bb0: 66 20 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 20 f (backingError
1bc0: 21 3d 20 30 29 20 7b 0a 09 09 54 6c 73 5f 45 72 != 0) {...Tls_Er
1bd0: 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20 45 52 ror(statePtr, ER
1be0: 52 5f 72 65 61 73 6f 6e 5f 65 72 72 6f 72 5f 73 R_reason_error_s
1bf0: 74 72 69 6e 67 28 62 61 63 6b 69 6e 67 45 72 72 tring(backingErr
1c00: 6f 72 29 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 or));.. }..
1c10: 20 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 statePtr->flag
1c20: 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 48 41 4e s |= TLS_TCL_HAN
1c30: 44 53 48 41 4b 45 5f 46 41 49 4c 45 44 3b 0a 09 DSHAKE_FAILED;..
1c40: 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 *errorCodePt
1c50: 72 20 3d 20 45 43 4f 4e 4e 41 42 4f 52 54 45 44 r = ECONNABORTED
1c60: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 2d 31 ;.. return -1
1c70: 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52 ;...case SSL_ERR
1c80: 4f 52 5f 53 59 53 43 41 4c 4c 3a 0a 09 20 20 20 OR_SYSCALL:..
1c90: 20 2f 2a 20 53 6f 6d 65 20 6e 6f 6e 2d 72 65 63 /* Some non-rec
1ca0: 6f 76 65 72 61 62 6c 65 2c 20 66 61 74 61 6c 20 overable, fatal
1cb0: 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 72 I/O error occurr
1cc0: 65 64 20 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e ed */.. dprin
1cd0: 74 66 28 22 53 53 4c 5f 45 52 52 4f 52 5f 53 59 tf("SSL_ERROR_SY
1ce0: 53 43 41 4c 4c 22 29 3b 0a 0a 09 20 20 20 20 69 SCALL");... i
1cf0: 66 20 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 20 f (backingError
1d00: 3d 3d 20 30 20 26 26 20 65 72 72 20 3d 3d 20 30 == 0 && err == 0
1d10: 29 20 7b 0a 09 09 64 70 72 69 6e 74 66 28 22 45 ) {...dprintf("E
1d20: 4f 46 20 72 65 61 63 68 65 64 22 29 0a 09 09 2a OF reached")...*
1d30: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 errorCodePtr = E
1d40: 43 4f 4e 4e 52 45 53 45 54 3b 0a 09 09 54 6c 73 CONNRESET;...Tls
1d50: 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c _Error(statePtr,
1d60: 20 22 28 75 6e 65 78 70 65 63 74 65 64 29 20 45 "(unexpected) E
1d70: 4f 46 20 72 65 61 63 68 65 64 22 29 3b 0a 0a 09 OF reached");...
1d80: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 62 } else if (b
1d90: 61 63 6b 69 6e 67 45 72 72 6f 72 20 3d 3d 20 30 ackingError == 0
1da0: 20 26 26 20 65 72 72 20 3d 3d 20 2d 31 29 20 7b && err == -1) {
1db0: 0a 09 09 64 70 72 69 6e 74 66 28 22 49 2f 4f 20 ...dprintf("I/O
1dc0: 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 28 error occurred (
1dd0: 65 72 72 6e 6f 20 3d 20 25 6c 75 29 22 2c 20 28 errno = %lu)", (
1de0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 54 unsigned long) T
1df0: 63 6c 5f 47 65 74 45 72 72 6e 6f 28 29 29 3b 0a cl_GetErrno());.
1e00: 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 ..*errorCodePtr
1e10: 3d 20 54 63 6c 5f 47 65 74 45 72 72 6e 6f 28 29 = Tcl_GetErrno()
1e20: 3b 0a 09 09 69 66 20 28 2a 65 72 72 6f 72 43 6f ;...if (*errorCo
1e30: 64 65 50 74 72 20 3d 3d 20 45 43 4f 4e 4e 52 45 dePtr == ECONNRE
1e40: 53 45 54 29 20 7b 0a 09 09 20 20 20 20 2a 65 72 SET) {... *er
1e50: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 43 4f rorCodePtr = ECO
1e60: 4e 4e 41 42 4f 52 54 45 44 3b 0a 09 09 7d 0a 09 NNABORTED;...}..
1e70: 09 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 .Tls_Error(state
1e80: 50 74 72 2c 20 54 63 6c 5f 45 72 72 6e 6f 4d 73 Ptr, Tcl_ErrnoMs
1e90: 67 28 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29 g(*errorCodePtr)
1ea0: 29 3b 0a 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 );... } else
1eb0: 7b 0a 09 09 64 70 72 69 6e 74 66 28 22 49 2f 4f {...dprintf("I/O
1ec0: 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 error occurred
1ed0: 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 20 3d 20 (backingError =
1ee0: 25 6c 75 29 22 2c 20 62 61 63 6b 69 6e 67 45 72 %lu)", backingEr
1ef0: 72 6f 72 29 3b 0a 09 09 2a 65 72 72 6f 72 43 6f ror);...*errorCo
1f00: 64 65 50 74 72 20 3d 20 54 63 6c 5f 47 65 74 45 dePtr = Tcl_GetE
1f10: 72 72 6e 6f 28 29 3b 0a 09 09 69 66 20 28 2a 65 rrno();...if (*e
1f20: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 3d 20 45 rrorCodePtr == E
1f30: 43 4f 4e 4e 52 45 53 45 54 29 20 7b 0a 09 09 20 CONNRESET) {...
1f40: 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 *errorCodePtr
1f50: 20 3d 20 45 43 4f 4e 4e 41 42 4f 52 54 45 44 3b = ECONNABORTED;
1f60: 0a 09 09 7d 0a 09 09 54 6c 73 5f 45 72 72 6f 72 ...}...Tls_Error
1f70: 28 73 74 61 74 65 50 74 72 2c 20 45 52 52 5f 72 (statePtr, ERR_r
1f80: 65 61 73 6f 6e 5f 65 72 72 6f 72 5f 73 74 72 69 eason_error_stri
1f90: 6e 67 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 29 ng(backingError)
1fa0: 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 );.. }...
1fb0: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 statePtr->flags
1fc0: 7c 3d 20 54 4c 53 5f 54 43 4c 5f 48 41 4e 44 53 |= TLS_TCL_HANDS
1fd0: 48 41 4b 45 5f 46 41 49 4c 45 44 3b 0a 09 20 20 HAKE_FAILED;..
1fe0: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 0a 09 63 return -1;...c
1ff0: 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 5a 45 ase SSL_ERROR_ZE
2000: 52 4f 5f 52 45 54 55 52 4e 3a 0a 09 20 20 20 20 RO_RETURN:..
2010: 2f 2a 20 54 68 65 20 54 4c 53 2f 53 53 4c 20 70 /* The TLS/SSL p
2020: 65 65 72 20 68 61 73 20 63 6c 6f 73 65 64 20 74 eer has closed t
2030: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6f he connection fo
2040: 72 20 77 72 69 74 69 6e 67 20 62 79 20 73 65 6e r writing by sen
2050: 64 69 6e 67 20 74 68 65 20 63 6c 6f 73 65 5f 6e ding the close_n
2060: 6f 74 69 66 79 20 61 6c 65 72 74 20 2a 2f 0a 09 otify alert */..
2070: 20 20 20 20 64 70 72 69 6e 74 66 28 22 53 53 4c dprintf("SSL
2080: 5f 45 52 52 4f 52 5f 5a 45 52 4f 5f 52 45 54 55 _ERROR_ZERO_RETU
2090: 52 4e 3a 20 43 6f 6e 6e 65 63 74 20 72 65 74 75 RN: Connect retu
20a0: 72 6e 65 64 20 61 6e 20 69 6e 76 61 6c 69 64 20 rned an invalid
20b0: 76 61 6c 75 65 2e 2e 2e 22 29 3b 0a 09 20 20 20 value...");..
20c0: 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d *errorCodePtr =
20d0: 20 45 49 4e 56 41 4c 3b 0a 09 20 20 20 20 54 6c EINVAL;.. Tl
20e0: 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 s_Error(statePtr
20f0: 2c 20 22 50 65 65 72 20 68 61 73 20 63 6c 6f 73 , "Peer has clos
2100: 65 64 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f ed the connectio
2110: 6e 20 66 6f 72 20 77 72 69 74 69 6e 67 20 62 79 n for writing by
2120: 20 73 65 6e 64 69 6e 67 20 74 68 65 20 63 6c 6f sending the clo
2130: 73 65 5f 6e 6f 74 69 66 79 20 61 6c 65 72 74 22 se_notify alert"
2140: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 2d );.. return -
2150: 31 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 1;...case SSL_ER
2160: 52 4f 52 5f 57 41 4e 54 5f 52 45 41 44 3a 0a 09 ROR_WANT_READ:..
2170: 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 57 case SSL_ERROR_W
2180: 41 4e 54 5f 57 52 49 54 45 3a 0a 09 63 61 73 65 ANT_WRITE:..case
2190: 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f SSL_ERROR_WANT_
21a0: 58 35 30 39 5f 4c 4f 4f 4b 55 50 3a 0a 09 63 61 X509_LOOKUP:..ca
21b0: 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e se SSL_ERROR_WAN
21c0: 54 5f 43 4f 4e 4e 45 43 54 3a 0a 09 63 61 73 65 T_CONNECT:..case
21d0: 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f SSL_ERROR_WANT_
21e0: 41 43 43 45 50 54 3a 0a 09 63 61 73 65 20 53 53 ACCEPT:..case SS
21f0: 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 41 53 59 L_ERROR_WANT_ASY
2200: 4e 43 3a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 NC:..case SSL_ER
2210: 52 4f 52 5f 57 41 4e 54 5f 41 53 59 4e 43 5f 4a ROR_WANT_ASYNC_J
2220: 4f 42 3a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 OB:..case SSL_ER
2230: 52 4f 52 5f 57 41 4e 54 5f 43 4c 49 45 4e 54 5f ROR_WANT_CLIENT_
2240: 48 45 4c 4c 4f 5f 43 42 3a 0a 23 69 66 20 4f 50 HELLO_CB:.#if OP
2250: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 ENSSL_VERSION_NU
2260: 4d 42 45 52 20 3e 3d 20 30 78 33 30 30 30 30 30 MBER >= 0x300000
2270: 30 30 4c 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 00L..case SSL_ER
2280: 52 4f 52 5f 57 41 4e 54 5f 52 45 54 52 59 5f 56 ROR_WANT_RETRY_V
2290: 45 52 49 46 59 3a 0a 23 65 6e 64 69 66 0a 09 64 ERIFY:.#endif..d
22a0: 65 66 61 75 6c 74 3a 0a 09 20 20 20 20 2f 2a 20 efault:.. /*
22b0: 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 64 69 The operation di
22c0: 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 61 d not complete a
22d0: 6e 64 20 73 68 6f 75 6c 64 20 62 65 20 72 65 74 nd should be ret
22e0: 72 69 65 64 20 6c 61 74 65 72 2e 20 2a 2f 0a 09 ried later. */..
22f0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 4f 70 65 dprintf("Ope
2300: 72 61 74 69 6f 6e 20 64 69 64 20 6e 6f 74 20 63 ration did not c
2310: 6f 6d 70 6c 65 74 65 2c 20 63 61 6c 6c 20 66 75 omplete, call fu
2320: 6e 63 74 69 6f 6e 20 61 67 61 69 6e 20 6c 61 74 nction again lat
2330: 65 72 3a 20 25 69 22 2c 20 72 63 29 3b 0a 09 20 er: %i", rc);..
2340: 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 *errorCodePtr
2350: 20 3d 20 45 41 47 41 49 4e 3b 0a 09 20 20 20 20 = EAGAIN;..
2360: 64 70 72 69 6e 74 66 28 22 45 52 52 28 25 64 2c dprintf("ERR(%d,
2370: 20 25 64 29 20 22 2c 20 72 63 2c 20 2a 65 72 72 %d) ", rc, *err
2380: 6f 72 43 6f 64 65 50 74 72 29 3b 0a 09 20 20 20 orCodePtr);..
2390: 20 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 Tls_Error(state
23a0: 50 74 72 2c 20 22 4f 70 65 72 61 74 69 6f 6e 20 Ptr, "Operation
23b0: 64 69 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 did not complete
23c0: 2c 20 63 61 6c 6c 20 66 75 6e 63 74 69 6f 6e 20 , call function
23d0: 61 67 61 69 6e 20 6c 61 74 65 72 22 29 3b 0a 09 again later");..
23e0: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 return -1;.
23f0: 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 }.. dprint
2400: 66 28 22 52 65 6d 6f 76 69 6e 67 20 74 68 65 20 f("Removing the
2410: 5c 22 54 4c 53 5f 54 43 4c 5f 49 4e 49 54 5c 22 \"TLS_TCL_INIT\"
2420: 20 66 6c 61 67 20 73 69 6e 63 65 20 77 65 20 68 flag since we h
2430: 61 76 65 20 63 6f 6d 70 6c 65 74 65 64 20 74 68 ave completed th
2440: 65 20 68 61 6e 64 73 68 61 6b 65 22 29 3b 0a 20 e handshake");.
2450: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 statePtr->fla
2460: 67 73 20 26 3d 20 7e 54 4c 53 5f 54 43 4c 5f 49 gs &= ~TLS_TCL_I
2470: 4e 49 54 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 NIT;.. dprint
2480: 66 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 f("Returning in
2490: 73 75 63 63 65 73 73 22 29 3b 0a 20 20 20 20 2a success");. *
24a0: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 30 errorCodePtr = 0
24b0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a ;. return 0;.
24c0: 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d }../*. *--------
24d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
24e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
24f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2510: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 49 -----. *. * TlsI
2520: 6e 70 75 74 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 nputProc --. *.
2530: 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 *.This procedure
2540: 20 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 is invoked by t
2550: 68 65 20 67 65 6e 65 72 69 63 20 49 4f 20 6c 65 he generic IO le
2560: 76 65 6c 20 74 6f 20 72 65 61 64 20 64 61 74 61 vel to read data
2570: 20 66 72 6f 6d 20 74 68 65 0a 20 2a 09 42 49 6f from the. *.BIo
2580: 2e 20 45 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 . Equivalent to
2590: 53 53 4c 5f 72 65 61 64 2e 0a 20 2a 09 43 61 6c SSL_read.. *.Cal
25a0: 6c 65 64 20 62 79 20 74 68 65 20 67 65 6e 65 72 led by the gener
25b0: 69 63 20 49 2f 4f 20 6c 61 79 65 72 20 77 68 65 ic I/O layer whe
25c0: 6e 65 76 65 72 20 74 68 65 20 54 63 6c 5f 52 65 never the Tcl_Re
25d0: 61 64 28 29 2c 20 54 63 6c 5f 52 65 61 64 43 68 ad(), Tcl_ReadCh
25e0: 61 72 73 2c 0a 20 2a 09 54 63 6c 5f 47 65 74 73 ars,. *.Tcl_Gets
25f0: 2c 20 61 6e 64 20 54 63 6c 5f 47 65 74 73 4f 62 , and Tcl_GetsOb
2600: 6a 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 j functions are
2610: 75 73 65 64 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 used.. *. * Resu
2620: 6c 74 73 3a 0a 20 2a 09 52 65 74 75 72 6e 73 20 lts:. *.Returns
2630: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 the number of by
2640: 74 65 73 20 72 65 61 64 20 6f 72 20 2d 31 20 6f tes read or -1 o
2650: 6e 20 65 72 72 6f 72 2e 20 53 65 74 73 20 65 72 n error. Sets er
2660: 72 6f 72 43 6f 64 65 50 74 72 20 74 6f 0a 20 2a rorCodePtr to. *
2670: 09 61 20 50 4f 53 49 58 20 65 72 72 6f 72 20 63 .a POSIX error c
2680: 6f 64 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 ode if an error
2690: 6f 63 63 75 72 72 65 64 2c 20 6f 72 20 30 20 69 occurred, or 0 i
26a0: 66 20 6e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69 f none.. *. * Si
26b0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 20 20 de effects:. *
26c0: 20 20 52 65 61 64 73 20 69 6e 70 75 74 20 66 72 Reads input fr
26d0: 6f 6d 20 74 68 65 20 69 6e 70 75 74 20 64 65 76 om the input dev
26e0: 69 63 65 20 6f 66 20 74 68 65 20 63 68 61 6e 6e ice of the chann
26f0: 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d el.. *. *-------
2700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2740: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 ------. */.stati
2750: 63 20 69 6e 74 20 54 6c 73 49 6e 70 75 74 50 72 c int TlsInputPr
2760: 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e oc(ClientData in
2770: 73 74 61 6e 63 65 44 61 74 61 2c 20 63 68 61 72 stanceData, char
2780: 20 2a 62 75 66 2c 20 69 6e 74 20 62 75 66 53 69 *buf, int bufSi
2790: 7a 65 2c 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f ze, int *errorCo
27a0: 64 65 50 74 72 29 20 7b 0a 20 20 20 20 75 6e 73 dePtr) {. uns
27b0: 69 67 6e 65 64 20 6c 6f 6e 67 20 62 61 63 6b 69 igned long backi
27c0: 6e 67 45 72 72 6f 72 3b 0a 20 20 20 20 53 74 61 ngError;. Sta
27d0: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 te *statePtr = (
27e0: 53 74 61 74 65 20 2a 29 20 69 6e 73 74 61 6e 63 State *) instanc
27f0: 65 44 61 74 61 3b 0a 20 20 20 20 69 6e 74 20 62 eData;. int b
2800: 79 74 65 73 52 65 61 64 2c 20 65 72 72 3b 0a 20 ytesRead, err;.
2810: 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 *errorCodePtr
2820: 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e = 0;.. dprin
2830: 74 66 28 22 52 65 61 64 28 25 64 29 22 2c 20 62 tf("Read(%d)", b
2840: 75 66 53 69 7a 65 29 3b 0a 0a 20 20 20 20 2f 2a ufSize);.. /*
2850: 20 53 6b 69 70 20 69 66 20 75 73 65 72 20 76 65 Skip if user ve
2860: 72 69 66 79 20 63 61 6c 6c 62 61 63 6b 20 69 73 rify callback is
2870: 20 73 74 69 6c 6c 20 72 75 6e 6e 69 6e 67 20 2a still running *
2880: 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 /. if (stateP
2890: 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f tr->flags & TLS_
28a0: 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 29 20 7b 0a TCL_CALLBACK) {.
28b0: 09 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 62 61 .dprintf("Callba
28c0: 63 6b 20 69 73 20 72 75 6e 6e 69 6e 67 2c 20 72 ck is running, r
28d0: 65 61 64 69 6e 67 20 30 20 62 79 74 65 73 22 29 eading 0 bytes")
28e0: 3b 0a 09 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 ;..return 0;.
28f0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f }.. /* If no
2900: 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 64 t initialized, d
2910: 6f 20 63 6f 6e 6e 65 63 74 20 2a 2f 0a 20 20 20 o connect */.
2920: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 66 if (statePtr->f
2930: 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f 49 lags & TLS_TCL_I
2940: 4e 49 54 29 20 7b 0a 09 69 6e 74 20 74 6c 73 43 NIT) {..int tlsC
2950: 6f 6e 6e 65 63 74 3b 0a 0a 09 64 70 72 69 6e 74 onnect;...dprint
2960: 66 28 22 43 61 6c 6c 69 6e 67 20 54 6c 73 5f 57 f("Calling Tls_W
2970: 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 22 29 3b aitForConnect");
2980: 0a 0a 09 74 6c 73 43 6f 6e 6e 65 63 74 20 3d 20 ...tlsConnect =
2990: 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 Tls_WaitForConne
29a0: 63 74 28 73 74 61 74 65 50 74 72 2c 20 65 72 72 ct(statePtr, err
29b0: 6f 72 43 6f 64 65 50 74 72 2c 20 30 29 3b 0a 09 orCodePtr, 0);..
29c0: 69 66 20 28 74 6c 73 43 6f 6e 6e 65 63 74 20 3c if (tlsConnect <
29d0: 20 30 29 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 0) {.. dprin
29e0: 74 66 28 22 47 6f 74 20 61 6e 20 65 72 72 6f 72 tf("Got an error
29f0: 20 77 61 69 74 69 6e 67 20 74 6f 20 63 6f 6e 6e waiting to conn
2a00: 65 63 74 20 28 74 6c 73 43 6f 6e 6e 65 63 74 20 ect (tlsConnect
2a10: 3d 20 25 69 2c 20 2a 65 72 72 6f 72 43 6f 64 65 = %i, *errorCode
2a20: 50 74 72 20 3d 20 25 69 29 22 2c 20 74 6c 73 43 Ptr = %i)", tlsC
2a30: 6f 6e 6e 65 63 74 2c 20 2a 65 72 72 6f 72 43 6f onnect, *errorCo
2a40: 64 65 50 74 72 29 3b 0a 09 20 20 20 20 54 6c 73 dePtr);.. Tls
2a50: 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c _Error(statePtr,
2a60: 20 73 74 72 65 72 72 6f 72 28 2a 65 72 72 6f 72 strerror(*error
2a70: 43 6f 64 65 50 74 72 29 29 3b 0a 0a 09 20 20 20 CodePtr));...
2a80: 20 62 79 74 65 73 52 65 61 64 20 3d 20 2d 31 3b bytesRead = -1;
2a90: 0a 09 20 20 20 20 69 66 20 28 2a 65 72 72 6f 72 .. if (*error
2aa0: 43 6f 64 65 50 74 72 20 3d 3d 20 45 43 4f 4e 4e CodePtr == ECONN
2ab0: 52 45 53 45 54 29 20 7b 0a 09 09 64 70 72 69 6e RESET) {...dprin
2ac0: 74 66 28 22 47 6f 74 20 63 6f 6e 6e 65 63 74 69 tf("Got connecti
2ad0: 6f 6e 20 72 65 73 65 74 22 29 3b 0a 09 09 2f 2a on reset");.../*
2ae0: 20 53 6f 66 74 20 45 4f 46 20 2a 2f 0a 09 09 2a Soft EOF */...*
2af0: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 30 errorCodePtr = 0
2b00: 3b 0a 09 09 62 79 74 65 73 52 65 61 64 20 3d 20 ;...bytesRead =
2b10: 30 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 72 0;.. }.. r
2b20: 65 74 75 72 6e 20 62 79 74 65 73 52 65 61 64 3b eturn bytesRead;
2b30: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f ..}. }.. /
2b40: 2a 0a 20 20 20 20 20 2a 20 57 65 20 6e 65 65 64 *. * We need
2b50: 20 74 6f 20 63 6c 65 61 72 20 74 68 65 20 53 53 to clear the SS
2b60: 4c 20 65 72 72 6f 72 20 73 74 61 63 6b 20 6e 6f L error stack no
2b70: 77 20 62 65 63 61 75 73 65 20 77 65 20 73 6f 6d w because we som
2b80: 65 74 69 6d 65 73 20 72 65 61 63 68 0a 20 20 20 etimes reach.
2b90: 20 20 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f * this functio
2ba0: 6e 20 77 69 74 68 20 6c 65 66 74 6f 76 65 72 20 n with leftover
2bb0: 65 72 72 6f 72 73 20 69 6e 20 74 68 65 20 73 74 errors in the st
2bc0: 61 63 6b 2e 20 20 49 66 20 42 49 4f 5f 72 65 61 ack. If BIO_rea
2bd0: 64 0a 20 20 20 20 20 2a 20 72 65 74 75 72 6e 73 d. * returns
2be0: 20 2d 31 20 61 6e 64 20 69 6e 74 65 6e 64 73 20 -1 and intends
2bf0: 45 41 47 41 49 4e 2c 20 74 68 65 72 65 20 69 73 EAGAIN, there is
2c00: 20 61 20 6c 65 66 74 6f 76 65 72 20 65 72 72 6f a leftover erro
2c10: 72 2c 20 69 74 20 77 69 6c 6c 20 62 65 0a 20 20 r, it will be.
2c20: 20 20 20 2a 20 6d 69 73 63 6f 6e 73 74 72 75 65 * misconstrue
2c30: 64 20 61 73 20 61 6e 20 65 72 72 6f 72 2c 20 6e d as an error, n
2c40: 6f 74 20 45 41 47 41 49 4e 2e 0a 20 20 20 20 20 ot EAGAIN..
2c50: 2a 0a 20 20 20 20 20 2a 20 41 6c 74 65 72 6e 61 *. * Alterna
2c60: 74 69 76 65 6c 79 2c 20 77 65 20 6d 61 79 20 77 tively, we may w
2c70: 61 6e 74 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 ant to handle th
2c80: 65 20 3c 30 20 72 65 74 75 72 6e 20 63 6f 64 65 e <0 return code
2c90: 73 20 66 72 6f 6d 0a 20 20 20 20 20 2a 20 42 49 s from. * BI
2ca0: 4f 5f 72 65 61 64 20 73 70 65 63 69 61 6c 6c 79 O_read specially
2cb0: 20 28 61 73 20 61 64 76 69 73 65 64 20 69 6e 20 (as advised in
2cc0: 74 68 65 20 52 53 41 20 64 6f 63 73 29 2e 20 20 the RSA docs).
2cd0: 54 4c 53 27 73 20 6c 6f 77 65 72 20 6c 65 76 65 TLS's lower leve
2ce0: 6c 20 42 49 4f 0a 20 20 20 20 20 2a 20 66 75 6e l BIO. * fun
2cf0: 63 74 69 6f 6e 73 20 70 6c 61 79 20 77 69 74 68 ctions play with
2d00: 20 74 68 65 20 72 65 74 72 79 20 66 6c 61 67 73 the retry flags
2d10: 20 74 68 6f 75 67 68 2c 20 61 6e 64 20 74 68 69 though, and thi
2d20: 73 20 73 65 65 6d 73 20 74 6f 20 77 6f 72 6b 0a s seems to work.
2d30: 20 20 20 20 20 2a 20 63 6f 72 72 65 63 74 6c 79 * correctly
2d40: 2e 20 20 53 69 6d 69 6c 61 72 20 66 69 78 20 69 . Similar fix i
2d50: 6e 20 54 6c 73 4f 75 74 70 75 74 50 72 6f 63 2e n TlsOutputProc.
2d60: 20 2d 20 68 6f 62 62 73 0a 20 20 20 20 20 2a 2f - hobbs. */
2d70: 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 . ERR_clear_e
2d80: 72 72 6f 72 28 29 3b 0a 20 20 20 20 2f 2a 20 42 rror();. /* B
2d90: 49 4f 5f 72 65 61 64 2c 20 77 68 65 72 65 20 30 IO_read, where 0
2da0: 20 6d 65 61 6e 73 20 45 4f 46 20 61 6e 64 20 2d means EOF and -
2db0: 31 20 6d 65 61 6e 73 20 65 72 72 6f 72 20 2a 2f 1 means error */
2dc0: 0a 20 20 20 20 62 79 74 65 73 52 65 61 64 20 3d . bytesRead =
2dd0: 20 42 49 4f 5f 72 65 61 64 28 73 74 61 74 65 50 BIO_read(stateP
2de0: 74 72 2d 3e 62 69 6f 2c 20 62 75 66 2c 20 62 75 tr->bio, buf, bu
2df0: 66 53 69 7a 65 29 3b 0a 20 20 20 20 64 70 72 69 fSize);. dpri
2e00: 6e 74 66 28 22 42 49 4f 5f 72 65 61 64 20 2d 3e ntf("BIO_read ->
2e10: 20 25 64 22 2c 20 62 79 74 65 73 52 65 61 64 29 %d", bytesRead)
2e20: 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 65 72 ;.. /* Get er
2e30: 72 6f 72 20 69 73 20 6d 6f 72 65 20 63 6f 6d 70 ror is more comp
2e40: 72 65 68 65 6e 73 69 76 65 20 74 68 61 6e 20 53 rehensive than S
2e50: 53 4c 5f 77 61 6e 74 20 2a 2f 0a 20 20 20 20 65 SL_want */. e
2e60: 72 72 20 3d 20 53 53 4c 5f 67 65 74 5f 65 72 72 rr = SSL_get_err
2e70: 6f 72 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c or(statePtr->ssl
2e80: 2c 20 62 79 74 65 73 52 65 61 64 29 3b 0a 20 20 , bytesRead);.
2e90: 20 20 62 61 63 6b 69 6e 67 45 72 72 6f 72 20 3d backingError =
2ea0: 20 45 52 52 5f 67 65 74 5f 65 72 72 6f 72 28 29 ERR_get_error()
2eb0: 3b 0a 0a 20 20 20 20 69 66 20 28 62 79 74 65 73 ;.. if (bytes
2ec0: 52 65 61 64 20 3c 3d 20 30 29 20 7b 0a 09 69 66 Read <= 0) {..if
2ed0: 20 28 42 49 4f 5f 73 68 6f 75 6c 64 5f 72 65 74 (BIO_should_ret
2ee0: 72 79 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f ry(statePtr->bio
2ef0: 29 29 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 )) {.. dprint
2f00: 66 28 22 52 65 61 64 20 66 61 69 6c 65 64 20 77 f("Read failed w
2f10: 69 74 68 20 63 6f 64 65 3d 25 64 2c 20 62 79 74 ith code=%d, byt
2f20: 65 73 20 72 65 61 64 3d 25 64 3a 20 73 68 6f 75 es read=%d: shou
2f30: 6c 64 20 72 65 74 72 79 22 2c 20 65 72 72 2c 20 ld retry", err,
2f40: 62 79 74 65 73 52 65 61 64 29 3b 0a 09 20 20 20 bytesRead);..
2f50: 20 2f 2a 20 53 6f 6d 65 20 64 6f 63 73 20 69 6d /* Some docs im
2f60: 70 6c 79 20 77 65 20 73 68 6f 75 6c 64 20 72 65 ply we should re
2f70: 64 6f 20 74 68 65 20 42 49 4f 5f 72 65 61 64 20 do the BIO_read
2f80: 6e 6f 77 20 2a 2f 0a 09 7d 20 65 6c 73 65 20 7b now */..} else {
2f90: 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 .. dprintf("R
2fa0: 65 61 64 20 66 61 69 6c 65 64 20 77 69 74 68 20 ead failed with
2fb0: 63 6f 64 65 3d 25 64 2c 20 62 79 74 65 73 20 72 code=%d, bytes r
2fc0: 65 61 64 3d 25 64 3a 20 65 72 72 6f 72 20 63 6f ead=%d: error co
2fd0: 6e 64 69 74 69 6f 6e 22 2c 20 65 72 72 2c 20 62 ndition", err, b
2fe0: 79 74 65 73 52 65 61 64 29 3b 0a 09 7d 0a 09 0a ytesRead);..}...
2ff0: 09 2f 2a 20 54 68 65 73 65 20 61 72 65 20 74 68 ./* These are th
3000: 65 20 73 61 6d 65 20 61 73 20 42 49 4f 5f 72 65 e same as BIO_re
3010: 74 72 79 5f 74 79 70 65 20 2a 2f 0a 09 69 66 20 try_type */..if
3020: 28 42 49 4f 5f 73 68 6f 75 6c 64 5f 72 65 61 64 (BIO_should_read
3030: 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 29 (statePtr->bio))
3040: 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 {.. dprintf(
3050: 22 42 49 4f 20 68 61 73 20 69 6e 73 75 66 66 69 "BIO has insuffi
3060: 63 69 65 6e 74 20 64 61 74 61 20 74 6f 20 72 65 cient data to re
3070: 61 64 20 61 6e 64 20 72 65 74 75 72 6e 22 29 3b ad and return");
3080: 0a 09 7d 0a 09 69 66 20 28 42 49 4f 5f 73 68 6f ..}..if (BIO_sho
3090: 75 6c 64 5f 77 72 69 74 65 28 73 74 61 74 65 50 uld_write(stateP
30a0: 74 72 2d 3e 62 69 6f 29 29 20 7b 0a 09 20 20 20 tr->bio)) {..
30b0: 20 64 70 72 69 6e 74 66 28 22 42 49 4f 20 68 61 dprintf("BIO ha
30c0: 73 20 70 65 6e 64 69 6e 67 20 64 61 74 61 20 74 s pending data t
30d0: 6f 20 77 72 69 74 65 22 29 3b 0a 09 7d 0a 09 69 o write");..}..i
30e0: 66 20 28 42 49 4f 5f 73 68 6f 75 6c 64 5f 69 6f f (BIO_should_io
30f0: 5f 73 70 65 63 69 61 6c 28 73 74 61 74 65 50 74 _special(statePt
3100: 72 2d 3e 62 69 6f 29 29 20 7b 0a 09 20 20 20 20 r->bio)) {..
3110: 69 6e 74 20 72 65 61 73 6f 6e 20 3d 20 42 49 4f int reason = BIO
3120: 5f 67 65 74 5f 72 65 74 72 79 5f 72 65 61 73 6f _get_retry_reaso
3130: 6e 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 n(statePtr->bio)
3140: 3b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
3150: 42 49 4f 20 68 61 73 20 73 6f 6d 65 20 73 70 65 BIO has some spe
3160: 63 69 61 6c 20 63 6f 6e 64 69 74 69 6f 6e 20 6f cial condition o
3170: 74 68 65 72 20 74 68 61 6e 20 72 65 61 64 20 6f ther than read o
3180: 72 20 77 72 69 74 65 3a 20 63 6f 64 65 3d 25 64 r write: code=%d
3190: 22 2c 20 72 65 61 73 6f 6e 29 3b 0a 09 7d 0a 09 ", reason);..}..
31a0: 64 70 72 69 6e 74 66 28 22 42 49 4f 20 68 61 73 dprintf("BIO has
31b0: 20 70 65 6e 64 69 6e 67 20 64 61 74 61 20 74 6f pending data to
31c0: 20 77 72 69 74 65 22 29 3b 0a 20 20 20 20 7d 0a write");. }.
31d0: 0a 20 20 20 20 73 77 69 74 63 68 20 28 65 72 72 . switch (err
31e0: 29 20 7b 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 ) {..case SSL_ER
31f0: 52 4f 52 5f 4e 4f 4e 45 3a 0a 09 20 20 20 20 2f ROR_NONE:.. /
3200: 2a 20 49 2f 4f 20 6f 70 65 72 61 74 69 6f 6e 20 * I/O operation
3210: 63 6f 6d 70 6c 65 74 65 64 20 2a 2f 0a 09 20 20 completed */..
3220: 20 20 64 70 72 69 6e 74 66 28 22 53 53 4c 5f 45 dprintf("SSL_E
3230: 52 52 4f 52 5f 4e 4f 4e 45 22 29 3b 0a 09 20 20 RROR_NONE");..
3240: 20 20 64 70 72 69 6e 74 42 75 66 66 65 72 28 62 dprintBuffer(b
3250: 75 66 2c 20 62 79 74 65 73 52 65 61 64 29 3b 0a uf, bytesRead);.
3260: 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 63 61 . break;...ca
3270: 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 53 53 4c se SSL_ERROR_SSL
3280: 3a 0a 09 20 20 20 20 2f 2a 20 41 20 6e 6f 6e 2d :.. /* A non-
3290: 72 65 63 6f 76 65 72 61 62 6c 65 2c 20 66 61 74 recoverable, fat
32a0: 61 6c 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20 al error in the
32b0: 53 53 4c 20 6c 69 62 72 61 72 79 20 6f 63 63 75 SSL library occu
32c0: 72 72 65 64 2c 20 75 73 75 61 6c 6c 79 20 61 20 rred, usually a
32d0: 70 72 6f 74 6f 63 6f 6c 20 65 72 72 6f 72 20 2a protocol error *
32e0: 2f 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 /.. dprintf("
32f0: 53 53 4c 20 65 72 72 6f 72 2c 20 69 6e 64 69 63 SSL error, indic
3300: 61 74 69 6e 67 20 74 68 61 74 20 74 68 65 20 63 ating that the c
3310: 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 62 65 onnection has be
3320: 65 6e 20 61 62 6f 72 74 65 64 22 29 3b 0a 09 20 en aborted");..
3330: 20 20 20 69 66 20 28 62 61 63 6b 69 6e 67 45 72 if (backingEr
3340: 72 6f 72 20 21 3d 20 30 29 20 7b 0a 09 09 54 6c ror != 0) {...Tl
3350: 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 s_Error(statePtr
3360: 2c 20 45 52 52 5f 72 65 61 73 6f 6e 5f 65 72 72 , ERR_reason_err
3370: 6f 72 5f 73 74 72 69 6e 67 28 62 61 63 6b 69 6e or_string(backin
3380: 67 45 72 72 6f 72 29 29 3b 0a 09 20 20 20 20 7d gError));.. }
3390: 20 65 6c 73 65 20 69 66 20 28 53 53 4c 5f 67 65 else if (SSL_ge
33a0: 74 5f 76 65 72 69 66 79 5f 72 65 73 75 6c 74 28 t_verify_result(
33b0: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 21 statePtr->ssl) !
33c0: 3d 20 58 35 30 39 5f 56 5f 4f 4b 29 20 7b 0a 09 = X509_V_OK) {..
33d0: 09 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 .Tls_Error(state
33e0: 50 74 72 2c 20 58 35 30 39 5f 76 65 72 69 66 79 Ptr, X509_verify
33f0: 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 _cert_error_stri
3400: 6e 67 28 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 ng(SSL_get_verif
3410: 79 5f 72 65 73 75 6c 74 28 73 74 61 74 65 50 74 y_result(statePt
3420: 72 2d 3e 73 73 6c 29 29 29 3b 0a 09 20 20 20 20 r->ssl)));..
3430: 7d 20 65 6c 73 65 20 7b 0a 09 09 54 6c 73 5f 45 } else {...Tls_E
3440: 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20 22 rror(statePtr, "
3450: 55 6e 6b 6e 6f 77 6e 20 53 53 4c 20 65 72 72 6f Unknown SSL erro
3460: 72 22 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 r");.. }..
3470: 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d *errorCodePtr =
3480: 20 45 43 4f 4e 4e 41 42 4f 52 54 45 44 3b 0a 09 ECONNABORTED;..
3490: 20 20 20 20 62 79 74 65 73 52 65 61 64 20 3d 20 bytesRead =
34a0: 2d 31 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c -1;..#if OPENSSL
34b0: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 _VERSION_NUMBER
34c0: 3e 3d 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 >= 0x30000000L..
34d0: 20 20 20 20 2f 2a 20 55 6e 65 78 70 65 63 74 65 /* Unexpecte
34e0: 64 20 45 4f 46 20 66 72 6f 6d 20 74 68 65 20 70 d EOF from the p
34f0: 65 65 72 20 66 6f 72 20 4f 70 65 6e 53 53 4c 20 eer for OpenSSL
3500: 33 2e 30 2b 20 2a 2f 0a 09 20 20 20 20 69 66 20 3.0+ */.. if
3510: 28 45 52 52 5f 47 45 54 5f 52 45 41 53 4f 4e 28 (ERR_GET_REASON(
3520: 62 61 63 6b 69 6e 67 45 72 72 6f 72 29 20 3d 3d backingError) ==
3530: 20 53 53 4c 5f 52 5f 55 4e 45 58 50 45 43 54 45 SSL_R_UNEXPECTE
3540: 44 5f 45 4f 46 5f 57 48 49 4c 45 5f 52 45 41 44 D_EOF_WHILE_READ
3550: 49 4e 47 29 20 7b 0a 09 09 64 70 72 69 6e 74 66 ING) {...dprintf
3560: 28 22 28 55 6e 65 78 70 65 63 74 65 64 29 20 45 ("(Unexpected) E
3570: 4f 46 20 72 65 61 63 68 65 64 22 29 0a 09 09 2a OF reached")...*
3580: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 30 errorCodePtr = 0
3590: 3b 0a 09 09 62 79 74 65 73 52 65 61 64 20 3d 20 ;...bytesRead =
35a0: 30 3b 0a 09 09 54 6c 73 5f 45 72 72 6f 72 28 73 0;...Tls_Error(s
35b0: 74 61 74 65 50 74 72 2c 20 22 45 4f 46 20 72 65 tatePtr, "EOF re
35c0: 61 63 68 65 64 22 29 3b 0a 09 20 20 20 20 7d 0a ached");.. }.
35d0: 23 65 6e 64 69 66 0a 09 20 20 20 20 62 72 65 61 #endif.. brea
35e0: 6b 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 k;...case SSL_ER
35f0: 52 4f 52 5f 57 41 4e 54 5f 52 45 41 44 3a 0a 09 ROR_WANT_READ:..
3600: 20 20 20 20 2f 2a 20 4f 70 20 64 69 64 20 6e 6f /* Op did no
3610: 74 20 63 6f 6d 70 6c 65 74 65 20 64 75 65 20 74 t complete due t
3620: 6f 20 6e 6f 74 20 65 6e 6f 75 67 68 20 64 61 74 o not enough dat
3630: 61 20 77 61 73 20 61 76 61 69 6c 61 62 6c 65 2e a was available.
3640: 20 52 65 74 72 79 20 6c 61 74 65 72 2e 20 2a 2f Retry later. */
3650: 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 47 .. dprintf("G
3660: 6f 74 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e ot SSL_ERROR_WAN
3670: 54 5f 52 45 41 44 2c 20 6d 61 70 70 69 6e 67 20 T_READ, mapping
3680: 74 68 69 73 20 74 6f 20 45 41 47 41 49 4e 22 29 this to EAGAIN")
3690: 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 ;.. *errorCod
36a0: 65 50 74 72 20 3d 20 45 41 47 41 49 4e 3b 0a 09 ePtr = EAGAIN;..
36b0: 20 20 20 20 62 79 74 65 73 52 65 61 64 20 3d 20 bytesRead =
36c0: 2d 31 3b 0a 09 20 20 20 20 73 74 61 74 65 50 74 -1;.. statePt
36d0: 72 2d 3e 77 61 6e 74 20 3d 20 54 43 4c 5f 52 45 r->want = TCL_RE
36e0: 41 44 41 42 4c 45 3b 0a 09 20 20 20 20 54 6c 73 ADABLE;.. Tls
36f0: 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c _Error(statePtr,
3700: 20 22 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 "SSL_ERROR_WANT
3710: 5f 52 45 41 44 22 29 3b 0a 09 20 20 20 20 62 72 _READ");.. br
3720: 65 61 6b 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f eak;...case SSL_
3730: 45 52 52 4f 52 5f 57 41 4e 54 5f 57 52 49 54 45 ERROR_WANT_WRITE
3740: 3a 0a 09 20 20 20 20 2f 2a 20 4f 70 20 64 69 64 :.. /* Op did
3750: 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 64 75 not complete du
3760: 65 20 74 6f 20 75 6e 61 62 6c 65 20 74 6f 20 73 e to unable to s
3770: 65 6e 74 20 61 6c 6c 20 64 61 74 61 20 74 6f 20 ent all data to
3780: 74 68 65 20 42 49 4f 2e 20 52 65 74 72 79 20 6c the BIO. Retry l
3790: 61 74 65 72 2e 20 2a 2f 0a 09 20 20 20 20 64 70 ater. */.. dp
37a0: 72 69 6e 74 66 28 22 47 6f 74 20 53 53 4c 5f 45 rintf("Got SSL_E
37b0: 52 52 4f 52 5f 57 41 4e 54 5f 57 52 49 54 45 2c RROR_WANT_WRITE,
37c0: 20 6d 61 70 70 69 6e 67 20 74 68 69 73 20 74 6f mapping this to
37d0: 20 45 41 47 41 49 4e 22 29 3b 0a 09 20 20 20 20 EAGAIN");..
37e0: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 *errorCodePtr =
37f0: 45 41 47 41 49 4e 3b 0a 09 20 20 20 20 62 79 74 EAGAIN;.. byt
3800: 65 73 52 65 61 64 20 3d 20 2d 31 3b 0a 09 20 20 esRead = -1;..
3810: 20 20 73 74 61 74 65 50 74 72 2d 3e 77 61 6e 74 statePtr->want
3820: 20 3d 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 3b = TCL_WRITABLE;
3830: 0a 09 20 20 20 20 54 6c 73 5f 45 72 72 6f 72 28 .. Tls_Error(
3840: 73 74 61 74 65 50 74 72 2c 20 22 53 53 4c 5f 45 statePtr, "SSL_E
3850: 52 52 4f 52 5f 57 41 4e 54 5f 57 52 49 54 45 22 RROR_WANT_WRITE"
3860: 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a );.. break;..
3870: 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f .case SSL_ERROR_
3880: 57 41 4e 54 5f 58 35 30 39 5f 4c 4f 4f 4b 55 50 WANT_X509_LOOKUP
3890: 3a 0a 09 20 20 20 20 2f 2a 20 4f 70 20 64 69 64 :.. /* Op did
38a0: 6e 27 74 20 63 6f 6d 70 6c 65 74 65 20 73 69 6e n't complete sin
38b0: 63 65 20 63 61 6c 6c 62 61 63 6b 20 73 65 74 20 ce callback set
38c0: 62 79 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 by SSL_CTX_set_c
38d0: 6c 69 65 6e 74 5f 63 65 72 74 5f 63 62 28 29 20 lient_cert_cb()
38e0: 61 73 6b 65 64 20 74 6f 20 62 65 20 63 61 6c 6c asked to be call
38f0: 65 64 20 61 67 61 69 6e 20 2a 2f 0a 09 20 20 20 ed again */..
3900: 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20 53 53 dprintf("Got SS
3910: 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 58 35 30 L_ERROR_WANT_X50
3920: 39 5f 4c 4f 4f 4b 55 50 2c 20 6d 61 70 70 69 6e 9_LOOKUP, mappin
3930: 67 20 69 74 20 74 6f 20 45 41 47 41 49 4e 22 29 g it to EAGAIN")
3940: 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 ;.. *errorCod
3950: 65 50 74 72 20 3d 20 45 41 47 41 49 4e 3b 0a 09 ePtr = EAGAIN;..
3960: 20 20 20 20 62 79 74 65 73 52 65 61 64 20 3d 20 bytesRead =
3970: 2d 31 3b 0a 09 20 20 20 20 54 6c 73 5f 45 72 72 -1;.. Tls_Err
3980: 6f 72 28 73 74 61 74 65 50 74 72 2c 20 22 53 53 or(statePtr, "SS
3990: 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 58 35 30 L_ERROR_WANT_X50
39a0: 39 5f 4c 4f 4f 4b 55 50 22 29 3b 0a 09 20 20 20 9_LOOKUP");..
39b0: 20 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20 53 break;...case S
39c0: 53 4c 5f 45 52 52 4f 52 5f 53 59 53 43 41 4c 4c SL_ERROR_SYSCALL
39d0: 3a 0a 09 20 20 20 20 2f 2a 20 53 6f 6d 65 20 6e :.. /* Some n
39e0: 6f 6e 2d 72 65 63 6f 76 65 72 61 62 6c 65 2c 20 on-recoverable,
39f0: 66 61 74 61 6c 20 49 2f 4f 20 65 72 72 6f 72 20 fatal I/O error
3a00: 6f 63 63 75 72 72 65 64 20 2a 2f 0a 09 20 20 20 occurred */..
3a10: 20 64 70 72 69 6e 74 66 28 22 53 53 4c 5f 45 52 dprintf("SSL_ER
3a20: 52 4f 52 5f 53 59 53 43 41 4c 4c 22 29 3b 0a 0a ROR_SYSCALL");..
3a30: 09 20 20 20 20 69 66 20 28 62 61 63 6b 69 6e 67 . if (backing
3a40: 45 72 72 6f 72 20 3d 3d 20 30 20 26 26 20 62 79 Error == 0 && by
3a50: 74 65 73 52 65 61 64 20 3d 3d 20 30 29 20 7b 0a tesRead == 0) {.
3a60: 09 09 2f 2a 20 55 6e 65 78 70 65 63 74 65 64 20 ../* Unexpected
3a70: 45 4f 46 20 66 72 6f 6d 20 74 68 65 20 70 65 65 EOF from the pee
3a80: 72 20 66 6f 72 20 4f 70 65 6e 53 53 4c 20 31 2e r for OpenSSL 1.
3a90: 31 20 2a 2f 0a 09 09 64 70 72 69 6e 74 66 28 22 1 */...dprintf("
3aa0: 28 55 6e 65 78 70 65 63 74 65 64 29 20 45 4f 46 (Unexpected) EOF
3ab0: 20 72 65 61 63 68 65 64 22 29 0a 09 09 2a 65 72 reached")...*er
3ac0: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a rorCodePtr = 0;.
3ad0: 09 09 62 79 74 65 73 52 65 61 64 20 3d 20 30 3b ..bytesRead = 0;
3ae0: 0a 09 09 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 ...Tls_Error(sta
3af0: 74 65 50 74 72 2c 20 22 45 4f 46 20 72 65 61 63 tePtr, "EOF reac
3b00: 68 65 64 22 29 3b 0a 0a 09 20 20 20 20 7d 20 65 hed");... } e
3b10: 6c 73 65 20 69 66 20 28 62 61 63 6b 69 6e 67 45 lse if (backingE
3b20: 72 72 6f 72 20 3d 3d 20 30 20 26 26 20 62 79 74 rror == 0 && byt
3b30: 65 73 52 65 61 64 20 3d 3d 20 2d 31 29 20 7b 0a esRead == -1) {.
3b40: 09 09 64 70 72 69 6e 74 66 28 22 49 2f 4f 20 65 ..dprintf("I/O e
3b50: 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 28 65 rror occurred (e
3b60: 72 72 6e 6f 20 3d 20 25 6c 75 29 22 2c 20 28 75 rrno = %lu)", (u
3b70: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 54 63 nsigned long) Tc
3b80: 6c 5f 47 65 74 45 72 72 6e 6f 28 29 29 3b 0a 09 l_GetErrno());..
3b90: 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d .*errorCodePtr =
3ba0: 20 54 63 6c 5f 47 65 74 45 72 72 6e 6f 28 29 3b Tcl_GetErrno();
3bb0: 0a 09 09 62 79 74 65 73 52 65 61 64 20 3d 20 2d ...bytesRead = -
3bc0: 31 3b 0a 09 09 54 6c 73 5f 45 72 72 6f 72 28 73 1;...Tls_Error(s
3bd0: 74 61 74 65 50 74 72 2c 20 54 63 6c 5f 45 72 72 tatePtr, Tcl_Err
3be0: 6e 6f 4d 73 67 28 2a 65 72 72 6f 72 43 6f 64 65 noMsg(*errorCode
3bf0: 50 74 72 29 29 3b 0a 0a 09 20 20 20 20 7d 20 65 Ptr));... } e
3c00: 6c 73 65 20 7b 0a 09 09 64 70 72 69 6e 74 66 28 lse {...dprintf(
3c10: 22 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 "I/O error occur
3c20: 72 65 64 20 28 62 61 63 6b 69 6e 67 45 72 72 6f red (backingErro
3c30: 72 20 3d 20 25 6c 75 29 22 2c 20 62 61 63 6b 69 r = %lu)", backi
3c40: 6e 67 45 72 72 6f 72 29 3b 0a 09 09 2a 65 72 72 ngError);...*err
3c50: 6f 72 43 6f 64 65 50 74 72 20 3d 20 54 63 6c 5f orCodePtr = Tcl_
3c60: 47 65 74 45 72 72 6e 6f 28 29 3b 0a 09 09 62 79 GetErrno();...by
3c70: 74 65 73 52 65 61 64 20 3d 20 2d 31 3b 0a 09 09 tesRead = -1;...
3c80: 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 Tls_Error(stateP
3c90: 74 72 2c 20 45 52 52 5f 72 65 61 73 6f 6e 5f 65 tr, ERR_reason_e
3ca0: 72 72 6f 72 5f 73 74 72 69 6e 67 28 62 61 63 6b rror_string(back
3cb0: 69 6e 67 45 72 72 6f 72 29 29 3b 0a 09 20 20 20 ingError));..
3cc0: 20 7d 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a }.. break;..
3cd0: 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f .case SSL_ERROR_
3ce0: 5a 45 52 4f 5f 52 45 54 55 52 4e 3a 0a 09 20 20 ZERO_RETURN:..
3cf0: 20 20 2f 2a 20 50 65 65 72 20 68 61 73 20 63 6c /* Peer has cl
3d00: 6f 73 65 64 20 74 68 65 20 63 6f 6e 6e 65 63 74 osed the connect
3d10: 69 6f 6e 20 62 79 20 73 65 6e 64 69 6e 67 20 74 ion by sending t
3d20: 68 65 20 63 6c 6f 73 65 5f 6e 6f 74 69 66 79 20 he close_notify
3d30: 61 6c 65 72 74 2e 20 43 61 6e 27 74 20 72 65 61 alert. Can't rea
3d40: 64 2c 20 62 75 74 20 63 61 6e 20 77 72 69 74 65 d, but can write
3d50: 2e 20 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e 74 . */.. dprint
3d60: 66 28 22 47 6f 74 20 53 53 4c 5f 45 52 52 4f 52 f("Got SSL_ERROR
3d70: 5f 5a 45 52 4f 5f 52 45 54 55 52 4e 2c 20 74 68 _ZERO_RETURN, th
3d80: 69 73 20 6d 65 61 6e 73 20 61 6e 20 45 4f 46 20 is means an EOF
3d90: 68 61 73 20 62 65 65 6e 20 72 65 61 63 68 65 64 has been reached
3da0: 22 29 3b 0a 09 20 20 20 20 62 79 74 65 73 52 65 ");.. bytesRe
3db0: 61 64 20 3d 20 30 3b 0a 09 20 20 20 20 2a 65 72 ad = 0;.. *er
3dc0: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a rorCodePtr = 0;.
3dd0: 09 20 20 20 20 54 6c 73 5f 45 72 72 6f 72 28 73 . Tls_Error(s
3de0: 74 61 74 65 50 74 72 2c 20 22 50 65 65 72 20 68 tatePtr, "Peer h
3df0: 61 73 20 63 6c 6f 73 65 64 20 74 68 65 20 63 6f as closed the co
3e00: 6e 6e 65 63 74 69 6f 6e 20 66 6f 72 20 77 72 69 nnection for wri
3e10: 74 69 6e 67 20 62 79 20 73 65 6e 64 69 6e 67 20 ting by sending
3e20: 74 68 65 20 63 6c 6f 73 65 5f 6e 6f 74 69 66 79 the close_notify
3e30: 20 61 6c 65 72 74 22 29 3b 0a 09 20 20 20 20 62 alert");.. b
3e40: 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20 53 53 4c reak;...case SSL
3e50: 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 41 53 59 4e _ERROR_WANT_ASYN
3e60: 43 3a 0a 09 20 20 20 20 2f 2a 20 55 73 65 64 20 C:.. /* Used
3e70: 77 69 74 68 20 66 6c 61 67 20 53 53 4c 5f 4d 4f with flag SSL_MO
3e80: 44 45 5f 41 53 59 4e 43 2c 20 6f 70 20 64 69 64 DE_ASYNC, op did
3e90: 6e 27 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 63 n't complete bec
3ea0: 61 75 73 65 20 61 6e 20 61 73 79 6e 63 20 65 6e ause an async en
3eb0: 67 69 6e 65 20 69 73 20 73 74 69 6c 6c 20 70 72 gine is still pr
3ec0: 6f 63 65 73 73 69 6e 67 20 64 61 74 61 20 2a 2f ocessing data */
3ed0: 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 47 .. dprintf("G
3ee0: 6f 74 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e ot SSL_ERROR_WAN
3ef0: 54 5f 41 53 59 4e 43 2c 20 6d 61 70 70 69 6e 67 T_ASYNC, mapping
3f00: 20 74 68 69 73 20 74 6f 20 45 41 47 41 49 4e 22 this to EAGAIN"
3f10: 29 3b 0a 09 20 20 20 20 62 79 74 65 73 52 65 61 );.. bytesRea
3f20: 64 20 3d 20 2d 31 3b 0a 09 20 20 20 20 2a 65 72 d = -1;.. *er
3f30: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 41 47 rorCodePtr = EAG
3f40: 41 49 4e 3b 0a 09 20 20 20 20 54 6c 73 5f 45 72 AIN;.. Tls_Er
3f50: 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20 22 53 ror(statePtr, "S
3f60: 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 41 53 SL_ERROR_WANT_AS
3f70: 59 4e 43 22 29 3b 0a 09 20 20 20 20 62 72 65 61 YNC");.. brea
3f80: 6b 3b 0a 0a 09 64 65 66 61 75 6c 74 3a 0a 09 20 k;...default:..
3f90: 20 20 20 64 70 72 69 6e 74 66 28 22 55 6e 6b 6e dprintf("Unkn
3fa0: 6f 77 6e 20 65 72 72 6f 72 20 28 65 72 72 20 3d own error (err =
3fb0: 20 25 69 29 2c 20 6d 61 70 70 69 6e 67 20 74 6f %i), mapping to
3fc0: 20 45 4f 46 22 2c 20 65 72 72 29 3b 0a 09 20 20 EOF", err);..
3fd0: 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 *errorCodePtr
3fe0: 3d 20 30 3b 0a 09 20 20 20 20 62 79 74 65 73 52 = 0;.. bytesR
3ff0: 65 61 64 20 3d 20 30 3b 0a 09 20 20 20 20 54 6c ead = 0;.. Tl
4000: 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 s_Error(statePtr
4010: 2c 20 22 55 6e 6b 6e 6f 77 6e 20 65 72 72 6f 72 , "Unknown error
4020: 22 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a ");.. break;.
4030: 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e }.. dprin
4040: 74 66 28 22 49 6e 70 75 74 28 25 64 29 20 2d 3e tf("Input(%d) ->
4050: 20 25 64 20 5b 25 64 5d 22 2c 20 62 75 66 53 69 %d [%d]", bufSi
4060: 7a 65 2c 20 62 79 74 65 73 52 65 61 64 2c 20 2a ze, bytesRead, *
4070: 65 72 72 6f 72 43 6f 64 65 50 74 72 29 3b 0a 20 errorCodePtr);.
4080: 20 20 20 72 65 74 75 72 6e 20 62 79 74 65 73 52 return bytesR
4090: 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d ead;.}../*. *---
40a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
40b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
40c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
40d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
40e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
40f0: 20 54 6c 73 4f 75 74 70 75 74 50 72 6f 63 20 2d TlsOutputProc -
4100: 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f -. *. *.This pro
4110: 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 cedure is invoke
4120: 64 20 62 79 20 74 68 65 20 67 65 6e 65 72 69 63 d by the generic
4130: 20 49 4f 20 6c 65 76 65 6c 20 74 6f 20 77 72 69 IO level to wri
4140: 74 65 20 64 61 74 61 20 74 6f 0a 20 2a 09 74 68 te data to. *.th
4150: 65 20 42 49 4f 2e 20 45 71 75 69 76 61 6c 65 6e e BIO. Equivalen
4160: 74 20 74 6f 20 53 53 4c 5f 77 72 69 74 65 2e 20 t to SSL_write.
4170: 43 61 6c 6c 65 64 20 62 79 20 74 68 65 0a 20 2a Called by the. *
4180: 09 67 65 6e 65 72 69 63 20 49 2f 4f 20 6c 61 79 .generic I/O lay
4190: 65 72 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 er whenever the
41a0: 54 63 6c 5f 57 72 69 74 65 28 29 2c 20 54 63 6c Tcl_Write(), Tcl
41b0: 5f 57 72 69 74 65 43 68 61 72 73 2c 0a 20 2a 09 _WriteChars,. *.
41c0: 54 54 63 6c 5f 57 72 69 74 65 4f 62 6a 20 66 75 TTcl_WriteObj fu
41d0: 6e 63 74 69 6f 6e 73 20 61 72 65 20 75 73 65 64 nctions are used
41e0: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
41f0: 0a 20 2a 20 20 20 20 52 65 74 75 72 6e 73 20 74 . * Returns t
4200: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 he number of byt
4210: 65 73 20 77 72 69 74 74 65 6e 20 6f 72 20 2d 31 es written or -1
4220: 20 6f 6e 20 65 72 72 6f 72 2e 20 53 65 74 73 20 on error. Sets
4230: 65 72 72 6f 72 43 6f 64 65 50 74 72 0a 20 2a 20 errorCodePtr. *
4240: 20 20 20 74 6f 20 61 20 50 4f 53 49 58 20 65 72 to a POSIX er
4250: 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20 65 ror code if an e
4260: 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 6f rror occurred, o
4270: 72 20 30 20 69 66 20 6e 6f 6e 65 2e 0a 20 2a 0a r 0 if none.. *.
4280: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
4290: 0a 20 2a 20 20 20 20 57 72 69 74 65 73 20 6f 75 . * Writes ou
42a0: 74 70 75 74 20 6f 6e 20 74 68 65 20 6f 75 74 70 tput on the outp
42b0: 75 74 20 64 65 76 69 63 65 20 6f 66 20 74 68 65 ut device of the
42c0: 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d channel.. *. *-
42d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
42e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
42f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
4320: 0a 73 74 61 74 69 63 20 69 6e 74 20 54 6c 73 4f .static int TlsO
4330: 75 74 70 75 74 50 72 6f 63 28 43 6c 69 65 6e 74 utputProc(Client
4340: 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 Data instanceDat
4350: 61 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 62 a, const char *b
4360: 75 66 2c 20 69 6e 74 20 74 6f 57 72 69 74 65 2c uf, int toWrite,
4370: 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 50 int *errorCodeP
4380: 74 72 29 20 7b 0a 20 20 20 20 75 6e 73 69 67 6e tr) {. unsign
4390: 65 64 20 6c 6f 6e 67 20 62 61 63 6b 69 6e 67 45 ed long backingE
43a0: 72 72 6f 72 3b 0a 20 20 20 20 53 74 61 74 65 20 rror;. State
43b0: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 *statePtr = (Sta
43c0: 74 65 20 2a 29 20 69 6e 73 74 61 6e 63 65 44 61 te *) instanceDa
43d0: 74 61 3b 0a 20 20 20 20 69 6e 74 20 77 72 69 74 ta;. int writ
43e0: 74 65 6e 2c 20 65 72 72 3b 0a 20 20 20 20 2a 65 ten, err;. *e
43f0: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 30 3b rrorCodePtr = 0;
4400: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 57 .. dprintf("W
4410: 72 69 74 65 28 25 70 2c 20 25 64 29 22 2c 20 28 rite(%p, %d)", (
4420: 76 6f 69 64 20 2a 29 20 73 74 61 74 65 50 74 72 void *) statePtr
4430: 2c 20 74 6f 57 72 69 74 65 29 3b 0a 20 20 20 20 , toWrite);.
4440: 64 70 72 69 6e 74 42 75 66 66 65 72 28 62 75 66 dprintBuffer(buf
4450: 2c 20 74 6f 57 72 69 74 65 29 3b 0a 0a 20 20 20 , toWrite);..
4460: 20 2f 2a 20 53 6b 69 70 20 69 66 20 75 73 65 72 /* Skip if user
4470: 20 76 65 72 69 66 79 20 63 61 6c 6c 62 61 63 6b verify callback
4480: 20 69 73 20 73 74 69 6c 6c 20 72 75 6e 6e 69 6e is still runnin
4490: 67 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 g */. if (sta
44a0: 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 tePtr->flags & T
44b0: 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 29 LS_TCL_CALLBACK)
44c0: 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 44 6f 6e {..dprintf("Don
44d0: 27 74 20 70 72 6f 63 65 73 73 20 6f 75 74 70 75 't process outpu
44e0: 74 20 77 68 69 6c 65 20 63 61 6c 6c 62 61 63 6b t while callback
44f0: 73 20 61 72 65 20 72 75 6e 6e 69 6e 67 22 29 3b s are running");
4500: 0a 09 77 72 69 74 74 65 6e 20 3d 20 2d 31 3b 0a ..written = -1;.
4510: 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d .*errorCodePtr =
4520: 20 45 41 47 41 49 4e 3b 0a 09 72 65 74 75 72 6e EAGAIN;..return
4530: 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 -1;. }..
4540: 2f 2a 20 49 66 20 6e 6f 74 20 69 6e 69 74 69 61 /* If not initia
4550: 6c 69 7a 65 64 2c 20 64 6f 20 63 6f 6e 6e 65 63 lized, do connec
4560: 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 t */. if (sta
4570: 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 tePtr->flags & T
4580: 4c 53 5f 54 43 4c 5f 49 4e 49 54 29 20 7b 0a 09 LS_TCL_INIT) {..
4590: 69 6e 74 20 74 6c 73 43 6f 6e 6e 65 63 74 3b 0a int tlsConnect;.
45a0: 0a 09 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 69 ..dprintf("Calli
45b0: 6e 67 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f ng Tls_WaitForCo
45c0: 6e 6e 65 63 74 22 29 3b 0a 0a 09 74 6c 73 43 6f nnect");...tlsCo
45d0: 6e 6e 65 63 74 20 3d 20 54 6c 73 5f 57 61 69 74 nnect = Tls_Wait
45e0: 46 6f 72 43 6f 6e 6e 65 63 74 28 73 74 61 74 65 ForConnect(state
45f0: 50 74 72 2c 20 65 72 72 6f 72 43 6f 64 65 50 74 Ptr, errorCodePt
4600: 72 2c 20 31 29 3b 0a 09 69 66 20 28 74 6c 73 43 r, 1);..if (tlsC
4610: 6f 6e 6e 65 63 74 20 3c 20 30 29 20 7b 0a 09 20 onnect < 0) {..
4620: 20 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20 dprintf("Got
4630: 61 6e 20 65 72 72 6f 72 20 77 61 69 74 69 6e 67 an error waiting
4640: 20 74 6f 20 63 6f 6e 6e 65 63 74 20 28 74 6c 73 to connect (tls
4650: 43 6f 6e 6e 65 63 74 20 3d 20 25 69 2c 20 2a 65 Connect = %i, *e
4660: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 25 69 rrorCodePtr = %i
4670: 29 22 2c 20 74 6c 73 43 6f 6e 6e 65 63 74 2c 20 )", tlsConnect,
4680: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29 3b 0a *errorCodePtr);.
4690: 09 20 20 20 20 54 6c 73 5f 45 72 72 6f 72 28 73 . Tls_Error(s
46a0: 74 61 74 65 50 74 72 2c 20 73 74 72 65 72 72 6f tatePtr, strerro
46b0: 72 28 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29 r(*errorCodePtr)
46c0: 29 3b 0a 0a 09 20 20 20 20 77 72 69 74 74 65 6e );... written
46d0: 20 3d 20 2d 31 3b 0a 09 20 20 20 20 69 66 20 28 = -1;.. if (
46e0: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 3d *errorCodePtr ==
46f0: 20 45 43 4f 4e 4e 52 45 53 45 54 29 20 7b 0a 09 ECONNRESET) {..
4700: 09 64 70 72 69 6e 74 66 28 22 47 6f 74 20 63 6f .dprintf("Got co
4710: 6e 6e 65 63 74 69 6f 6e 20 72 65 73 65 74 22 29 nnection reset")
4720: 3b 0a 09 09 2f 2a 20 53 6f 66 74 20 45 4f 46 20 ;.../* Soft EOF
4730: 2a 2f 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 */...*errorCodeP
4740: 74 72 20 3d 20 30 3b 0a 09 09 77 72 69 74 74 65 tr = 0;...writte
4750: 6e 20 3d 20 30 3b 0a 09 20 20 20 20 7d 0a 09 20 n = 0;.. }..
4760: 20 20 20 72 65 74 75 72 6e 20 77 72 69 74 74 65 return writte
4770: 6e 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 n;..}. }..
4780: 20 69 66 20 28 74 6f 57 72 69 74 65 20 3d 3d 20 if (toWrite ==
4790: 30 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 7a 0) {..dprintf("z
47a0: 65 72 6f 2d 77 72 69 74 65 22 29 3b 0a 09 65 72 ero-write");..er
47b0: 72 20 3d 20 42 49 4f 5f 66 6c 75 73 68 28 73 74 r = BIO_flush(st
47c0: 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 0a 09 atePtr->bio);...
47d0: 69 66 20 28 65 72 72 20 3c 3d 20 30 29 20 7b 0a if (err <= 0) {.
47e0: 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 46 6c . dprintf("Fl
47f0: 75 73 68 69 6e 67 20 66 61 69 6c 65 64 22 29 3b ushing failed");
4800: 0a 09 20 20 20 20 54 6c 73 5f 45 72 72 6f 72 28 .. Tls_Error(
4810: 73 74 61 74 65 50 74 72 2c 20 22 46 6c 75 73 68 statePtr, "Flush
4820: 20 66 61 69 6c 65 64 22 29 3b 0a 0a 09 20 20 20 failed");...
4830: 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d *errorCodePtr =
4840: 20 45 49 4f 3b 0a 09 20 20 20 20 77 72 69 74 74 EIO;.. writt
4850: 65 6e 20 3d 20 30 3b 0a 09 20 20 20 20 72 65 74 en = 0;.. ret
4860: 75 72 6e 20 2d 31 3b 0a 09 7d 0a 0a 09 77 72 69 urn -1;..}...wri
4870: 74 74 65 6e 20 3d 20 30 3b 0a 09 2a 65 72 72 6f tten = 0;..*erro
4880: 72 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a 09 72 rCodePtr = 0;..r
4890: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a eturn 0;. }..
48a0: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 57 65 /*. * We
48b0: 20 6e 65 65 64 20 74 6f 20 63 6c 65 61 72 20 74 need to clear t
48c0: 68 65 20 53 53 4c 20 65 72 72 6f 72 20 73 74 61 he SSL error sta
48d0: 63 6b 20 6e 6f 77 20 62 65 63 61 75 73 65 20 77 ck now because w
48e0: 65 20 73 6f 6d 65 74 69 6d 65 73 20 72 65 61 63 e sometimes reac
48f0: 68 0a 20 20 20 20 20 2a 20 74 68 69 73 20 66 75 h. * this fu
4900: 6e 63 74 69 6f 6e 20 77 69 74 68 20 6c 65 66 74 nction with left
4910: 6f 76 65 72 20 65 72 72 6f 72 73 20 69 6e 20 74 over errors in t
4920: 68 65 20 73 74 61 63 6b 2e 20 20 49 66 20 42 49 he stack. If BI
4930: 4f 5f 77 72 69 74 65 0a 20 20 20 20 20 2a 20 72 O_write. * r
4940: 65 74 75 72 6e 73 20 2d 31 20 61 6e 64 20 69 6e eturns -1 and in
4950: 74 65 6e 64 73 20 45 41 47 41 49 4e 2c 20 74 68 tends EAGAIN, th
4960: 65 72 65 20 69 73 20 61 20 6c 65 66 74 6f 76 65 ere is a leftove
4970: 72 20 65 72 72 6f 72 2c 20 69 74 20 77 69 6c 6c r error, it will
4980: 20 62 65 0a 20 20 20 20 20 2a 20 6d 69 73 63 6f be. * misco
4990: 6e 73 74 72 75 65 64 20 61 73 20 61 6e 20 65 72 nstrued as an er
49a0: 72 6f 72 2c 20 6e 6f 74 20 45 41 47 41 49 4e 2e ror, not EAGAIN.
49b0: 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 41 . *. * A
49c0: 6c 74 65 72 6e 61 74 69 76 65 6c 79 2c 20 77 65 lternatively, we
49d0: 20 6d 61 79 20 77 61 6e 74 20 74 6f 20 68 61 6e may want to han
49e0: 64 6c 65 20 74 68 65 20 3c 30 20 72 65 74 75 72 dle the <0 retur
49f0: 6e 20 63 6f 64 65 73 20 66 72 6f 6d 0a 20 20 20 n codes from.
4a00: 20 20 2a 20 42 49 4f 5f 77 72 69 74 65 20 73 70 * BIO_write sp
4a10: 65 63 69 61 6c 6c 79 20 28 61 73 20 61 64 76 69 ecially (as advi
4a20: 73 65 64 20 69 6e 20 74 68 65 20 52 53 41 20 64 sed in the RSA d
4a30: 6f 63 73 29 2e 20 20 54 4c 53 27 73 20 6c 6f 77 ocs). TLS's low
4a40: 65 72 20 6c 65 76 65 6c 0a 20 20 20 20 20 2a 20 er level. *
4a50: 42 49 4f 20 66 75 6e 63 74 69 6f 6e 73 20 70 6c BIO functions pl
4a60: 61 79 20 77 69 74 68 20 74 68 65 20 72 65 74 72 ay with the retr
4a70: 79 20 66 6c 61 67 73 20 74 68 6f 75 67 68 2c 20 y flags though,
4a80: 61 6e 64 20 74 68 69 73 20 73 65 65 6d 73 20 74 and this seems t
4a90: 6f 0a 20 20 20 20 20 2a 20 77 6f 72 6b 20 63 6f o. * work co
4aa0: 72 72 65 63 74 6c 79 2e 20 20 53 69 6d 69 6c 61 rrectly. Simila
4ab0: 72 20 66 69 78 20 69 6e 20 54 6c 73 49 6e 70 75 r fix in TlsInpu
4ac0: 74 50 72 6f 63 2e 20 2d 20 68 6f 62 62 73 0a 20 tProc. - hobbs.
4ad0: 20 20 20 20 2a 2f 0a 20 20 20 20 45 52 52 5f 63 */. ERR_c
4ae0: 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 20 20 lear_error();.
4af0: 20 20 2f 2a 20 53 53 4c 5f 77 72 69 74 65 20 77 /* SSL_write w
4b00: 69 6c 6c 20 72 65 74 75 72 6e 20 31 20 66 6f 72 ill return 1 for
4b10: 20 73 75 63 63 65 73 73 20 6f 72 20 30 20 66 6f success or 0 fo
4b20: 72 20 66 61 69 6c 75 72 65 20 2a 2f 0a 20 20 20 r failure */.
4b30: 20 77 72 69 74 74 65 6e 20 3d 20 42 49 4f 5f 77 written = BIO_w
4b40: 72 69 74 65 28 73 74 61 74 65 50 74 72 2d 3e 62 rite(statePtr->b
4b50: 69 6f 2c 20 62 75 66 2c 20 74 6f 57 72 69 74 65 io, buf, toWrite
4b60: 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 );. dprintf("
4b70: 42 49 4f 5f 77 72 69 74 65 28 25 70 2c 20 25 64 BIO_write(%p, %d
4b80: 29 20 2d 3e 20 5b 25 64 5d 22 2c 20 28 76 6f 69 ) -> [%d]", (voi
4b90: 64 20 2a 29 20 73 74 61 74 65 50 74 72 2c 20 74 d *) statePtr, t
4ba0: 6f 57 72 69 74 65 2c 20 77 72 69 74 74 65 6e 29 oWrite, written)
4bb0: 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 65 72 ;.. /* Get er
4bc0: 72 6f 72 20 69 73 20 6d 6f 72 65 20 63 6f 6d 70 ror is more comp
4bd0: 72 65 68 65 6e 73 69 76 65 20 74 68 61 6e 20 53 rehensive than S
4be0: 53 4c 5f 77 61 6e 74 20 2a 2f 0a 20 20 20 20 65 SL_want */. e
4bf0: 72 72 20 3d 20 53 53 4c 5f 67 65 74 5f 65 72 72 rr = SSL_get_err
4c00: 6f 72 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c or(statePtr->ssl
4c10: 2c 20 77 72 69 74 74 65 6e 29 3b 0a 20 20 20 20 , written);.
4c20: 62 61 63 6b 69 6e 67 45 72 72 6f 72 20 3d 20 45 backingError = E
4c30: 52 52 5f 67 65 74 5f 65 72 72 6f 72 28 29 3b 0a RR_get_error();.
4c40: 0a 20 20 20 20 69 66 20 28 77 72 69 74 74 65 6e . if (written
4c50: 20 3c 3d 20 30 29 20 7b 0a 09 69 66 20 28 42 49 <= 0) {..if (BI
4c60: 4f 5f 73 68 6f 75 6c 64 5f 72 65 74 72 79 28 73 O_should_retry(s
4c70: 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 29 20 7b tatePtr->bio)) {
4c80: 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 57 .. dprintf("W
4c90: 72 69 74 65 20 66 61 69 6c 65 64 20 77 69 74 68 rite failed with
4ca0: 20 63 6f 64 65 20 25 64 2c 20 62 79 74 65 73 20 code %d, bytes
4cb0: 77 72 69 74 74 65 6e 3d 25 64 3a 20 73 68 6f 75 written=%d: shou
4cc0: 6c 64 20 72 65 74 72 79 22 2c 20 65 72 72 2c 20 ld retry", err,
4cd0: 77 72 69 74 74 65 6e 29 3b 0a 09 7d 20 65 6c 73 written);..} els
4ce0: 65 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 e {.. dprintf
4cf0: 28 22 57 72 69 74 65 20 66 61 69 6c 65 64 20 77 ("Write failed w
4d00: 69 74 68 20 63 6f 64 65 20 25 64 2c 20 62 79 74 ith code %d, byt
4d10: 65 73 20 77 72 69 74 74 65 6e 3d 25 64 3a 20 65 es written=%d: e
4d20: 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 22 2c rror condition",
4d30: 20 65 72 72 2c 20 77 72 69 74 74 65 6e 29 3b 0a err, written);.
4d40: 09 7d 0a 09 0a 09 2f 2a 20 54 68 65 73 65 20 61 .}..../* These a
4d50: 72 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 42 re the same as B
4d60: 49 4f 5f 72 65 74 72 79 5f 74 79 70 65 20 2a 2f IO_retry_type */
4d70: 0a 09 69 66 20 28 42 49 4f 5f 73 68 6f 75 6c 64 ..if (BIO_should
4d80: 5f 72 65 61 64 28 73 74 61 74 65 50 74 72 2d 3e _read(statePtr->
4d90: 62 69 6f 29 29 20 7b 0a 09 20 20 20 20 64 70 72 bio)) {.. dpr
4da0: 69 6e 74 66 28 22 42 49 4f 20 68 61 73 20 69 6e intf("BIO has in
4db0: 73 75 66 66 69 63 69 65 6e 74 20 64 61 74 61 20 sufficient data
4dc0: 74 6f 20 72 65 61 64 20 61 6e 64 20 72 65 74 75 to read and retu
4dd0: 72 6e 22 29 3b 0a 09 7d 0a 09 69 66 20 28 42 49 rn");..}..if (BI
4de0: 4f 5f 73 68 6f 75 6c 64 5f 77 72 69 74 65 28 73 O_should_write(s
4df0: 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 29 20 7b tatePtr->bio)) {
4e00: 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 42 .. dprintf("B
4e10: 49 4f 20 68 61 73 20 70 65 6e 64 69 6e 67 20 64 IO has pending d
4e20: 61 74 61 20 74 6f 20 77 72 69 74 65 22 29 3b 0a ata to write");.
4e30: 09 7d 0a 09 69 66 20 28 42 49 4f 5f 73 68 6f 75 .}..if (BIO_shou
4e40: 6c 64 5f 69 6f 5f 73 70 65 63 69 61 6c 28 73 74 ld_io_special(st
4e50: 61 74 65 50 74 72 2d 3e 62 69 6f 29 29 20 7b 0a atePtr->bio)) {.
4e60: 09 20 20 20 20 69 6e 74 20 72 65 61 73 6f 6e 20 . int reason
4e70: 3d 20 42 49 4f 5f 67 65 74 5f 72 65 74 72 79 5f = BIO_get_retry_
4e80: 72 65 61 73 6f 6e 28 73 74 61 74 65 50 74 72 2d reason(statePtr-
4e90: 3e 62 69 6f 29 3b 0a 09 20 20 20 20 64 70 72 69 >bio);.. dpri
4ea0: 6e 74 66 28 22 42 49 4f 20 68 61 73 20 73 6f 6d ntf("BIO has som
4eb0: 65 20 73 70 65 63 69 61 6c 20 63 6f 6e 64 69 74 e special condit
4ec0: 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 72 ion other than r
4ed0: 65 61 64 20 6f 72 20 77 72 69 74 65 3a 20 63 6f ead or write: co
4ee0: 64 65 3d 25 64 22 2c 20 72 65 61 73 6f 6e 29 3b de=%d", reason);
4ef0: 0a 09 7d 0a 09 64 70 72 69 6e 74 66 28 22 42 49 ..}..dprintf("BI
4f00: 4f 20 68 61 73 20 70 65 6e 64 69 6e 67 20 64 61 O has pending da
4f10: 74 61 20 74 6f 20 77 72 69 74 65 22 29 3b 0a 0a ta to write");..
4f20: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 42 49 } else {..BI
4f30: 4f 5f 66 6c 75 73 68 28 73 74 61 74 65 50 74 72 O_flush(statePtr
4f40: 2d 3e 62 69 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 ->bio);. }..
4f50: 20 20 20 73 77 69 74 63 68 20 28 65 72 72 29 20 switch (err)
4f60: 7b 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52 4f {..case SSL_ERRO
4f70: 52 5f 4e 4f 4e 45 3a 0a 09 20 20 20 20 2f 2a 20 R_NONE:.. /*
4f80: 49 2f 4f 20 6f 70 65 72 61 74 69 6f 6e 20 63 6f I/O operation co
4f90: 6d 70 6c 65 74 65 64 20 2a 2f 0a 09 20 20 20 20 mpleted */..
4fa0: 64 70 72 69 6e 74 66 28 22 53 53 4c 5f 45 52 52 dprintf("SSL_ERR
4fb0: 4f 52 5f 4e 4f 4e 45 22 29 3b 0a 09 20 20 20 20 OR_NONE");..
4fc0: 69 66 20 28 77 72 69 74 74 65 6e 20 3c 20 30 29 if (written < 0)
4fd0: 20 7b 0a 09 09 77 72 69 74 74 65 6e 20 3d 20 30 {...written = 0
4fe0: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 62 72 ;.. }.. br
4ff0: 65 61 6b 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f eak;...case SSL_
5000: 45 52 52 4f 52 5f 53 53 4c 3a 0a 09 20 20 20 20 ERROR_SSL:..
5010: 2f 2a 20 41 20 6e 6f 6e 2d 72 65 63 6f 76 65 72 /* A non-recover
5020: 61 62 6c 65 2c 20 66 61 74 61 6c 20 65 72 72 6f able, fatal erro
5030: 72 20 69 6e 20 74 68 65 20 53 53 4c 20 6c 69 62 r in the SSL lib
5040: 72 61 72 79 20 6f 63 63 75 72 72 65 64 2c 20 75 rary occurred, u
5050: 73 75 61 6c 6c 79 20 61 20 70 72 6f 74 6f 63 6f sually a protoco
5060: 6c 20 65 72 72 6f 72 20 2a 2f 0a 09 20 20 20 20 l error */..
5070: 64 70 72 69 6e 74 66 28 22 53 53 4c 20 65 72 72 dprintf("SSL err
5080: 6f 72 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 or, indicating t
5090: 68 61 74 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 hat the connecti
50a0: 6f 6e 20 68 61 73 20 62 65 65 6e 20 61 62 6f 72 on has been abor
50b0: 74 65 64 22 29 3b 0a 09 20 20 20 20 69 66 20 28 ted");.. if (
50c0: 62 61 63 6b 69 6e 67 45 72 72 6f 72 20 21 3d 20 backingError !=
50d0: 30 29 20 7b 0a 09 09 54 6c 73 5f 45 72 72 6f 72 0) {...Tls_Error
50e0: 28 73 74 61 74 65 50 74 72 2c 20 45 52 52 5f 72 (statePtr, ERR_r
50f0: 65 61 73 6f 6e 5f 65 72 72 6f 72 5f 73 74 72 69 eason_error_stri
5100: 6e 67 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 29 ng(backingError)
5110: 29 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 69 );.. } else i
5120: 66 20 28 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 f (SSL_get_verif
5130: 79 5f 72 65 73 75 6c 74 28 73 74 61 74 65 50 74 y_result(statePt
5140: 72 2d 3e 73 73 6c 29 20 21 3d 20 58 35 30 39 5f r->ssl) != X509_
5150: 56 5f 4f 4b 29 20 7b 0a 09 09 54 6c 73 5f 45 72 V_OK) {...Tls_Er
5160: 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20 58 35 ror(statePtr, X5
5170: 30 39 5f 76 65 72 69 66 79 5f 63 65 72 74 5f 65 09_verify_cert_e
5180: 72 72 6f 72 5f 73 74 72 69 6e 67 28 53 53 4c 5f rror_string(SSL_
5190: 67 65 74 5f 76 65 72 69 66 79 5f 72 65 73 75 6c get_verify_resul
51a0: 74 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 t(statePtr->ssl)
51b0: 29 29 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 ));.. } else
51c0: 7b 0a 09 09 54 6c 73 5f 45 72 72 6f 72 28 73 74 {...Tls_Error(st
51d0: 61 74 65 50 74 72 2c 20 22 55 6e 6b 6e 6f 77 6e atePtr, "Unknown
51e0: 20 53 53 4c 20 65 72 72 6f 72 22 29 3b 0a 09 20 SSL error");..
51f0: 20 20 20 7d 0a 09 20 20 20 20 2a 65 72 72 6f 72 }.. *error
5200: 43 6f 64 65 50 74 72 20 3d 20 45 43 4f 4e 4e 41 CodePtr = ECONNA
5210: 42 4f 52 54 45 44 3b 0a 09 20 20 20 20 77 72 69 BORTED;.. wri
5220: 74 74 65 6e 20 3d 20 2d 31 3b 0a 09 20 20 20 20 tten = -1;..
5230: 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20 53 53 break;...case SS
5240: 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 52 45 41 L_ERROR_WANT_REA
5250: 44 3a 0a 09 20 20 20 20 2f 2a 20 4f 70 20 64 69 D:.. /* Op di
5260: 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 64 d not complete d
5270: 75 65 20 74 6f 20 6e 6f 74 20 65 6e 6f 75 67 68 ue to not enough
5280: 20 64 61 74 61 20 77 61 73 20 61 76 61 69 6c 61 data was availa
5290: 62 6c 65 2e 20 52 65 74 72 79 20 6c 61 74 65 72 ble. Retry later
52a0: 2e 20 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e 74 . */.. dprint
52b0: 66 28 22 47 6f 74 20 53 53 4c 5f 45 52 52 4f 52 f("Got SSL_ERROR
52c0: 5f 57 41 4e 54 5f 52 45 41 44 2c 20 6d 61 70 70 _WANT_READ, mapp
52d0: 69 6e 67 20 69 74 20 74 6f 20 45 41 47 41 49 4e ing it to EAGAIN
52e0: 22 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 ");.. *errorC
52f0: 6f 64 65 50 74 72 20 3d 20 45 41 47 41 49 4e 3b odePtr = EAGAIN;
5300: 0a 09 20 20 20 20 77 72 69 74 74 65 6e 20 3d 20 .. written =
5310: 2d 31 3b 0a 09 20 20 20 20 73 74 61 74 65 50 74 -1;.. statePt
5320: 72 2d 3e 77 61 6e 74 20 3d 20 54 43 4c 5f 52 45 r->want = TCL_RE
5330: 41 44 41 42 4c 45 3b 0a 09 20 20 20 20 54 6c 73 ADABLE;.. Tls
5340: 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c _Error(statePtr,
5350: 20 22 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 "SSL_ERROR_WANT
5360: 5f 52 45 41 44 22 29 3b 0a 09 20 20 20 20 62 72 _READ");.. br
5370: 65 61 6b 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f eak;...case SSL_
5380: 45 52 52 4f 52 5f 57 41 4e 54 5f 57 52 49 54 45 ERROR_WANT_WRITE
5390: 3a 0a 09 20 20 20 20 2f 2a 20 4f 70 20 64 69 64 :.. /* Op did
53a0: 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 64 75 not complete du
53b0: 65 20 74 6f 20 75 6e 61 62 6c 65 20 74 6f 20 73 e to unable to s
53c0: 65 6e 74 20 61 6c 6c 20 64 61 74 61 20 74 6f 20 ent all data to
53d0: 74 68 65 20 42 49 4f 2e 20 52 65 74 72 79 20 6c the BIO. Retry l
53e0: 61 74 65 72 2e 20 2a 2f 0a 09 20 20 20 20 64 70 ater. */.. dp
53f0: 72 69 6e 74 66 28 22 47 6f 74 20 53 53 4c 5f 45 rintf("Got SSL_E
5400: 52 52 4f 52 5f 57 41 4e 54 5f 57 52 49 54 45 2c RROR_WANT_WRITE,
5410: 20 6d 61 70 70 69 6e 67 20 69 74 20 74 6f 20 45 mapping it to E
5420: 41 47 41 49 4e 22 29 3b 0a 09 20 20 20 20 2a 65 AGAIN");.. *e
5430: 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 41 rrorCodePtr = EA
5440: 47 41 49 4e 3b 0a 09 20 20 20 20 77 72 69 74 74 GAIN;.. writt
5450: 65 6e 20 3d 20 2d 31 3b 0a 09 20 20 20 20 73 74 en = -1;.. st
5460: 61 74 65 50 74 72 2d 3e 77 61 6e 74 20 3d 20 54 atePtr->want = T
5470: 43 4c 5f 57 52 49 54 41 42 4c 45 3b 0a 09 20 20 CL_WRITABLE;..
5480: 20 20 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 Tls_Error(stat
5490: 65 50 74 72 2c 20 22 53 53 4c 5f 45 52 52 4f 52 ePtr, "SSL_ERROR
54a0: 5f 57 41 4e 54 5f 57 52 49 54 45 22 29 3b 0a 09 _WANT_WRITE");..
54b0: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 63 61 73 break;...cas
54c0: 65 20 53 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 e SSL_ERROR_WANT
54d0: 5f 58 35 30 39 5f 4c 4f 4f 4b 55 50 3a 0a 09 20 _X509_LOOKUP:..
54e0: 20 20 20 2f 2a 20 4f 70 20 64 69 64 6e 27 74 20 /* Op didn't
54f0: 63 6f 6d 70 6c 65 74 65 20 73 69 6e 63 65 20 63 complete since c
5500: 61 6c 6c 62 61 63 6b 20 73 65 74 20 62 79 20 53 allback set by S
5510: 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e SL_CTX_set_clien
5520: 74 5f 63 65 72 74 5f 63 62 28 29 20 61 73 6b 65 t_cert_cb() aske
5530: 64 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 61 d to be called a
5540: 67 61 69 6e 20 2a 2f 0a 09 20 20 20 20 64 70 72 gain */.. dpr
5550: 69 6e 74 66 28 22 47 6f 74 20 53 53 4c 5f 45 52 intf("Got SSL_ER
5560: 52 4f 52 5f 57 41 4e 54 5f 58 35 30 39 5f 4c 4f ROR_WANT_X509_LO
5570: 4f 4b 55 50 2c 20 6d 61 70 70 69 6e 67 20 69 74 OKUP, mapping it
5580: 20 74 6f 20 45 41 47 41 49 4e 22 29 3b 0a 09 20 to EAGAIN");..
5590: 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 *errorCodePtr
55a0: 20 3d 20 45 41 47 41 49 4e 3b 0a 09 20 20 20 20 = EAGAIN;..
55b0: 77 72 69 74 74 65 6e 20 3d 20 2d 31 3b 0a 09 20 written = -1;..
55c0: 20 20 20 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 Tls_Error(sta
55d0: 74 65 50 74 72 2c 20 22 53 53 4c 5f 45 52 52 4f tePtr, "SSL_ERRO
55e0: 52 5f 57 41 4e 54 5f 58 35 30 39 5f 4c 4f 4f 4b R_WANT_X509_LOOK
55f0: 55 50 22 29 3b 0a 09 20 20 20 20 62 72 65 61 6b UP");.. break
5600: 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52 ;...case SSL_ERR
5610: 4f 52 5f 53 59 53 43 41 4c 4c 3a 0a 09 20 20 20 OR_SYSCALL:..
5620: 20 2f 2a 20 53 6f 6d 65 20 6e 6f 6e 2d 72 65 63 /* Some non-rec
5630: 6f 76 65 72 61 62 6c 65 2c 20 66 61 74 61 6c 20 overable, fatal
5640: 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 72 I/O error occurr
5650: 65 64 20 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e ed */.. dprin
5660: 74 66 28 22 53 53 4c 5f 45 52 52 4f 52 5f 53 59 tf("SSL_ERROR_SY
5670: 53 43 41 4c 4c 22 29 3b 0a 0a 09 20 20 20 20 69 SCALL");... i
5680: 66 20 28 62 61 63 6b 69 6e 67 45 72 72 6f 72 20 f (backingError
5690: 3d 3d 20 30 20 26 26 20 77 72 69 74 74 65 6e 20 == 0 && written
56a0: 3d 3d 20 30 29 20 7b 0a 09 09 64 70 72 69 6e 74 == 0) {...dprint
56b0: 66 28 22 45 4f 46 20 72 65 61 63 68 65 64 22 29 f("EOF reached")
56c0: 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 ...*errorCodePtr
56d0: 20 3d 20 30 3b 0a 09 09 77 72 69 74 74 65 6e 20 = 0;...written
56e0: 3d 20 30 3b 0a 09 09 54 6c 73 5f 45 72 72 6f 72 = 0;...Tls_Error
56f0: 28 73 74 61 74 65 50 74 72 2c 20 22 45 4f 46 20 (statePtr, "EOF
5700: 72 65 61 63 68 65 64 22 29 3b 0a 0a 09 20 20 20 reached");...
5710: 20 7d 20 65 6c 73 65 20 69 66 20 28 62 61 63 6b } else if (back
5720: 69 6e 67 45 72 72 6f 72 20 3d 3d 20 30 20 26 26 ingError == 0 &&
5730: 20 77 72 69 74 74 65 6e 20 3d 3d 20 2d 31 29 20 written == -1)
5740: 7b 0a 09 09 64 70 72 69 6e 74 66 28 22 49 2f 4f {...dprintf("I/O
5750: 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 error occurred
5760: 28 65 72 72 6e 6f 20 3d 20 25 6c 75 29 22 2c 20 (errno = %lu)",
5770: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 (unsigned long)
5780: 54 63 6c 5f 47 65 74 45 72 72 6e 6f 28 29 29 3b Tcl_GetErrno());
5790: 0a 09 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 ...*errorCodePtr
57a0: 20 3d 20 54 63 6c 5f 47 65 74 45 72 72 6e 6f 28 = Tcl_GetErrno(
57b0: 29 3b 0a 09 09 77 72 69 74 74 65 6e 20 3d 20 2d );...written = -
57c0: 31 3b 0a 09 09 54 6c 73 5f 45 72 72 6f 72 28 73 1;...Tls_Error(s
57d0: 74 61 74 65 50 74 72 2c 20 54 63 6c 5f 45 72 72 tatePtr, Tcl_Err
57e0: 6e 6f 4d 73 67 28 2a 65 72 72 6f 72 43 6f 64 65 noMsg(*errorCode
57f0: 50 74 72 29 29 3b 0a 0a 09 20 20 20 20 7d 20 65 Ptr));... } e
5800: 6c 73 65 20 7b 0a 09 09 64 70 72 69 6e 74 66 28 lse {...dprintf(
5810: 22 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 "I/O error occur
5820: 72 65 64 20 28 62 61 63 6b 69 6e 67 45 72 72 6f red (backingErro
5830: 72 20 3d 20 25 6c 75 29 22 2c 20 62 61 63 6b 69 r = %lu)", backi
5840: 6e 67 45 72 72 6f 72 29 3b 0a 09 09 2a 65 72 72 ngError);...*err
5850: 6f 72 43 6f 64 65 50 74 72 20 3d 20 54 63 6c 5f orCodePtr = Tcl_
5860: 47 65 74 45 72 72 6e 6f 28 29 3b 0a 09 09 77 72 GetErrno();...wr
5870: 69 74 74 65 6e 20 3d 20 2d 31 3b 0a 09 09 54 6c itten = -1;...Tl
5880: 73 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 s_Error(statePtr
5890: 2c 20 45 52 52 5f 72 65 61 73 6f 6e 5f 65 72 72 , ERR_reason_err
58a0: 6f 72 5f 73 74 72 69 6e 67 28 62 61 63 6b 69 6e or_string(backin
58b0: 67 45 72 72 6f 72 29 29 3b 0a 09 20 20 20 20 7d gError));.. }
58c0: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 63 .. break;...c
58d0: 61 73 65 20 53 53 4c 5f 45 52 52 4f 52 5f 5a 45 ase SSL_ERROR_ZE
58e0: 52 4f 5f 52 45 54 55 52 4e 3a 0a 09 20 20 20 20 RO_RETURN:..
58f0: 2f 2a 20 50 65 65 72 20 68 61 73 20 63 6c 6f 73 /* Peer has clos
5900: 65 64 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f ed the connectio
5910: 6e 20 62 79 20 73 65 6e 64 69 6e 67 20 74 68 65 n by sending the
5920: 20 63 6c 6f 73 65 5f 6e 6f 74 69 66 79 20 61 6c close_notify al
5930: 65 72 74 2e 20 43 61 6e 27 74 20 72 65 61 64 2c ert. Can't read,
5940: 20 62 75 74 20 63 61 6e 20 77 72 69 74 65 2e 20 but can write.
5950: 2a 2f 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 */.. dprintf(
5960: 22 47 6f 74 20 53 53 4c 5f 45 52 52 4f 52 5f 5a "Got SSL_ERROR_Z
5970: 45 52 4f 5f 52 45 54 55 52 4e 2c 20 74 68 69 73 ERO_RETURN, this
5980: 20 6d 65 61 6e 73 20 61 6e 20 45 4f 46 20 68 61 means an EOF ha
5990: 73 20 62 65 65 6e 20 72 65 61 63 68 65 64 22 29 s been reached")
59a0: 3b 0a 09 20 20 20 20 77 72 69 74 74 65 6e 20 3d ;.. written =
59b0: 20 30 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 0;.. *errorC
59c0: 6f 64 65 50 74 72 20 3d 20 30 3b 0a 09 20 20 20 odePtr = 0;..
59d0: 20 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 Tls_Error(state
59e0: 50 74 72 2c 20 22 50 65 65 72 20 68 61 73 20 63 Ptr, "Peer has c
59f0: 6c 6f 73 65 64 20 74 68 65 20 63 6f 6e 6e 65 63 losed the connec
5a00: 74 69 6f 6e 20 66 6f 72 20 77 72 69 74 69 6e 67 tion for writing
5a10: 20 62 79 20 73 65 6e 64 69 6e 67 20 74 68 65 20 by sending the
5a20: 63 6c 6f 73 65 5f 6e 6f 74 69 66 79 20 61 6c 65 close_notify ale
5a30: 72 74 22 29 3b 0a 09 20 20 20 20 62 72 65 61 6b rt");.. break
5a40: 3b 0a 0a 09 63 61 73 65 20 53 53 4c 5f 45 52 52 ;...case SSL_ERR
5a50: 4f 52 5f 57 41 4e 54 5f 41 53 59 4e 43 3a 0a 09 OR_WANT_ASYNC:..
5a60: 20 20 20 20 2f 2a 20 55 73 65 64 20 77 69 74 68 /* Used with
5a70: 20 66 6c 61 67 20 53 53 4c 5f 4d 4f 44 45 5f 41 flag SSL_MODE_A
5a80: 53 59 4e 43 2c 20 6f 70 20 64 69 64 6e 27 74 20 SYNC, op didn't
5a90: 63 6f 6d 70 6c 65 74 65 20 62 65 63 61 75 73 65 complete because
5aa0: 20 61 6e 20 61 73 79 6e 63 20 65 6e 67 69 6e 65 an async engine
5ab0: 20 69 73 20 73 74 69 6c 6c 20 70 72 6f 63 65 73 is still proces
5ac0: 73 69 6e 67 20 64 61 74 61 20 2a 2f 0a 09 20 20 sing data */..
5ad0: 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20 53 dprintf("Got S
5ae0: 53 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 41 53 SL_ERROR_WANT_AS
5af0: 59 4e 43 2c 20 6d 61 70 70 69 6e 67 20 74 68 69 YNC, mapping thi
5b00: 73 20 74 6f 20 45 41 47 41 49 4e 22 29 3b 0a 09 s to EAGAIN");..
5b10: 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 *errorCodePt
5b20: 72 20 3d 20 45 41 47 41 49 4e 3b 0a 09 20 20 20 r = EAGAIN;..
5b30: 20 77 72 69 74 74 65 6e 20 3d 20 2d 31 3b 0a 09 written = -1;..
5b40: 20 20 20 20 54 6c 73 5f 45 72 72 6f 72 28 73 74 Tls_Error(st
5b50: 61 74 65 50 74 72 2c 20 22 53 53 4c 5f 45 52 52 atePtr, "SSL_ERR
5b60: 4f 52 5f 57 41 4e 54 5f 41 53 59 4e 43 22 29 3b OR_WANT_ASYNC");
5b70: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 64 .. break;...d
5b80: 65 66 61 75 6c 74 3a 0a 09 20 20 20 20 64 70 72 efault:.. dpr
5b90: 69 6e 74 66 28 22 75 6e 6b 6e 6f 77 6e 20 65 72 intf("unknown er
5ba0: 72 6f 72 3a 20 25 64 22 2c 20 65 72 72 29 3b 0a ror: %d", err);.
5bb0: 09 20 20 20 20 54 6c 73 5f 45 72 72 6f 72 28 73 . Tls_Error(s
5bc0: 74 61 74 65 50 74 72 2c 20 22 55 6e 6b 6e 6f 77 tatePtr, "Unknow
5bd0: 6e 20 65 72 72 6f 72 22 29 3b 0a 09 20 20 20 20 n error");..
5be0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 break;. }..
5bf0: 20 20 64 70 72 69 6e 74 66 28 22 4f 75 74 70 75 dprintf("Outpu
5c00: 74 28 25 64 29 20 2d 3e 20 25 64 22 2c 20 74 6f t(%d) -> %d", to
5c10: 57 72 69 74 65 2c 20 77 72 69 74 74 65 6e 29 3b Write, written);
5c20: 0a 20 20 20 20 72 65 74 75 72 6e 20 77 72 69 74 . return writ
5c30: 74 65 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d ten;.}../*. *---
5c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
5c90: 20 54 6c 73 5f 47 65 74 50 61 72 65 6e 74 20 2d Tls_GetParent -
5ca0: 2d 0a 20 2a 0a 20 2a 20 20 20 20 47 65 74 20 70 -. *. * Get p
5cb0: 61 72 65 6e 74 20 63 68 61 6e 6e 65 6c 20 66 6f arent channel fo
5cc0: 72 20 61 20 73 74 61 63 6b 65 64 20 63 68 61 6e r a stacked chan
5cd0: 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c nel.. *. * Resul
5ce0: 74 73 3a 0a 20 2a 20 20 20 20 54 63 6c 5f 43 68 ts:. * Tcl_Ch
5cf0: 61 6e 6e 65 6c 20 6f 72 20 4e 55 4c 4c 20 69 66 annel or NULL if
5d00: 20 6e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d none.. *. *----
5d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 54 63 ---------. */.Tc
5d60: 6c 5f 43 68 61 6e 6e 65 6c 20 54 6c 73 5f 47 65 l_Channel Tls_Ge
5d70: 74 50 61 72 65 6e 74 28 53 74 61 74 65 20 2a 73 tParent(State *s
5d80: 74 61 74 65 50 74 72 2c 20 69 6e 74 20 6d 61 73 tatePtr, int mas
5d90: 6b 46 6c 61 67 73 29 20 7b 0a 20 20 20 20 64 70 kFlags) {. dp
5da0: 72 69 6e 74 66 28 22 52 65 71 75 65 73 74 65 64 rintf("Requested
5db0: 20 74 6f 20 67 65 74 20 70 61 72 65 6e 74 20 6f to get parent o
5dc0: 66 20 63 68 61 6e 6e 65 6c 20 25 70 22 2c 20 73 f channel %p", s
5dd0: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 3b 0a tatePtr->self);.
5de0: 0a 20 20 20 20 69 66 20 28 28 73 74 61 74 65 50 . if ((stateP
5df0: 74 72 2d 3e 66 6c 61 67 73 20 26 20 7e 6d 61 73 tr->flags & ~mas
5e00: 6b 46 6c 61 67 73 29 20 26 20 54 4c 53 5f 54 43 kFlags) & TLS_TC
5e10: 4c 5f 46 41 53 54 50 41 54 48 29 20 7b 0a 09 64 L_FASTPATH) {..d
5e20: 70 72 69 6e 74 66 28 22 41 73 6b 65 64 20 74 6f printf("Asked to
5e30: 20 67 65 74 20 74 68 65 20 70 61 72 65 6e 74 20 get the parent
5e40: 63 68 61 6e 6e 65 6c 20 77 68 69 6c 65 20 77 65 channel while we
5e50: 20 61 72 65 20 75 73 69 6e 67 20 46 61 73 74 50 are using FastP
5e60: 61 74 68 20 2d 2d 20 72 65 74 75 72 6e 69 6e 67 ath -- returning
5e70: 20 4e 55 4c 4c 22 29 3b 0a 09 72 65 74 75 72 6e NULL");..return
5e80: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 NULL;. }.
5e90: 20 72 65 74 75 72 6e 20 54 63 6c 5f 47 65 74 53 return Tcl_GetS
5ea0: 74 61 63 6b 65 64 43 68 61 6e 6e 65 6c 28 73 74 tackedChannel(st
5eb0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 3b 0a 7d atePtr->self);.}
5ec0: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
5ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5f10: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 53 65 ----. *. * TlsSe
5f20: 74 4f 70 74 69 6f 6e 50 72 6f 63 20 2d 2d 0a 20 tOptionProc --.
5f30: 2a 0a 20 2a 09 53 65 74 73 20 61 6e 20 6f 70 74 *. *.Sets an opt
5f40: 69 6f 6e 20 74 6f 20 76 61 6c 75 65 20 66 6f 72 ion to value for
5f50: 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 a SSL socket ba
5f60: 73 65 64 20 63 68 61 6e 6e 65 6c 2e 20 43 61 6c sed channel. Cal
5f70: 6c 65 64 20 62 79 20 74 68 65 0a 20 2a 09 67 65 led by the. *.ge
5f80: 6e 65 72 69 63 20 49 2f 4f 20 6c 61 79 65 72 20 neric I/O layer
5f90: 77 68 65 6e 65 76 65 72 20 74 68 65 20 54 63 6c whenever the Tcl
5fa0: 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f _SetChannelOptio
5fb0: 6e 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 n() function is
5fc0: 75 73 65 64 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 used.. *. * Resu
5fd0: 6c 74 73 3a 0a 20 2a 20 20 20 20 54 43 4c 5f 4f lts:. * TCL_O
5fe0: 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 K if successful
5ff0: 6f 72 20 54 43 4c 5f 45 52 52 4f 52 20 69 66 20 or TCL_ERROR if
6000: 66 61 69 6c 65 64 2e 0a 20 2a 0a 20 2a 20 53 69 failed.. *. * Si
6010: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 20 20 de effects:. *
6020: 20 20 55 70 64 61 74 65 73 20 63 68 61 6e 6e 65 Updates channe
6030: 6c 20 6f 70 74 69 6f 6e 20 74 6f 20 6e 65 77 20 l option to new
6040: 76 61 6c 75 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d value.. *. *----
6050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 ---------. */.st
60a0: 61 74 69 63 20 69 6e 74 0a 54 6c 73 53 65 74 4f atic int.TlsSetO
60b0: 70 74 69 6f 6e 50 72 6f 63 28 43 6c 69 65 6e 74 ptionProc(Client
60c0: 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 Data instanceDat
60d0: 61 2c 20 20 20 20 2f 2a 20 53 6f 63 6b 65 74 20 a, /* Socket
60e0: 73 74 61 74 65 2e 20 2a 2f 0a 20 20 20 20 54 63 state. */. Tc
60f0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
6100: 2c 09 09 2f 2a 20 46 6f 72 20 65 72 72 6f 72 73 ,../* For errors
6110: 20 2d 20 63 61 6e 20 62 65 20 4e 55 4c 4c 2e 20 - can be NULL.
6120: 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 */. const cha
6130: 72 20 2a 6f 70 74 69 6f 6e 4e 61 6d 65 2c 09 2f r *optionName,./
6140: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 * Name of the op
6150: 74 69 6f 6e 20 74 6f 20 73 65 74 20 74 68 65 20 tion to set the
6160: 76 61 6c 75 65 20 66 6f 72 2c 20 6f 72 0a 09 09 value for, or...
6170: 09 09 20 2a 20 4e 55 4c 4c 20 74 6f 20 67 65 74 .. * NULL to get
6180: 20 61 6c 6c 20 6f 70 74 69 6f 6e 73 20 61 6e 64 all options and
6190: 20 74 68 65 69 72 20 76 61 6c 75 65 73 2e 20 2a their values. *
61a0: 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 /. const char
61b0: 20 2a 6f 70 74 69 6f 6e 56 61 6c 75 65 29 09 2f *optionValue)./
61c0: 2a 20 56 61 6c 75 65 20 66 6f 72 20 6f 70 74 69 * Value for opti
61d0: 6f 6e 2e 20 2a 2f 0a 7b 0a 20 20 20 20 53 74 61 on. */.{. Sta
61e0: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 te *statePtr = (
61f0: 53 74 61 74 65 20 2a 29 20 69 6e 73 74 61 6e 63 State *) instanc
6200: 65 44 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f 43 eData;. Tcl_C
6210: 68 61 6e 6e 65 6c 20 70 61 72 65 6e 74 20 3d 20 hannel parent =
6220: 54 6c 73 5f 47 65 74 50 61 72 65 6e 74 28 73 74 Tls_GetParent(st
6230: 61 74 65 50 74 72 2c 20 54 4c 53 5f 54 43 4c 5f atePtr, TLS_TCL_
6240: 46 41 53 54 50 41 54 48 29 3b 0a 20 20 20 20 54 FASTPATH);. T
6250: 63 6c 5f 44 72 69 76 65 72 53 65 74 4f 70 74 69 cl_DriverSetOpti
6260: 6f 6e 50 72 6f 63 20 2a 73 65 74 4f 70 74 69 6f onProc *setOptio
6270: 6e 50 72 6f 63 3b 0a 0a 20 20 20 20 64 70 72 69 nProc;.. dpri
6280: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
6290: 20 20 20 20 73 65 74 4f 70 74 69 6f 6e 50 72 6f setOptionPro
62a0: 63 20 3d 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 53 c = Tcl_ChannelS
62b0: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 28 54 63 6c etOptionProc(Tcl
62c0: 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 _GetChannelType(
62d0: 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 69 66 parent));. if
62e0: 20 28 73 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 (setOptionProc
62f0: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 != NULL) {..retu
6300: 72 6e 20 28 2a 73 65 74 4f 70 74 69 6f 6e 50 72 rn (*setOptionPr
6310: 6f 63 29 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e oc)(Tcl_GetChann
6320: 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 70 elInstanceData(p
6330: 61 72 65 6e 74 29 2c 20 69 6e 74 65 72 70 2c 20 arent), interp,
6340: 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20 6f 70 74 69 optionName, opti
6350: 6f 6e 56 61 6c 75 65 29 3b 0a 20 20 20 20 7d 0a onValue);. }.
6360: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 52 65 /*. * Re
6370: 71 75 65 73 74 20 66 6f 72 20 61 20 73 70 65 63 quest for a spec
6380: 69 66 69 63 20 6f 70 74 69 6f 6e 20 68 61 73 20 ific option has
6390: 74 6f 20 66 61 69 6c 2c 20 77 65 20 64 6f 6e 27 to fail, we don'
63a0: 74 20 68 61 76 65 20 61 6e 79 2e 0a 20 20 20 20 t have any..
63b0: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 54 */. return T
63c0: 63 6c 5f 42 61 64 43 68 61 6e 6e 65 6c 4f 70 74 cl_BadChannelOpt
63d0: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 6f 70 74 69 ion(interp, opti
63e0: 6f 6e 4e 61 6d 65 2c 20 22 22 29 3b 0a 7d 0a 0a onName, "");.}..
63f0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
6400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6430: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 --------. *. * T
6440: 6c 73 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 lsGetOptionProc
6450: 2d 2d 0a 20 2a 0a 20 2a 09 47 65 74 20 61 20 6f --. *. *.Get a o
6460: 70 74 69 6f 6e 27 73 20 76 61 6c 75 65 20 66 6f ption's value fo
6470: 72 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 r a SSL socket b
6480: 61 73 65 64 20 63 68 61 6e 6e 65 6c 2c 20 6f 72 ased channel, or
6490: 20 61 20 6c 69 73 74 20 6f 66 20 61 6c 6c 0a 20 a list of all.
64a0: 2a 09 6f 70 74 69 6f 6e 73 20 61 6e 64 20 74 68 *.options and th
64b0: 65 69 72 20 76 61 6c 75 65 73 2e 20 43 61 6c 6c eir values. Call
64c0: 65 64 20 62 79 20 74 68 65 20 67 65 6e 65 72 69 ed by the generi
64d0: 63 20 49 2f 4f 20 6c 61 79 65 72 20 77 68 65 6e c I/O layer when
64e0: 65 76 65 72 20 74 68 65 0a 20 2a 09 54 63 6c 5f ever the. *.Tcl_
64f0: 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e GetChannelOption
6500: 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 () function is u
6510: 73 65 64 2e 0a 20 2a 0a 20 2a 0a 20 2a 20 52 65 sed.. *. *. * Re
6520: 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e sults:. *.A stan
6530: 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e dard Tcl result.
6540: 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 The value of th
6550: 65 20 73 70 65 63 69 66 69 65 64 20 6f 70 74 69 e specified opti
6560: 6f 6e 20 6f 72 20 61 20 6c 69 73 74 20 6f 66 0a on or a list of.
6570: 20 2a 09 61 6c 6c 20 6f 70 74 69 6f 6e 73 20 61 *.all options a
6580: 6e 64 20 74 68 65 69 72 20 76 61 6c 75 65 73 20 nd their values
6590: 69 73 20 72 65 74 75 72 6e 65 64 20 69 6e 20 74 is returned in t
65a0: 68 65 20 73 75 70 70 6c 69 65 64 20 44 53 74 72 he supplied DStr
65b0: 69 6e 67 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 ing.. *. * Side
65c0: 65 66 66 65 63 74 73 3a 0a 20 2a 20 20 20 20 4e effects:. * N
65d0: 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d one.. *. *------
65e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
65f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
6620: 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 54 6c 73 /.static int.Tls
6630: 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63 28 43 6c GetOptionProc(Cl
6640: 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 ientData instanc
6650: 65 44 61 74 61 2c 20 20 20 20 2f 2a 20 53 6f 63 eData, /* Soc
6660: 6b 65 74 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 ket state. */.
6670: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e Tcl_Interp *in
6680: 74 65 72 70 2c 09 09 2f 2a 20 46 6f 72 20 65 72 terp,../* For er
6690: 72 6f 72 73 20 2d 20 63 61 6e 20 62 65 20 4e 55 rors - can be NU
66a0: 4c 4c 2e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 LL. */. const
66b0: 20 63 68 61 72 20 2a 6f 70 74 69 6f 6e 4e 61 6d char *optionNam
66c0: 65 2c 09 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 e,./* Name of th
66d0: 65 20 6f 70 74 69 6f 6e 20 74 6f 20 72 65 74 72 e option to retr
66e0: 69 65 76 65 20 74 68 65 20 76 61 6c 75 65 20 66 ieve the value f
66f0: 6f 72 2c 20 6f 72 0a 09 09 09 09 20 2a 20 4e 55 or, or..... * NU
6700: 4c 4c 20 74 6f 20 67 65 74 20 61 6c 6c 20 6f 70 LL to get all op
6710: 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 69 72 20 tions and their
6720: 76 61 6c 75 65 73 2e 20 2a 2f 0a 20 20 20 20 54 values. */. T
6730: 63 6c 5f 44 53 74 72 69 6e 67 20 2a 6f 70 74 69 cl_DString *opti
6740: 6f 6e 56 61 6c 75 65 29 09 2f 2a 20 57 68 65 72 onValue)./* Wher
6750: 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63 e to store the c
6760: 6f 6d 70 75 74 65 64 20 76 61 6c 75 65 20 69 6e omputed value in
6770: 69 74 69 61 6c 69 7a 65 64 20 62 79 20 63 61 6c itialized by cal
6780: 6c 65 72 2e 20 2a 2f 0a 7b 0a 20 20 20 20 53 74 ler. */.{. St
6790: 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 ate *statePtr =
67a0: 28 53 74 61 74 65 20 2a 29 20 69 6e 73 74 61 6e (State *) instan
67b0: 63 65 44 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f ceData;. Tcl_
67c0: 43 68 61 6e 6e 65 6c 20 70 61 72 65 6e 74 20 3d Channel parent =
67d0: 20 54 6c 73 5f 47 65 74 50 61 72 65 6e 74 28 73 Tls_GetParent(s
67e0: 74 61 74 65 50 74 72 2c 20 54 4c 53 5f 54 43 4c tatePtr, TLS_TCL
67f0: 5f 46 41 53 54 50 41 54 48 29 3b 0a 20 20 20 20 _FASTPATH);.
6800: 54 63 6c 5f 44 72 69 76 65 72 47 65 74 4f 70 74 Tcl_DriverGetOpt
6810: 69 6f 6e 50 72 6f 63 20 2a 67 65 74 4f 70 74 69 ionProc *getOpti
6820: 6f 6e 50 72 6f 63 3b 0a 0a 20 20 20 20 64 70 72 onProc;.. dpr
6830: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
6840: 0a 20 20 20 20 67 65 74 4f 70 74 69 6f 6e 50 72 . getOptionPr
6850: 6f 63 20 3d 20 54 63 6c 5f 43 68 61 6e 6e 65 6c oc = Tcl_Channel
6860: 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63 28 54 63 GetOptionProc(Tc
6870: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 l_GetChannelType
6880: 28 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 69 (parent));. i
6890: 66 20 28 67 65 74 4f 70 74 69 6f 6e 50 72 6f 63 f (getOptionProc
68a0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 != NULL) {..ret
68b0: 75 72 6e 20 28 2a 67 65 74 4f 70 74 69 6f 6e 50 urn (*getOptionP
68c0: 72 6f 63 29 28 54 63 6c 5f 47 65 74 43 68 61 6e roc)(Tcl_GetChan
68d0: 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 nelInstanceData(
68e0: 70 61 72 65 6e 74 29 2c 20 69 6e 74 65 72 70 2c parent), interp,
68f0: 20 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20 6f 70 74 optionName, opt
6900: 69 6f 6e 56 61 6c 75 65 29 3b 0a 20 20 20 20 7d ionValue);. }
6910: 20 65 6c 73 65 20 69 66 20 28 6f 70 74 69 6f 6e else if (option
6920: 4e 61 6d 65 20 3d 3d 20 28 63 68 61 72 2a 29 20 Name == (char*)
6930: 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 NULL) {../*.. *
6940: 52 65 71 75 65 73 74 20 69 73 20 71 75 65 72 79 Request is query
6950: 20 66 6f 72 20 61 6c 6c 20 6f 70 74 69 6f 6e 73 for all options
6960: 2c 20 74 68 69 73 20 69 73 20 6f 6b 2e 0a 09 20 , this is ok...
6970: 2a 2f 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 4f */..return TCL_O
6980: 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 0a K;. }. /*.
6990: 20 20 20 20 20 2a 20 52 65 71 75 65 73 74 20 66 * Request f
69a0: 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 6f 70 or a specific op
69b0: 74 69 6f 6e 20 68 61 73 20 74 6f 20 66 61 69 6c tion has to fail
69c0: 2c 20 77 65 20 64 6f 6e 27 74 20 68 61 76 65 20 , we don't have
69d0: 61 6e 79 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 any.. */.
69e0: 20 72 65 74 75 72 6e 20 54 63 6c 5f 42 61 64 43 return Tcl_BadC
69f0: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 hannelOption(int
6a00: 65 72 70 2c 20 6f 70 74 69 6f 6e 4e 61 6d 65 2c erp, optionName,
6a10: 20 22 22 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d "");.}../*. *--
6a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
6a70: 2a 20 20 20 20 54 6c 73 43 68 61 6e 6e 65 6c 48 * TlsChannelH
6a80: 61 6e 64 6c 65 72 54 69 6d 65 72 20 2d 2d 0a 20 andlerTimer --.
6a90: 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 62 79 20 74 *. *.Called by t
6aa0: 68 65 20 6e 6f 74 69 66 69 65 72 20 76 69 61 20 he notifier via
6ab0: 61 20 74 69 6d 65 72 2c 20 74 6f 20 66 6c 75 73 a timer, to flus
6ac0: 68 20 6f 75 74 20 64 61 74 61 20 77 61 69 74 69 h out data waiti
6ad0: 6e 67 20 69 6e 0a 20 2a 09 63 68 61 6e 6e 65 6c ng in. *.channel
6ae0: 20 62 75 66 66 65 72 73 2e 20 63 61 6c 6c 65 64 buffers. called
6af0: 20 62 79 20 74 68 65 20 67 65 6e 65 72 69 63 20 by the generic
6b00: 49 2f 4f 20 6c 61 79 65 72 20 77 68 65 6e 65 76 I/O layer whenev
6b10: 65 72 20 74 68 65 0a 20 2a 09 54 63 6c 5f 47 65 er the. *.Tcl_Ge
6b20: 74 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 28 29 tChannelHandle()
6b30: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 function is use
6b40: 64 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 d.. *. * Results
6b50: 3a 0a 20 2a 20 20 20 20 20 20 20 20 4e 6f 6e 65 :. * None
6b60: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 .. *. * Side eff
6b70: 65 63 74 73 3a 0a 20 2a 09 43 72 65 61 74 65 73 ects:. *.Creates
6b80: 20 6e 6f 74 69 66 69 63 61 74 69 6f 6e 20 65 76 notification ev
6b90: 65 6e 74 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d ent.. *. *------
6ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
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 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
6bf0: 69 63 20 76 6f 69 64 20 54 6c 73 43 68 61 6e 6e ic void TlsChann
6c00: 65 6c 48 61 6e 64 6c 65 72 54 69 6d 65 72 28 43 elHandlerTimer(C
6c10: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 lientData client
6c20: 44 61 74 61 29 20 7b 0a 20 20 20 20 53 74 61 74 Data) {. Stat
6c30: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 e *statePtr = (S
6c40: 74 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 tate *) clientDa
6c50: 74 61 3b 0a 20 20 20 20 69 6e 74 20 6d 61 73 6b ta;. int mask
6c60: 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 77 61 6e = statePtr->wan
6c70: 74 3b 20 2f 2a 20 49 6e 69 74 20 74 6f 20 53 53 t; /* Init to SS
6c80: 4c 5f 45 52 52 4f 52 5f 57 41 4e 54 5f 52 45 41 L_ERROR_WANT_REA
6c90: 44 20 61 6e 64 20 53 53 4c 5f 45 52 52 4f 52 5f D and SSL_ERROR_
6ca0: 57 41 4e 54 5f 57 52 49 54 45 20 2a 2f 0a 0a 20 WANT_WRITE */..
6cb0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
6cc0: 65 64 22 29 3b 0a 0a 20 20 20 20 73 74 61 74 65 ed");.. state
6cd0: 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 28 54 63 Ptr->timer = (Tc
6ce0: 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 l_TimerToken) NU
6cf0: 4c 4c 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 LL;.. /* Chec
6d00: 6b 20 66 6f 72 20 61 6d 6f 75 6e 74 20 6f 66 20 k for amount of
6d10: 64 61 74 61 20 70 65 6e 64 69 6e 67 20 69 6e 20 data pending in
6d20: 42 49 4f 20 77 72 69 74 65 20 62 75 66 66 65 72 BIO write buffer
6d30: 20 2a 2f 0a 20 20 20 20 69 66 20 28 42 49 4f 5f */. if (BIO_
6d40: 77 70 65 6e 64 69 6e 67 28 73 74 61 74 65 50 74 wpending(statePt
6d50: 72 2d 3e 62 69 6f 29 29 20 7b 0a 09 64 70 72 69 r->bio)) {..dpri
6d60: 6e 74 66 28 22 5b 63 68 61 6e 3d 25 70 5d 20 42 ntf("[chan=%p] B
6d70: 49 4f 20 77 72 69 74 61 62 6c 65 22 2c 20 73 74 IO writable", st
6d80: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 3b 0a 0a atePtr->self);..
6d90: 09 6d 61 73 6b 20 7c 3d 20 54 43 4c 5f 57 52 49 .mask |= TCL_WRI
6da0: 54 41 42 4c 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 TABLE;. }..
6db0: 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 /* Check for a
6dc0: 6d 6f 75 6e 74 20 6f 66 20 64 61 74 61 20 70 65 mount of data pe
6dd0: 6e 64 69 6e 67 20 69 6e 20 42 49 4f 20 72 65 61 nding in BIO rea
6de0: 64 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20 20 d buffer */.
6df0: 69 66 20 28 42 49 4f 5f 70 65 6e 64 69 6e 67 28 if (BIO_pending(
6e00: 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 29 20 statePtr->bio))
6e10: 7b 0a 09 64 70 72 69 6e 74 66 28 22 5b 63 68 61 {..dprintf("[cha
6e20: 6e 3d 25 70 5d 20 42 49 4f 20 72 65 61 64 61 62 n=%p] BIO readab
6e30: 6c 65 22 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 le", statePtr->s
6e40: 65 6c 66 29 3b 0a 0a 09 6d 61 73 6b 20 7c 3d 20 elf);...mask |=
6e50: 54 43 4c 5f 52 45 41 44 41 42 4c 45 3b 0a 20 20 TCL_READABLE;.
6e60: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4e 6f 74 69 }.. /* Noti
6e70: 66 79 20 65 76 65 6e 74 20 73 75 62 73 79 73 74 fy event subsyst
6e80: 65 6d 20 74 68 61 74 20 74 68 65 20 63 68 61 6e em that the chan
6e90: 6e 65 6c 20 69 73 20 72 65 61 64 61 62 6c 65 20 nel is readable
6ea0: 6f 72 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a or writeable */.
6eb0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 4e 6f 74 dprintf("Not
6ec0: 69 66 79 69 6e 67 20 6f 75 72 73 65 6c 76 65 73 ifying ourselves
6ed0: 22 29 3b 0a 20 20 20 20 54 63 6c 5f 4e 6f 74 69 ");. Tcl_Noti
6ee0: 66 79 43 68 61 6e 6e 65 6c 28 73 74 61 74 65 50 fyChannel(stateP
6ef0: 74 72 2d 3e 73 65 6c 66 2c 20 6d 61 73 6b 29 3b tr->self, mask);
6f00: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 77 . statePtr->w
6f10: 61 6e 74 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 ant = 0;.. dp
6f20: 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 rintf("Returning
6f30: 22 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 3b ");.. return;
6f40: 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d .}../*. *-------
6f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6f90: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 ------. *. * Tls
6fa0: 57 61 74 63 68 50 72 6f 63 20 2d 2d 0a 20 2a 0a WatchProc --. *.
6fb0: 20 2a 09 53 65 74 20 75 70 20 74 68 65 20 65 76 *.Set up the ev
6fc0: 65 6e 74 20 6e 6f 74 69 66 69 65 72 20 74 6f 20 ent notifier to
6fd0: 77 61 74 63 68 20 66 6f 72 20 65 76 65 6e 74 73 watch for events
6fe0: 20 6f 66 20 69 6e 74 65 72 65 73 74 20 66 72 6f of interest fro
6ff0: 6d 20 74 68 69 73 0a 20 2a 09 63 68 61 6e 6e 65 m this. *.channe
7000: 6c 2e 20 43 61 6c 6c 65 64 20 62 79 20 74 68 65 l. Called by the
7010: 20 67 65 6e 65 72 69 63 20 49 2f 4f 20 6c 61 79 generic I/O lay
7020: 65 72 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 er whenever the
7030: 75 73 65 72 20 28 6f 72 20 74 68 65 0a 20 2a 09 user (or the. *.
7040: 73 79 73 74 65 6d 29 20 61 6e 6e 6f 75 6e 63 65 system) announce
7050: 73 20 69 74 73 20 28 64 69 73 29 69 6e 74 65 72 s its (dis)inter
7060: 65 73 74 20 69 6e 20 65 76 65 6e 74 73 20 6f 6e est in events on
7070: 20 74 68 65 20 63 68 61 6e 6e 65 6c 2e 20 54 68 the channel. Th
7080: 69 73 20 69 73 0a 20 2a 09 63 61 6c 6c 65 64 20 is is. *.called
7090: 72 65 70 65 61 74 65 64 6c 79 2e 0a 20 2a 0a 20 repeatedly.. *.
70a0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 20 20 20 * Results:. *
70b0: 20 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 None.. *. * Sid
70c0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 65 e effects:. *.Se
70d0: 74 73 20 75 70 20 74 68 65 20 74 69 6d 65 2d 62 ts up the time-b
70e0: 61 73 65 64 20 6e 6f 74 69 66 69 65 72 20 73 6f ased notifier so
70f0: 20 74 68 61 74 20 66 75 74 75 72 65 20 65 76 65 that future eve
7100: 6e 74 73 20 6f 6e 20 74 68 65 20 63 68 61 6e 6e nts on the chann
7110: 65 6c 0a 20 2a 09 77 69 6c 6c 20 62 65 20 73 65 el. *.will be se
7120: 65 6e 20 62 79 20 54 43 4c 2e 0a 20 2a 0a 20 2a en by TCL.. *. *
7130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
7180: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 54 6c /.static void.Tl
7190: 73 57 61 74 63 68 50 72 6f 63 28 43 6c 69 65 6e sWatchProc(Clien
71a0: 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 tData instanceDa
71b0: 74 61 2c 20 20 20 20 2f 2a 20 54 68 65 20 73 6f ta, /* The so
71c0: 63 6b 65 74 20 73 74 61 74 65 2e 20 2a 2f 0a 20 cket state. */.
71d0: 20 20 20 69 6e 74 20 6d 61 73 6b 29 09 09 09 2f int mask).../
71e0: 2a 20 45 76 65 6e 74 73 20 6f 66 20 69 6e 74 65 * Events of inte
71f0: 72 65 73 74 3b 20 61 6e 20 4f 52 2d 65 64 20 63 rest; an OR-ed c
7200: 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 0a 09 09 ombination of...
7210: 09 09 20 2a 20 54 43 4c 5f 52 45 41 44 41 42 4c .. * TCL_READABL
7220: 45 2c 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 20 E, TCL_WRITABLE
7230: 61 6e 64 20 54 43 4c 5f 45 58 43 45 50 54 49 4f and TCL_EXCEPTIO
7240: 4e 2e 20 2a 2f 0a 7b 0a 20 20 20 20 54 63 6c 5f N. */.{. Tcl_
7250: 43 68 61 6e 6e 65 6c 20 20 20 20 20 70 61 72 65 Channel pare
7260: 6e 74 3b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 nt;. State *s
7270: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 tatePtr = (State
7280: 20 2a 29 20 69 6e 73 74 61 6e 63 65 44 61 74 61 *) instanceData
7290: 3b 0a 20 20 20 20 54 63 6c 5f 44 72 69 76 65 72 ;. Tcl_Driver
72a0: 57 61 74 63 68 50 72 6f 63 20 2a 77 61 74 63 68 WatchProc *watch
72b0: 50 72 6f 63 3b 0a 0a 20 20 20 20 64 70 72 69 6e Proc;.. dprin
72c0: 74 66 28 22 54 6c 73 57 61 74 63 68 50 72 6f 63 tf("TlsWatchProc
72d0: 28 30 78 25 78 29 22 2c 20 6d 61 73 6b 29 3b 0a (0x%x)", mask);.
72e0: 20 20 20 20 64 70 72 69 6e 74 46 6c 61 67 73 28 dprintFlags(
72f0: 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 statePtr);..
7300: 2f 2a 20 50 72 65 74 65 6e 64 20 74 6f 20 62 65 /* Pretend to be
7310: 20 64 65 61 64 20 61 73 20 6c 6f 6e 67 20 61 73 dead as long as
7320: 20 74 68 65 20 76 65 72 69 66 79 20 63 61 6c 6c the verify call
7330: 62 61 63 6b 20 69 73 20 72 75 6e 6e 69 6e 67 2e back is running.
7340: 0a 20 20 20 20 20 2a 20 4f 74 68 65 72 77 69 73 . * Otherwis
7350: 65 20 74 68 61 74 20 63 61 6c 6c 62 61 63 6b 20 e that callback
7360: 63 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64 could be invoked
7370: 20 72 65 63 75 72 73 69 76 65 6c 79 2e 20 2a 2f recursively. */
7380: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
7390: 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 r->flags & TLS_T
73a0: 43 4c 5f 43 41 4c 4c 42 41 43 4b 29 20 7b 0a 09 CL_CALLBACK) {..
73b0: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 62 61 63 dprintf("Callbac
73c0: 6b 20 69 73 20 6f 6e 2d 67 6f 69 6e 67 2c 20 64 k is on-going, d
73d0: 6f 69 6e 67 20 6e 6f 74 68 69 6e 67 22 29 3b 0a oing nothing");.
73e0: 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a .return;. }..
73f0: 20 20 20 20 70 61 72 65 6e 74 20 3d 20 54 6c 73 parent = Tls
7400: 5f 47 65 74 50 61 72 65 6e 74 28 73 74 61 74 65 _GetParent(state
7410: 50 74 72 2c 20 54 4c 53 5f 54 43 4c 5f 46 41 53 Ptr, TLS_TCL_FAS
7420: 54 50 41 54 48 29 3b 0a 0a 20 20 20 20 69 66 20 TPATH);.. if
7430: 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 (statePtr->flags
7440: 20 26 20 54 4c 53 5f 54 43 4c 5f 48 41 4e 44 53 & TLS_TCL_HANDS
7450: 48 41 4b 45 5f 46 41 49 4c 45 44 29 20 7b 0a 09 HAKE_FAILED) {..
7460: 64 70 72 69 6e 74 66 28 22 41 73 6b 65 64 20 74 dprintf("Asked t
7470: 6f 20 77 61 74 63 68 20 61 20 73 6f 63 6b 65 74 o watch a socket
7480: 20 77 69 74 68 20 61 20 66 61 69 6c 65 64 20 68 with a failed h
7490: 61 6e 64 73 68 61 6b 65 20 2d 2d 20 6e 6f 74 68 andshake -- noth
74a0: 69 6e 67 20 63 61 6e 20 68 61 70 70 65 6e 20 68 ing can happen h
74b0: 65 72 65 22 29 3b 0a 09 64 70 72 69 6e 74 66 28 ere");..dprintf(
74c0: 22 55 6e 72 65 67 69 73 74 65 72 69 6e 67 20 69 "Unregistering i
74d0: 6e 74 65 72 65 73 74 20 69 6e 20 74 68 65 20 6c nterest in the l
74e0: 6f 77 65 72 20 63 68 61 6e 6e 65 6c 22 29 3b 0a ower channel");.
74f0: 0a 09 77 61 74 63 68 50 72 6f 63 20 3d 20 54 63 ..watchProc = Tc
7500: 6c 5f 43 68 61 6e 6e 65 6c 57 61 74 63 68 50 72 l_ChannelWatchPr
7510: 6f 63 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 oc(Tcl_GetChanne
7520: 6c 54 79 70 65 28 70 61 72 65 6e 74 29 29 3b 0a lType(parent));.
7530: 09 77 61 74 63 68 50 72 6f 63 28 54 63 6c 5f 47 .watchProc(Tcl_G
7540: 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 etChannelInstanc
7550: 65 44 61 74 61 28 70 61 72 65 6e 74 29 2c 20 30 eData(parent), 0
7560: 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 77 61 );..statePtr->wa
7570: 74 63 68 4d 61 73 6b 20 3d 20 30 3b 0a 09 72 65 tchMask = 0;..re
7580: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 turn;. }..
7590: 20 73 74 61 74 65 50 74 72 2d 3e 77 61 74 63 68 statePtr->watch
75a0: 4d 61 73 6b 20 3d 20 6d 61 73 6b 3b 0a 0a 20 20 Mask = mask;..
75b0: 20 20 2f 2a 20 4e 6f 20 63 68 61 6e 6e 65 6c 20 /* No channel
75c0: 68 61 6e 64 6c 65 72 73 20 61 6e 79 20 6d 6f 72 handlers any mor
75d0: 65 2e 20 57 65 20 77 69 6c 6c 20 62 65 20 6e 6f e. We will be no
75e0: 74 69 66 69 65 64 20 61 75 74 6f 6d 61 74 69 63 tified automatic
75f0: 61 6c 6c 79 0a 20 20 20 20 20 2a 20 61 62 6f 75 ally. * abou
7600: 74 20 65 76 65 6e 74 73 20 6f 6e 20 74 68 65 20 t events on the
7610: 63 68 61 6e 6e 65 6c 20 62 65 6c 6f 77 20 76 69 channel below vi
7620: 61 20 61 20 63 61 6c 6c 20 74 6f 20 6f 75 72 0a a a call to our.
7630: 20 20 20 20 20 2a 20 27 54 72 61 6e 73 66 6f 72 * 'Transfor
7640: 6d 4e 6f 74 69 66 79 50 72 6f 63 27 2e 20 42 75 mNotifyProc'. Bu
7650: 74 20 77 65 20 68 61 76 65 20 74 6f 20 70 61 73 t we have to pas
7660: 73 20 74 68 65 20 69 6e 74 65 72 65 73 74 20 64 s the interest d
7670: 6f 77 6e 20 6e 6f 77 2e 0a 20 20 20 20 20 2a 20 own now.. *
7680: 57 65 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 We are allowed t
7690: 6f 20 61 64 64 20 61 64 64 69 74 69 6f 6e 61 6c o add additional
76a0: 20 27 69 6e 74 65 72 65 73 74 27 20 74 6f 20 74 'interest' to t
76b0: 68 65 20 6d 61 73 6b 20 69 66 20 77 65 20 77 61 he mask if we wa
76c0: 6e 74 0a 20 20 20 20 20 2a 20 74 6f 2e 20 42 75 nt. * to. Bu
76d0: 74 20 74 68 69 73 20 74 72 61 6e 73 66 6f 72 6d t this transform
76e0: 61 74 69 6f 6e 20 68 61 73 20 6e 6f 20 73 75 63 ation has no suc
76f0: 68 20 69 6e 74 65 72 65 73 74 2e 20 49 74 20 6a h interest. It j
7700: 75 73 74 20 70 61 73 73 65 73 0a 20 20 20 20 20 ust passes.
7710: 2a 20 74 68 65 20 72 65 71 75 65 73 74 20 64 6f * the request do
7720: 77 6e 2c 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 wn, unchanged..
7730: 20 20 20 20 2a 2f 0a 20 20 20 20 64 70 72 69 6e */. dprin
7740: 74 66 28 22 52 65 67 69 73 74 65 72 69 6e 67 20 tf("Registering
7750: 6f 75 72 20 69 6e 74 65 72 65 73 74 20 69 6e 20 our interest in
7760: 74 68 65 20 6c 6f 77 65 72 20 63 68 61 6e 6e 65 the lower channe
7770: 6c 20 28 63 68 61 6e 3d 25 70 29 22 2c 20 28 76 l (chan=%p)", (v
7780: 6f 69 64 20 2a 29 20 70 61 72 65 6e 74 29 3b 0a oid *) parent);.
7790: 20 20 20 20 77 61 74 63 68 50 72 6f 63 20 3d 20 watchProc =
77a0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 57 61 74 63 68 Tcl_ChannelWatch
77b0: 50 72 6f 63 28 54 63 6c 5f 47 65 74 43 68 61 6e Proc(Tcl_GetChan
77c0: 6e 65 6c 54 79 70 65 28 70 61 72 65 6e 74 29 29 nelType(parent))
77d0: 3b 0a 20 20 20 20 77 61 74 63 68 50 72 6f 63 28 ;. watchProc(
77e0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e Tcl_GetChannelIn
77f0: 73 74 61 6e 63 65 44 61 74 61 28 70 61 72 65 6e stanceData(paren
7800: 74 29 2c 20 6d 61 73 6b 29 3b 0a 0a 0a 20 20 20 t), mask);...
7810: 20 2f 2a 0a 20 20 20 20 20 2a 20 4d 61 6e 61 67 /*. * Manag
7820: 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 69 6e 74 ement of the int
7830: 65 72 6e 61 6c 20 74 69 6d 65 72 2e 0a 20 20 20 ernal timer..
7840: 20 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 */. if (sta
7850: 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20 tePtr->timer !=
7860: 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 (Tcl_TimerToken)
7870: 20 4e 55 4c 4c 29 20 7b 0a 09 64 70 72 69 6e 74 NULL) {..dprint
7880: 66 28 22 41 20 74 69 6d 65 72 20 77 61 73 20 66 f("A timer was f
7890: 6f 75 6e 64 2c 20 64 65 6c 65 74 69 6e 67 20 69 ound, deleting i
78a0: 74 22 29 3b 0a 09 54 63 6c 5f 44 65 6c 65 74 65 t");..Tcl_Delete
78b0: 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 73 74 61 TimerHandler(sta
78c0: 74 65 50 74 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 tePtr->timer);..
78d0: 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 statePtr->timer
78e0: 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 = (Tcl_TimerToke
78f0: 6e 29 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a n) NULL;. }..
7900: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
7910: 2d 3e 77 61 6e 74 20 7c 7c 20 28 28 6d 61 73 6b ->want || ((mask
7920: 20 26 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 29 & TCL_READABLE)
7930: 20 26 26 0a 09 28 28 54 63 6c 5f 49 6e 70 75 74 &&..((Tcl_Input
7940: 42 75 66 66 65 72 65 64 28 73 74 61 74 65 50 74 Buffered(statePt
7950: 72 2d 3e 73 65 6c 66 29 20 3e 20 30 29 20 7c 7c r->self) > 0) ||
7960: 20 28 42 49 4f 5f 63 74 72 6c 5f 70 65 6e 64 69 (BIO_ctrl_pendi
7970: 6e 67 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f ng(statePtr->bio
7980: 29 20 3e 20 30 29 29 29 29 20 7b 0a 09 2f 2a 0a ) > 0)))) {../*.
7990: 09 20 2a 20 54 68 65 72 65 20 69 73 20 69 6e 74 . * There is int
79a0: 65 72 65 73 74 20 69 6e 20 72 65 61 64 61 62 6c erest in readabl
79b0: 65 20 65 76 65 6e 74 73 20 61 6e 64 20 77 65 20 e events and we
79c0: 61 63 74 75 61 6c 6c 79 20 68 61 76 65 0a 09 20 actually have..
79d0: 2a 20 64 61 74 61 20 77 61 69 74 69 6e 67 2c 20 * data waiting,
79e0: 73 6f 20 67 65 6e 65 72 61 74 65 20 61 20 74 69 so generate a ti
79f0: 6d 65 72 20 74 6f 20 66 6c 75 73 68 20 74 68 61 mer to flush tha
7a00: 74 2e 0a 09 20 2a 2f 0a 09 64 70 72 69 6e 74 66 t... */..dprintf
7a10: 28 22 43 72 65 61 74 69 6e 67 20 61 20 6e 65 77 ("Creating a new
7a20: 20 74 69 6d 65 72 20 73 69 6e 63 65 20 64 61 74 timer since dat
7a30: 61 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 a appears to be
7a40: 77 61 69 74 69 6e 67 22 29 3b 0a 09 73 74 61 74 waiting");..stat
7a50: 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 54 63 ePtr->timer = Tc
7a60: 6c 5f 43 72 65 61 74 65 54 69 6d 65 72 48 61 6e l_CreateTimerHan
7a70: 64 6c 65 72 28 54 4c 53 5f 54 43 4c 5f 44 45 4c dler(TLS_TCL_DEL
7a80: 41 59 2c 20 54 6c 73 43 68 61 6e 6e 65 6c 48 61 AY, TlsChannelHa
7a90: 6e 64 6c 65 72 54 69 6d 65 72 2c 20 28 43 6c 69 ndlerTimer, (Cli
7aa0: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 entData) statePt
7ab0: 72 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 2f 2a 0a r);. }.}../*.
7ac0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
7ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
7b10: 20 2a 0a 20 2a 20 54 6c 73 47 65 74 48 61 6e 64 *. * TlsGetHand
7b20: 6c 65 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 leProc --. *. *.
7b30: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 This procedure i
7b40: 73 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 s invoked by the
7b50: 20 67 65 6e 65 72 69 63 20 49 4f 20 6c 65 76 65 generic IO leve
7b60: 6c 20 74 6f 20 72 65 74 72 69 65 76 65 20 61 6e l to retrieve an
7b70: 20 4f 53 0a 20 2a 09 73 70 65 63 69 66 69 63 20 OS. *.specific
7b80: 68 61 6e 64 6c 65 20 61 73 73 6f 63 69 61 74 65 handle associate
7b90: 64 20 77 69 74 68 20 74 68 65 20 63 68 61 6e 6e d with the chann
7ba0: 65 6c 2e 20 4e 6f 74 20 75 73 65 64 20 66 6f 72 el. Not used for
7bb0: 20 74 72 61 6e 73 66 6f 72 6d 73 2e 0a 20 2a 0a transforms.. *.
7bc0: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 20 20 * Results:. *
7bd0: 20 20 54 68 65 20 61 70 70 72 6f 70 72 69 61 74 The appropriat
7be0: 65 20 54 63 6c 5f 46 69 6c 65 20 68 61 6e 64 6c e Tcl_File handl
7bf0: 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 6e e or NULL if non
7c00: 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 e.. *. * Side ef
7c10: 66 65 63 74 73 3a 0a 20 2a 20 20 20 20 4e 6f 6e fects:. * Non
7c20: 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d e.. *. *--------
7c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7c70: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 -----. */.static
7c80: 20 69 6e 74 20 54 6c 73 47 65 74 48 61 6e 64 6c int TlsGetHandl
7c90: 65 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 eProc(ClientData
7ca0: 20 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 20 instanceData,
7cb0: 20 20 2f 2a 20 53 6f 63 6b 65 74 20 73 74 61 74 /* Socket stat
7cc0: 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 64 69 e. */. int di
7cd0: 72 65 63 74 69 6f 6e 2c 09 09 2f 2a 20 54 43 4c rection,../* TCL
7ce0: 5f 52 45 41 44 41 42 4c 45 20 6f 72 20 54 43 4c _READABLE or TCL
7cf0: 5f 57 52 49 54 41 42 4c 45 20 2a 2f 0a 20 20 20 _WRITABLE */.
7d00: 20 43 6c 69 65 6e 74 44 61 74 61 20 2a 68 61 6e ClientData *han
7d10: 64 6c 65 50 74 72 29 09 2f 2a 20 48 61 6e 64 6c dlePtr)./* Handl
7d20: 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 e associated wit
7d30: 68 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 2a 2f h the channel */
7d40: 0a 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 .{. State *st
7d50: 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 atePtr = (State
7d60: 2a 29 20 69 6e 73 74 61 6e 63 65 44 61 74 61 3b *) instanceData;
7d70: 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c .. return Tcl
7d80: 5f 47 65 74 43 68 61 6e 6e 65 6c 48 61 6e 64 6c _GetChannelHandl
7d90: 65 28 54 6c 73 5f 47 65 74 50 61 72 65 6e 74 28 e(Tls_GetParent(
7da0: 73 74 61 74 65 50 74 72 2c 20 54 4c 53 5f 54 43 statePtr, TLS_TC
7db0: 4c 5f 46 41 53 54 50 41 54 48 29 2c 20 64 69 72 L_FASTPATH), dir
7dc0: 65 63 74 69 6f 6e 2c 20 68 61 6e 64 6c 65 50 74 ection, handlePt
7dd0: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d r);.}../*. *----
7de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
7e30: 54 6c 73 4e 6f 74 69 66 79 50 72 6f 63 20 2d 2d TlsNotifyProc --
7e40: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 . *. *.This proc
7e50: 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 edure is invoked
7e60: 20 62 79 20 74 68 65 20 67 65 6e 65 72 69 63 20 by the generic
7e70: 49 4f 20 6c 65 76 65 6c 20 74 6f 20 6e 6f 74 69 IO level to noti
7e80: 66 79 20 74 68 65 20 63 68 61 6e 6e 65 6c 0a 20 fy the channel.
7e90: 2a 09 74 68 61 74 20 61 6e 20 65 76 65 6e 74 20 *.that an event
7ea0: 68 61 73 20 6f 63 63 75 72 72 65 64 20 6f 6e 20 has occurred on
7eb0: 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 63 the underlying c
7ec0: 68 61 6e 6e 65 6c 2e 20 49 74 20 69 73 20 75 73 hannel. It is us
7ed0: 65 64 20 62 79 20 73 74 61 63 6b 65 64 20 63 68 ed by stacked ch
7ee0: 61 6e 6e 65 6c 20 64 72 69 76 65 72 73 20 74 68 annel drivers th
7ef0: 61 74 0a 20 2a 09 77 69 73 68 20 74 6f 20 62 65 at. *.wish to be
7f00: 20 6e 6f 74 69 66 69 65 64 20 6f 66 20 65 76 65 notified of eve
7f10: 6e 74 73 20 74 68 61 74 20 6f 63 63 75 72 20 6f nts that occur o
7f20: 6e 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 n the underlying
7f30: 20 28 73 74 61 63 6b 65 64 29 0a 20 2a 09 63 68 (stacked). *.ch
7f40: 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 52 65 73 annel.. *. * Res
7f50: 75 6c 74 73 3a 0a 20 2a 20 20 20 20 54 79 70 65 ults:. * Type
7f60: 20 6f 66 20 65 76 65 6e 74 20 6f 72 20 30 20 69 of event or 0 i
7f70: 66 20 66 61 69 6c 65 64 0a 20 2a 0a 20 2a 20 53 f failed. *. * S
7f80: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 20 ide effects:. *
7f90: 20 20 20 4d 61 79 20 70 72 6f 63 65 73 73 20 74 May process t
7fa0: 68 65 20 69 6e 63 6f 6d 69 6e 67 20 65 76 65 6e he incoming even
7fb0: 74 20 62 79 20 69 74 73 65 6c 66 2e 0a 20 2a 0a t by itself.. *.
7fc0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
7fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
8010: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 54 */.static int T
8020: 6c 73 4e 6f 74 69 66 79 50 72 6f 63 28 43 6c 69 lsNotifyProc(Cli
8030: 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 entData instance
8040: 44 61 74 61 2c 20 20 20 20 2f 2a 20 53 6f 63 6b Data, /* Sock
8050: 65 74 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 20 et state. */.
8060: 20 69 6e 74 20 6d 61 73 6b 29 09 09 09 2f 2a 20 int mask).../*
8070: 74 79 70 65 20 6f 66 20 65 76 65 6e 74 20 74 68 type of event th
8080: 61 74 20 6f 63 63 75 72 72 65 64 3a 0a 09 09 09 at occurred:....
8090: 09 20 2a 20 4f 52 2d 65 64 20 63 6f 6d 62 69 6e . * OR-ed combin
80a0: 61 74 69 6f 6e 20 6f 66 20 54 43 4c 5f 52 45 41 ation of TCL_REA
80b0: 44 41 42 4c 45 20 6f 72 20 54 43 4c 5f 57 52 49 DABLE or TCL_WRI
80c0: 54 41 42 4c 45 20 2a 2f 0a 7b 0a 20 20 20 20 53 TABLE */.{. S
80d0: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d tate *statePtr =
80e0: 20 28 53 74 61 74 65 20 2a 29 20 69 6e 73 74 61 (State *) insta
80f0: 6e 63 65 44 61 74 61 3b 0a 20 20 20 20 69 6e 74 nceData;. int
8100: 20 65 72 72 6f 72 43 6f 64 65 20 3d 20 30 3b 0a errorCode = 0;.
8110: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
8120: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 0a lled");.. /*.
8130: 20 20 20 20 20 2a 20 44 65 6c 65 74 65 20 61 6e * Delete an
8140: 20 65 78 69 73 74 69 6e 67 20 74 69 6d 65 72 2e existing timer.
8150: 20 49 74 20 77 61 73 20 6e 6f 74 20 66 69 72 65 It was not fire
8160: 64 2c 20 79 65 74 20 77 65 20 61 72 65 0a 20 20 d, yet we are.
8170: 20 20 20 2a 20 68 65 72 65 2c 20 73 6f 20 74 68 * here, so th
8180: 65 20 63 68 61 6e 6e 65 6c 20 62 65 6c 6f 77 20 e channel below
8190: 67 65 6e 65 72 61 74 65 64 20 73 75 63 68 20 61 generated such a
81a0: 6e 20 65 76 65 6e 74 20 61 6e 64 20 77 65 0a 20 n event and we.
81b0: 20 20 20 20 2a 20 64 6f 6e 27 74 20 68 61 76 65 * don't have
81c0: 20 74 6f 2e 20 54 68 65 20 72 65 6e 65 77 61 6c to. The renewal
81d0: 20 6f 66 20 74 68 65 20 69 6e 74 65 72 65 73 74 of the interest
81e0: 20 61 66 74 65 72 20 74 68 65 0a 20 20 20 20 20 after the.
81f0: 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 63 * execution of c
8200: 68 61 6e 6e 65 6c 20 68 61 6e 64 6c 65 72 73 20 hannel handlers
8210: 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c 79 20 will eventually
8220: 63 61 75 73 65 20 75 73 20 74 6f 0a 20 20 20 20 cause us to.
8230: 20 2a 20 72 65 63 72 65 61 74 65 20 74 68 65 20 * recreate the
8240: 74 69 6d 65 72 20 28 69 6e 20 57 61 74 63 68 50 timer (in WatchP
8250: 72 6f 63 29 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 roc).. */.
8260: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
8270: 74 69 6d 65 72 20 21 3d 20 28 54 63 6c 5f 54 69 timer != (Tcl_Ti
8280: 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 merToken) NULL)
8290: 7b 0a 09 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d {..Tcl_DeleteTim
82a0: 65 72 48 61 6e 64 6c 65 72 28 73 74 61 74 65 50 erHandler(stateP
82b0: 74 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 73 74 61 tr->timer);..sta
82c0: 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 28 tePtr->timer = (
82d0: 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 Tcl_TimerToken)
82e0: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 NULL;. }..
82f0: 20 2f 2a 20 53 6b 69 70 20 69 66 20 75 73 65 72 /* Skip if user
8300: 20 76 65 72 69 66 79 20 63 61 6c 6c 62 61 63 6b verify callback
8310: 20 69 73 20 73 74 69 6c 6c 20 72 75 6e 6e 69 6e is still runnin
8320: 67 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 g */. if (sta
8330: 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 tePtr->flags & T
8340: 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 29 LS_TCL_CALLBACK)
8350: 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 43 61 6c {..dprintf("Cal
8360: 6c 62 61 63 6b 20 69 73 20 6f 6e 2d 67 6f 69 6e lback is on-goin
8370: 67 2c 20 72 65 74 75 72 6e 69 6e 67 20 66 61 69 g, returning fai
8380: 6c 65 64 22 29 3b 0a 09 72 65 74 75 72 6e 20 30 led");..return 0
8390: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
83a0: 49 66 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a If not initializ
83b0: 65 64 2c 20 64 6f 20 63 6f 6e 6e 65 63 74 20 2a ed, do connect *
83c0: 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 /. if (stateP
83d0: 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f tr->flags & TLS_
83e0: 54 43 4c 5f 49 4e 49 54 29 20 7b 0a 09 64 70 72 TCL_INIT) {..dpr
83f0: 69 6e 74 66 28 22 43 61 6c 6c 69 6e 67 20 54 6c intf("Calling Tl
8400: 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 s_WaitForConnect
8410: 22 29 3b 0a 09 69 66 20 28 54 6c 73 5f 57 61 69 ");..if (Tls_Wai
8420: 74 46 6f 72 43 6f 6e 6e 65 63 74 28 73 74 61 74 tForConnect(stat
8430: 65 50 74 72 2c 20 26 65 72 72 6f 72 43 6f 64 65 ePtr, &errorCode
8440: 2c 20 31 29 20 3c 20 30 29 20 7b 0a 09 20 20 20 , 1) < 0) {..
8450: 20 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65 Tls_Error(state
8460: 50 74 72 2c 20 73 74 72 65 72 72 6f 72 28 65 72 Ptr, strerror(er
8470: 72 6f 72 43 6f 64 65 29 29 3b 0a 09 20 20 20 20 rorCode));..
8480: 69 66 20 28 65 72 72 6f 72 43 6f 64 65 20 3d 3d if (errorCode ==
8490: 20 45 41 47 41 49 4e 29 20 7b 0a 09 09 64 70 72 EAGAIN) {...dpr
84a0: 69 6e 74 66 28 22 41 73 79 6e 63 20 66 6c 61 67 intf("Async flag
84b0: 20 63 6f 75 6c 64 20 62 65 20 73 65 74 20 28 64 could be set (d
84c0: 69 64 6e 27 74 20 63 68 65 63 6b 29 20 61 6e 64 idn't check) and
84d0: 20 65 72 72 6f 72 43 6f 64 65 20 3d 3d 20 45 41 errorCode == EA
84e0: 47 41 49 4e 3a 20 20 52 65 74 75 72 6e 69 6e 67 GAIN: Returning
84f0: 20 66 61 69 6c 65 64 22 29 3b 0a 0a 09 09 72 65 failed");....re
8500: 74 75 72 6e 20 30 3b 0a 09 20 20 20 20 7d 0a 0a turn 0;.. }..
8510: 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 54 6c . dprintf("Tl
8520: 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 s_WaitForConnect
8530: 20 72 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72 returned an err
8540: 6f 72 22 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a or");..}. }..
8550: 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 dprintf("Ret
8560: 75 72 6e 69 6e 67 20 25 69 22 2c 20 6d 61 73 6b urning %i", mask
8570: 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 );.. /*.
8580: 2a 20 41 6e 20 65 76 65 6e 74 20 6f 63 63 75 72 * An event occur
8590: 72 65 64 20 69 6e 20 74 68 65 20 75 6e 64 65 72 red in the under
85a0: 6c 79 69 6e 67 20 63 68 61 6e 6e 65 6c 2e 20 20 lying channel.
85b0: 54 68 69 73 0a 20 20 20 20 20 2a 20 74 72 61 6e This. * tran
85c0: 73 66 6f 72 6d 61 74 69 6f 6e 20 64 6f 65 73 6e sformation doesn
85d0: 27 74 20 70 72 6f 63 65 73 73 20 73 75 63 68 20 't process such
85e0: 65 76 65 6e 74 73 20 74 68 75 73 20 72 65 74 75 events thus retu
85f0: 72 6e 73 20 74 68 65 0a 20 20 20 20 20 2a 20 69 rns the. * i
8600: 6e 63 6f 6d 69 6e 67 20 6d 61 73 6b 20 75 6e 63 ncoming mask unc
8610: 68 61 6e 67 65 64 2e 0a 20 20 20 20 20 2a 2f 0a hanged.. */.
8620: 20 20 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b return mask;
8630: 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d .}../*. *-------
8640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8680: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 ------. *. * Tls
8690: 5f 43 68 61 6e 6e 65 6c 54 79 70 65 20 2d 2d 0a _ChannelType --.
86a0: 20 2a 0a 20 2a 09 44 65 66 69 6e 65 73 20 74 68 *. *.Defines th
86b0: 65 20 63 6f 72 72 65 63 74 20 54 4c 53 20 63 68 e correct TLS ch
86c0: 61 6e 6e 65 6c 20 64 72 69 76 65 72 20 68 61 6e annel driver han
86d0: 64 6c 65 72 73 20 66 6f 72 20 74 68 69 73 20 63 dlers for this c
86e0: 68 61 6e 6e 65 6c 20 74 79 70 65 2e 0a 20 2a 0a hannel type.. *.
86f0: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 54 * Results:. *.T
8700: 63 6c 5f 43 68 61 6e 6e 65 6c 54 79 70 65 20 73 cl_ChannelType s
8710: 74 72 75 63 74 75 72 65 2e 0a 20 2a 0a 20 2a 20 tructure.. *. *
8720: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
8730: 20 20 20 20 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d None.. *. *-
8740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
8790: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 54 63 .static const Tc
87a0: 6c 5f 43 68 61 6e 6e 65 6c 54 79 70 65 20 74 6c l_ChannelType tl
87b0: 73 43 68 61 6e 6e 65 6c 54 79 70 65 20 3d 20 7b sChannelType = {
87c0: 0a 20 20 20 20 22 74 6c 73 22 2c 09 09 09 2f 2a . "tls",.../*
87d0: 20 54 79 70 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 Type name */.
87e0: 20 20 54 43 4c 5f 43 48 41 4e 4e 45 4c 5f 56 45 TCL_CHANNEL_VE
87f0: 52 53 49 4f 4e 5f 35 2c 09 2f 2a 20 76 35 20 63 RSION_5,./* v5 c
8800: 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 54 6c hannel */. Tl
8810: 73 43 6c 6f 73 65 50 72 6f 63 2c 09 09 2f 2a 20 sCloseProc,../*
8820: 43 6c 6f 73 65 20 70 72 6f 63 20 2a 2f 0a 20 20 Close proc */.
8830: 20 20 54 6c 73 49 6e 70 75 74 50 72 6f 63 2c 09 TlsInputProc,.
8840: 09 2f 2a 20 49 6e 70 75 74 20 70 72 6f 63 20 2a ./* Input proc *
8850: 2f 0a 20 20 20 20 54 6c 73 4f 75 74 70 75 74 50 /. TlsOutputP
8860: 72 6f 63 2c 09 09 2f 2a 20 4f 75 74 70 75 74 20 roc,../* Output
8870: 70 72 6f 63 20 2a 2f 0a 20 20 20 20 4e 55 4c 4c proc */. NULL
8880: 2c 09 09 09 2f 2a 20 53 65 65 6b 20 70 72 6f 63 ,.../* Seek proc
8890: 20 2a 2f 0a 20 20 20 20 54 6c 73 53 65 74 4f 70 */. TlsSetOp
88a0: 74 69 6f 6e 50 72 6f 63 2c 09 09 2f 2a 20 53 65 tionProc,../* Se
88b0: 74 20 6f 70 74 69 6f 6e 20 70 72 6f 63 20 2a 2f t option proc */
88c0: 0a 20 20 20 20 54 6c 73 47 65 74 4f 70 74 69 6f . TlsGetOptio
88d0: 6e 50 72 6f 63 2c 09 09 2f 2a 20 47 65 74 20 6f nProc,../* Get o
88e0: 70 74 69 6f 6e 20 70 72 6f 63 20 2a 2f 0a 20 20 ption proc */.
88f0: 20 20 54 6c 73 57 61 74 63 68 50 72 6f 63 2c 09 TlsWatchProc,.
8900: 09 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6e ./* Initialize n
8910: 6f 74 69 66 69 65 72 20 2a 2f 0a 20 20 20 20 54 otifier */. T
8920: 6c 73 47 65 74 48 61 6e 64 6c 65 50 72 6f 63 2c lsGetHandleProc,
8930: 09 09 2f 2a 20 47 65 74 20 4f 53 20 68 61 6e 64 ../* Get OS hand
8940: 6c 65 73 20 6f 75 74 20 6f 66 20 63 68 61 6e 6e les out of chann
8950: 65 6c 20 2a 2f 0a 20 20 20 20 54 6c 73 43 6c 6f el */. TlsClo
8960: 73 65 32 50 72 6f 63 2c 09 09 2f 2a 20 63 6c 6f se2Proc,../* clo
8970: 73 65 32 70 72 6f 63 20 2a 2f 0a 20 20 20 20 54 se2proc */. T
8980: 6c 73 42 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 2c lsBlockModeProc,
8990: 09 09 2f 2a 20 53 65 74 20 62 6c 6f 63 6b 69 6e ../* Set blockin
89a0: 67 2f 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 20 6d 6f g/nonblocking mo
89b0: 64 65 2a 2f 0a 20 20 20 20 4e 55 4c 4c 2c 09 09 de*/. NULL,..
89c0: 09 2f 2a 20 46 6c 75 73 68 20 70 72 6f 63 20 2a ./* Flush proc *
89d0: 2f 0a 20 20 20 20 54 6c 73 4e 6f 74 69 66 79 50 /. TlsNotifyP
89e0: 72 6f 63 2c 09 09 2f 2a 20 48 61 6e 64 6c 69 6e roc,../* Handlin
89f0: 67 20 6f 66 20 65 76 65 6e 74 73 20 62 75 62 62 g of events bubb
8a00: 6c 69 6e 67 20 75 70 20 2a 2f 0a 20 20 20 20 4e ling up */. N
8a10: 55 4c 4c 2c 09 09 09 2f 2a 20 57 69 64 65 20 73 ULL,.../* Wide s
8a20: 65 65 6b 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20 eek proc */.
8a30: 4e 55 4c 4c 2c 09 09 09 2f 2a 20 54 68 72 65 61 NULL,.../* Threa
8a40: 64 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 d action */.
8a50: 4e 55 4c 4c 09 09 09 2f 2a 20 54 72 75 6e 63 61 NULL.../* Trunca
8a60: 74 65 20 2a 2f 0a 7d 3b 0a 0a 63 6f 6e 73 74 20 te */.};..const
8a70: 54 63 6c 5f 43 68 61 6e 6e 65 6c 54 79 70 65 20 Tcl_ChannelType
8a80: 2a 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 *Tls_ChannelType
8a90: 28 76 6f 69 64 29 20 7b 0a 20 20 20 20 72 65 74 (void) {. ret
8aa0: 75 72 6e 20 26 74 6c 73 43 68 61 6e 6e 65 6c 54 urn &tlsChannelT
8ab0: 79 70 65 3b 0a 7d 0a ype;.}.