Hex Artifact Content

Artifact 9c5382b06f43b3f76dff52275e8eb785b0baea0a609d224efa95ff630519fe63:


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