diff --git a/git-gui.sh b/git-gui.sh
index 38084515cb..d0b75c044c 100755
--- a/git-gui.sh
+++ b/git-gui.sh
@@ -414,6 +414,7 @@ proc _open_stdout_stderr {cmd} {
 			error $err
 		}
 	}
+	fconfigure $fd -eofchar {}
 	return $fd
 }
 
@@ -828,6 +829,7 @@ proc load_message {file} {
 		if {[catch {set fd [open $f r]}]} {
 			return 0
 		}
+		fconfigure $fd -eofchar {}
 		set content [string trim [read $fd]]
 		close $fd
 		regsub -all -line {[ \r\t]+$} $content {} content
diff --git a/lib/blame.tcl b/lib/blame.tcl
index 4bdb9a27a3..1bcb4b471f 100644
--- a/lib/blame.tcl
+++ b/lib/blame.tcl
@@ -370,6 +370,7 @@ method _load {jump} {
 	$w_path conf -text [escape_path $path]
 	if {$commit eq {}} {
 		set fd [open $path r]
+		fconfigure $fd -eofchar {}
 	} else {
 		set fd [git_read cat-file blob "$commit:$path"]
 	}
diff --git a/lib/commit.tcl b/lib/commit.tcl
index 46a78c158f..0f3b16dfeb 100644
--- a/lib/commit.tcl
+++ b/lib/commit.tcl
@@ -209,7 +209,7 @@ A good commit message has the following format:
 	ui_status {Calling pre-commit hook...}
 	set pch_error {}
 	set fd_ph [open "| $pchook" r]
-	fconfigure $fd_ph -blocking 0 -translation binary
+	fconfigure $fd_ph -blocking 0 -translation binary -eofchar {}
 	fileevent $fd_ph readable \
 		[list commit_prehook_wait $fd_ph $curHEAD $msg]
 }
diff --git a/lib/diff.tcl b/lib/diff.tcl
index 9cb9d0604a..e09e1257e1 100644
--- a/lib/diff.tcl
+++ b/lib/diff.tcl
@@ -86,6 +86,7 @@ proc show_diff {path w {lno {}}} {
 		set max_sz [expr {128 * 1024}]
 		if {[catch {
 				set fd [open $path r]
+				fconfigure $fd -eofchar {}
 				set content [read $fd $max_sz]
 				close $fd
 				set sz [file size $path]