summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsebres <sebres@users.sourceforge.net>2024-05-17 09:51:41 (GMT)
committersebres <sebres@users.sourceforge.net>2024-05-17 09:51:41 (GMT)
commit0412ec4e2320bfbfc765c14ddd9aab36e79cb278 (patch)
tree8bd8f860251b7cb1fd7adabf00cc2313fd6a49cd
parenta7ec3ac2ad4ef2890f4229c9d9b3c079e94d188b (diff)
downloadtcl-0412ec4e2320bfbfc765c14ddd9aab36e79cb278.zip
tcl-0412ec4e2320bfbfc765c14ddd9aab36e79cb278.tar.gz
tcl-0412ec4e2320bfbfc765c14ddd9aab36e79cb278.tar.bz2
fixes yet another segfault (if write handler doesn't generate an error, but returns normally with length of written bytes)
-rw-r--r--generic/tclIO.c17
-rw-r--r--tests/ioCmd.test1
2 files changed, 10 insertions, 8 deletions
diff --git a/generic/tclIO.c b/generic/tclIO.c
index 2df8696..c3844af 100644
--- a/generic/tclIO.c
+++ b/generic/tclIO.c
@@ -9964,19 +9964,20 @@ DoRead(
}
if (code || !bufPtr) {
- /*
- * Read error
- */
-
- UpdateInterest(chanPtr);
- TclChannelRelease((Tcl_Channel)chanPtr);
- return -1;
+ /* Read error (or channel dead/closed) */
+ goto readErr;
}
assert(IsBufferFull(bufPtr));
}
- assert(bufPtr != NULL);
+ if (!bufPtr) {
+ readErr:
+
+ UpdateInterest(chanPtr);
+ TclChannelRelease((Tcl_Channel)chanPtr);
+ return -1;
+ }
bytesRead = BytesLeft(bufPtr);
bytesWritten = bytesToRead;
diff --git a/tests/ioCmd.test b/tests/ioCmd.test
index 3dbb3cc..e56260b 100644
--- a/tests/ioCmd.test
+++ b/tests/ioCmd.test
@@ -2123,6 +2123,7 @@ test iocmd-32.3 {prevent copy-state against segfault by finalize, bug [79474c588
lappend ::ret $mode
switch -exact $mode {
read {puts $chan "Test" ; close $chan}
+ write {set data [lindex $rest 0]; string length $data}
finalize {after 20 {set ::done done}}
initialize {return "initialize watch finalize read write"}
}