Check-in [d63ee30cb2]
Overview
Comment:More soft-EOF mappings
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | bug-eof-loop-6dd5588df6
Files: files | file ages | folders
SHA1: d63ee30cb2a3c25240dc98a847f71cf799f9af1f
User & Date: rkeene on 2017-09-21 16:07:41
Other Links: branch diff | manifest | tags
Context
2017-09-21
16:07
More soft-EOF mappings Leaf check-in: d63ee30cb2 user: rkeene tags: bug-eof-loop-6dd5588df6
14:15
Added support for detecting writes after we have told the channel that we are in EOF and start returning errors in that case check-in: 7e5e4e2114 user: rkeene tags: bug-eof-loop-6dd5588df6
Changes

Modified tlsBIO.c from [c3e8b987ad] to [199d9ebcac].

125
126
127
128
129
130
131
132

133
134
135
136
137
138
139
125
126
127
128
129
130
131

132
133
134
135
136
137
138
139







-
+







	tclErrno = Tcl_GetErrno();

	dprintf("[chan=%p] BioWrite(%d) -> %d [tclEof=%d; tclErrno=%d]", (void *) chan, bufLen, ret, tclEofChan, Tcl_GetErrno());

	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");
		dprintf("Got EOF while writing, returning a Connection Reset error which maps to Soft EOF");
		Tcl_SetErrno(ECONNRESET);
		ret = 0;
	} else if (ret == 0) {
		dprintf("Got 0 from Tcl_WriteRaw, and EOF is not set; ret = 0");
		dprintf("Setting retry read flag");
		BIO_set_retry_read(bio);
	} else if (ret < 0) {

Modified tlsIO.c from [1ceb846355] to [064eb6d39e].

385
386
387
388
389
390
391







392
393
394
395
396
397
398
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405







+
+
+
+
+
+
+







	dprintf("BIO_read(%d)", bufSize);

	if (statePtr->flags & TLS_TCL_CALLBACK) {
		/* don't process any bytes while verify callback is running */
		dprintf("Callback is running, reading 0 bytes");
		return(0);
	}

	if (statePtr->flags & TLS_TCL_EOF) {
		dprintf("Asked to read after reaching EOF, we are treating this as fatal.");
		bytesRead = 0;
		*errorCodePtr = ECONNRESET;
		return(bytesRead);
	}

	dprintf("Calling Tls_WaitForConnect");
	tlsConnect = Tls_WaitForConnect(statePtr, errorCodePtr, 0);
	if (tlsConnect < 0) {
		dprintf("Got an error waiting to connect (tlsConnect = %i, *errorCodePtr = %i)", tlsConnect, *errorCodePtr);

		bytesRead = -1;
474
475
476
477
478
479
480






481
482
483
484
485
486
487
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500







+
+
+
+
+
+







			break;
		default:
			dprintf("Unknown error (err = %i), mapping to EOF", err);
			*errorCodePtr = 0;
			bytesRead = 0;
			break;
	}

	if (bufSize != 0 && bytesRead == 0 && *errorCodePtr == 0) {
		dprintf("Detected EOF, setting the EOF flag");
		statePtr->flags |= TLS_TCL_EOF;
		*errorCodePtr = ECONNRESET;
	}

	dprintf("Input(%d) -> %d [%d]", bufSize, bytesRead, *errorCodePtr);
	return(bytesRead);
}

/*
 *-------------------------------------------------------------------
517
518
519
520
521
522
523
524

525
526
527
528
529
530
531
532
533
534
535
536
537
538

539
540
541
542
543
544
545
530
531
532
533
534
535
536

537
538
539
540
541
542
543
544
545
546
547
548
549
550

551
552
553
554
555
556
557
558







-
+













-
+







		written = -1;
		*errorCodePtr = EAGAIN;
		return(-1);
	}

	if (statePtr->flags & TLS_TCL_EOF) {
		dprintf("Asked to write after reaching EOF, we are treating this as fatal.");
		written = -1;
		written = 0;
		*errorCodePtr = ECONNRESET;
		return(written);
	}

	dprintf("Calling Tls_WaitForConnect");
	tlsConnect = Tls_WaitForConnect(statePtr, errorCodePtr, 1);
	if (tlsConnect < 0) {
		dprintf("Got an error waiting to connect (tlsConnect = %i, *errorCodePtr = %i)", tlsConnect, *errorCodePtr);

		written = -1;
		if (*errorCodePtr == ECONNRESET) {
			dprintf("Got connection reset (setting EOF flag)");
			/* Soft EOF */
			*errorCodePtr = 0;
			*errorCodePtr = ECONNRESET;
			written = 0;
			statePtr->flags |= TLS_TCL_EOF;
		}

		return(written);
	}

625
626
627
628
629
630
631

632
633
634
635
636
637
638
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652







+







			dprintf(" unknown err: %d", err);
			break;
	}

	if (toWrite != 0 && written == 0 && *errorCodePtr == 0) {
		dprintf("Detected EOF, setting the EOF flag");
		statePtr->flags |= TLS_TCL_EOF;
		*errorCodePtr = ECONNRESET;
	}

	dprintf("Output(%d) -> %d", toWrite, written);
	return(written);
}

/*