Overview
Comment: | Merge trunk. tlsBIO.c is now fully equal to trunk. |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | bohagan |
Files: | files | file ages | folders |
SHA3-256: |
dae8857d72b2d794e62994aca2fccadc |
User & Date: | jan.nijtmans on 2024-02-22 17:44:54 |
Other Links: | branch diff | manifest | tags |
Context
2024-02-22
| ||
17:51 | Merge trunk check-in: 0d2b96f6d8 user: jan.nijtmans tags: bohagan | |
17:44 | Merge trunk. tlsBIO.c is now fully equal to trunk. check-in: dae8857d72 user: jan.nijtmans tags: bohagan | |
17:40 | Fix [006bd0c74e]: PATCH: BIO_CTRL_PUSH not handled. Also add some changes from androwish: [https://www.androwish.org/home/info/982ebf9d31a60440] check-in: 1b8c76f783 user: jan.nijtmans tags: nijtmans | |
15:27 | Merge trunk check-in: c61ea12657 user: jan.nijtmans tags: bohagan | |
Changes
Modified generic/tlsBIO.c
from [e2553f33f8]
to [dd9500370d].
1 2 3 4 5 6 7 8 | /* * Copyright (C) 1997-2000 Matt Newman <matt@novadigm.com> * * Provides BIO layer to interface OpenSSL to Tcl. */ #include "tlsInt.h" | > > > > > > > | > > > > > > > > > > > > > > > > > > > > > > > > > > | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | /* * Copyright (C) 1997-2000 Matt Newman <matt@novadigm.com> * * Provides BIO layer to interface OpenSSL to Tcl. */ #include "tlsInt.h" #ifdef TCLTLS_OPENSSL_PRE_1_1_API #define BIO_get_data(bio) ((bio)->ptr) #define BIO_get_init(bio) ((bio)->init) #define BIO_get_shutdown(bio) ((bio)->shutdown) #define BIO_set_data(bio, val) (bio)->ptr = (val) #define BIO_set_init(bio, val) (bio)->init = (val) #define BIO_set_shutdown(bio, val) (bio)->shutdown = (val) /* XXX: This assumes the variable being assigned to is BioMethods */ #define BIO_meth_new(type_, name_) (BIO_METHOD *)Tcl_Alloc(sizeof(BIO_METHOD)); \ memset(BioMethods, 0, sizeof(BIO_METHOD)); \ BioMethods->type = type_; \ BioMethods->name = name_; #define BIO_meth_set_write(bio, val) (bio)->bwrite = val; #define BIO_meth_set_read(bio, val) (bio)->bread = val; #define BIO_meth_set_puts(bio, val) (bio)->bputs = val; #define BIO_meth_set_ctrl(bio, val) (bio)->ctrl = val; #define BIO_meth_set_create(bio, val) (bio)->create = val; #define BIO_meth_set_destroy(bio, val) (bio)->destroy = val; #endif #if 0 /* * Forward declarations */ static int BioWrite (BIO *h, const char *buf, int num); static int BioRead (BIO *h, char *buf, int num); static int BioPuts (BIO *h, const char *str); static long BioCtrl (BIO *h, int cmd, long arg1, void *ptr); static int BioNew (BIO *h); static int BioFree (BIO *h); #endif static int BioWrite(BIO *bio, const char *buf, int bufLen) { Tcl_Channel chan; Tcl_Size ret; int tclEofChan, tclErrno; chan = Tls_GetParent((State *) BIO_get_data(bio), 0); dprintf("[chan=%p] BioWrite(%p, <buf>, %d)", (void *)chan, (void *) bio, bufLen); ret = Tcl_WriteRaw(chan, buf, (Tcl_Size)bufLen); tclEofChan = Tcl_Eof(chan); tclErrno = Tcl_GetErrno(); dprintf("[chan=%p] BioWrite(%d) -> %" TCL_SIZE_MODIFIER "d [tclEof=%d; tclErrno=%d]", chan, bufLen, ret, tclEofChan, tclErrno); BIO_clear_flags(bio, BIO_FLAGS_WRITE | BIO_FLAGS_SHOULD_RETRY); if (tclEofChan && ret <= 0) { dprintf("Got EOF while reading, returning a Connection Reset error which maps to Soft EOF"); Tcl_SetErrno(ECONNRESET); ret = 0; |
︙ | ︙ | |||
49 50 51 52 53 54 55 | if (ret != -1 || (ret == -1 && tclErrno == EAGAIN)) { if (BIO_should_read(bio)) { dprintf("Setting should retry read flag"); BIO_set_retry_read(bio); } } | | | 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 | if (ret != -1 || (ret == -1 && tclErrno == EAGAIN)) { if (BIO_should_read(bio)) { dprintf("Setting should retry read flag"); BIO_set_retry_read(bio); } } return (int)ret; } /* Called by SSL_read()*/ static int BioRead(BIO *bio, char *buf, int bufLen) { Tcl_Channel chan; Tcl_Size ret = 0; int tclEofChan, tclErrno; |
︙ | ︙ | |||
72 73 74 75 76 77 78 | ret = Tcl_ReadRaw(chan, buf, (Tcl_Size)bufLen); tclEofChan = Tcl_Eof(chan); tclErrno = Tcl_GetErrno(); dprintf("[chan=%p] BioRead(%d) -> %" TCL_SIZE_MODIFIER "d [tclEof=%d; tclErrno=%d]", | | | 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 | ret = Tcl_ReadRaw(chan, buf, (Tcl_Size)bufLen); tclEofChan = Tcl_Eof(chan); tclErrno = Tcl_GetErrno(); dprintf("[chan=%p] BioRead(%d) -> %" TCL_SIZE_MODIFIER "d [tclEof=%d; tclErrno=%d]", chan, bufLen, ret, tclEofChan, tclErrno); BIO_clear_flags(bio, BIO_FLAGS_READ | BIO_FLAGS_SHOULD_RETRY); if (tclEofChan && ret <= 0) { dprintf("Got EOF while reading, returning a Connection Reset error which maps to Soft EOF"); Tcl_SetErrno(ECONNRESET); ret = 0; |
︙ | ︙ | |||
105 106 107 108 109 110 111 | dprintf("Setting should retry write flag"); BIO_set_retry_write(bio); } } dprintf("BioRead(%p, <buf>, %d) [%p] returning %" TCL_SIZE_MODIFIER "d", | | | 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 | dprintf("Setting should retry write flag"); BIO_set_retry_write(bio); } } dprintf("BioRead(%p, <buf>, %d) [%p] returning %" TCL_SIZE_MODIFIER "d", bio, bufLen, (void *) chan, ret); return (int)ret; } static int BioPuts(BIO *bio, const char *str) { dprintf("BioPuts(%p, <string:%p>) called", bio, str); |
︙ | ︙ | |||
178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 | dprintf("Got BIO_CTRL_DUP"); break; case BIO_CTRL_FLUSH: dprintf("Got BIO_CTRL_FLUSH"); ret = ((chan) && (Tcl_WriteRaw(chan, "", 0) >= 0) ? 1 : -1); dprintf("BIO_CTRL_FLUSH returning value %li", ret); break; case BIO_CTRL_PUSH: dprintf("Got BIO_CTRL_PUSH"); ret = 0; break; case BIO_CTRL_POP: dprintf("Got BIO_CTRL_POP"); ret = 0; break; case BIO_CTRL_SET: dprintf("Got BIO_CTRL_SET"); ret = 0; break; case BIO_CTRL_GET : dprintf("Got BIO_CTRL_GET "); ret = 0; break; #ifdef BIO_CTRL_GET_KTLS_SEND case BIO_CTRL_GET_KTLS_SEND: dprintf("Got BIO_CTRL_GET_KTLS_SEND"); ret = 0; break; #endif #ifdef BIO_CTRL_GET_KTLS_RECV | > > > > > > > > | 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 | dprintf("Got BIO_CTRL_DUP"); break; case BIO_CTRL_FLUSH: dprintf("Got BIO_CTRL_FLUSH"); ret = ((chan) && (Tcl_WriteRaw(chan, "", 0) >= 0) ? 1 : -1); dprintf("BIO_CTRL_FLUSH returning value %li", ret); break; #ifdef BIO_CTRL_PUSH case BIO_CTRL_PUSH: dprintf("Got BIO_CTRL_PUSH"); ret = 0; break; #endif #ifdef BIO_CTRL_POP case BIO_CTRL_POP: dprintf("Got BIO_CTRL_POP"); ret = 0; break; #endif #ifdef BIO_CTRL_SET case BIO_CTRL_SET: dprintf("Got BIO_CTRL_SET"); ret = 0; break; #endif #ifdef BIO_CTRL_GET case BIO_CTRL_GET : dprintf("Got BIO_CTRL_GET "); ret = 0; break; #endif #ifdef BIO_CTRL_GET_KTLS_SEND case BIO_CTRL_GET_KTLS_SEND: dprintf("Got BIO_CTRL_GET_KTLS_SEND"); ret = 0; break; #endif #ifdef BIO_CTRL_GET_KTLS_RECV |
︙ | ︙ | |||
242 243 244 245 246 247 248 | BIO_set_init(bio, 0); BIO_clear_flags(bio, -1); } return 1; } | | > > > | 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 | BIO_set_init(bio, 0); BIO_clear_flags(bio, -1); } return 1; } BIO *BIO_new_tcl( State *statePtr, int flags) { BIO *bio; static BIO_METHOD *BioMethods = NULL; #ifdef TCLTLS_SSL_USE_FASTPATH Tcl_Channel parentChannel; const Tcl_ChannelType *parentChannelType; void *parentChannelFdIn_p, *parentChannelFdOut_p; int parentChannelFdIn, parentChannelFdOut, parentChannelFd; |
︙ | ︙ | |||
282 283 284 285 286 287 288 | * with the SSL library since it will likely be optimized for this. */ parentChannel = Tls_GetParent(statePtr, 0); parentChannelType = Tcl_GetChannelType(parentChannel); validParentChannelFd = 0; if (strcmp(parentChannelType->typeName, "tcp") == 0) { | | | | 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 | * with the SSL library since it will likely be optimized for this. */ parentChannel = Tls_GetParent(statePtr, 0); parentChannelType = Tcl_GetChannelType(parentChannel); validParentChannelFd = 0; if (strcmp(parentChannelType->typeName, "tcp") == 0) { tclGetChannelHandleRet = Tcl_GetChannelHandle(parentChannel, TCL_READABLE, &parentChannelFdIn_p); if (tclGetChannelHandleRet == TCL_OK) { tclGetChannelHandleRet = Tcl_GetChannelHandle(parentChannel, TCL_WRITABLE, &parentChannelFdOut_p); if (tclGetChannelHandleRet == TCL_OK) { parentChannelFdIn = PTR2INT(parentChannelFdIn_p); parentChannelFdOut = PTR2INT(parentChannelFdOut_p); if (parentChannelFdIn == parentChannelFdOut) { parentChannelFd = parentChannelFdIn; validParentChannelFd = 1; } |
︙ | ︙ |