Check-in [5aea4802ca]
Bounty program for improvements to Tcl and certain Tcl packages.
Overview
Comment:More work towards getting the state engine for waiting for a connection to come back together
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | tls-1-7
Files: files | file ages | folders
SHA1: 5aea4802ca88a0b37bae4b6ebdec4ab80a78febe
User & Date: rkeene on 2016-12-07 15:10:02
Other Links: branch diff | manifest | tags
Context
2016-12-07
15:12
Added more debugging check-in: ed1ce834df user: rkeene tags: tls-1-7
15:10
More work towards getting the state engine for waiting for a connection to come back together check-in: 5aea4802ca user: rkeene tags: tls-1-7
15:02
Updated wording of debug messages to be correct check-in: 7c044da68e user: rkeene tags: tls-1-7
Changes

Modified tlsIO.c from [d0dab0f21b] to [77155f526d].

352
353
354
355
356
357
358

359
360
361
362
363
364
365
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366






+







		/* Soft EOF */
		*errorCodePtr = 0;
		bytesRead = 0;
	    }
	    goto input;
	}
    }

    if (statePtr->flags & TLS_TCL_INIT) {
	statePtr->flags &= ~(TLS_TCL_INIT);
    }
    /*
     * We need to clear the SSL error stack now because we sometimes reach
     * this function with leftover errors in the stack.  If BIO_read
     * returns -1 and intends EAGAIN, there is a leftover error, it will be
434
435
436
437
438
439
440


441
442
443
444
445
446
447
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450






+
+







       *errorCodePtr = EAGAIN;
       goto output;
    }

    if (!SSL_is_init_finished(statePtr->ssl)) {
	written = Tls_WaitForConnect(statePtr, errorCodePtr);
	if (written <= 0) {
            dprintf("Tls_WaitForConnect returned %i (err = %i)", written, *errorCodePtr);

	    goto output;
	}
    }
    if (statePtr->flags & TLS_TCL_INIT) {
	statePtr->flags &= ~(TLS_TCL_INIT);
    }
    if (toWrite == 0) {
905
906
907
908
909
910
911

912
913

914
915

916
917

918
919


920
921
922

923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939


940
941
942
943
944
945
946
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925

926
927
928


929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955






+


+


+


+

-
+
+

-
-
+

















+
+







        *errorCodePtr = ECONNRESET;
        return -1;
    }

    for (;;) {
	/* Not initialized yet! */
	if (statePtr->flags & TLS_TCL_SERVER) {
            dprintf("Calling SSL_accept()");
	    err = SSL_accept(statePtr->ssl);
	} else {
            dprintf("Calling SSL_connect()");
	    err = SSL_connect(statePtr->ssl);
	}

	/*SSL_write(statePtr->ssl, (char*)&err, 0);	HACK!!! */
	if (err > 0) {
            dprintf("That seems to have gone okay");
	    BIO_flush(statePtr->bio);
	}
	} else {
	    int rc = SSL_get_error(statePtr->ssl, err);

	if (err <= 0) {
	    int rc = SSL_get_error(statePtr->ssl, err);
            dprintf("Got error: %i (rc = %i)", err, rc);

	    if (rc == SSL_ERROR_SSL) {
		Tls_Error(statePtr,
			(char *)ERR_reason_error_string(ERR_get_error()));
                statePtr->flags |= TLS_TCL_HANDSHAKE_FAILED;
		*errorCodePtr = ECONNABORTED;
		return -1;
	    } else if (BIO_should_retry(statePtr->bio)) {
		if (statePtr->flags & TLS_TCL_ASYNC) {
		    dprintf("E! ");
		    *errorCodePtr = EAGAIN;
		    return -1;
		} else {
		    continue;
		}
	    } else if (err == 0) {
                if (Tcl_Eof(statePtr->self)) {
                    dprintf("Error = 0 and EOF is set, returning with 0");

                    return 0;
                }
		dprintf("CR! ");
		*errorCodePtr = ECONNRESET;
		return -1;
	    }
	    if (statePtr->flags & TLS_TCL_SERVER) {