summaryrefslogtreecommitdiffstats
path: root/generic/tclIOUtil.c
diff options
context:
space:
mode:
authornijtmans@users.sourceforge.net <jan.nijtmans>2012-02-29 21:34:46 (GMT)
committernijtmans@users.sourceforge.net <jan.nijtmans>2012-02-29 21:34:46 (GMT)
commit27f2997b0bae6113da9da3d21bef2ce8b4b048e3 (patch)
tree429c25c751c106db85c75db6345c91296dc73692 /generic/tclIOUtil.c
parenta3026fb9f743af0c43df65c3539e9946014b55eb (diff)
parent70f56a10da5105939c1273932fede3f5e34784c1 (diff)
downloadtcl-27f2997b0bae6113da9da3d21bef2ce8b4b048e3.zip
tcl-27f2997b0bae6113da9da3d21bef2ce8b4b048e3.tar.gz
tcl-27f2997b0bae6113da9da3d21bef2ce8b4b048e3.tar.bz2
[Bug 3466099] BOM in Unicode
Diffstat (limited to 'generic/tclIOUtil.c')
-rw-r--r--generic/tclIOUtil.c17
1 files changed, 16 insertions, 1 deletions
diff --git a/generic/tclIOUtil.c b/generic/tclIOUtil.c
index e714471..44849d1 100644
--- a/generic/tclIOUtil.c
+++ b/generic/tclIOUtil.c
@@ -1788,7 +1788,22 @@ Tcl_FSEvalFileEx(
objPtr = Tcl_NewObj();
Tcl_IncrRefCount(objPtr);
- if (Tcl_ReadChars(chan, objPtr, -1, 0) < 0) {
+ /* Try to read first character of stream, so we can
+ * check for utf-8 BOM to be handled especially.
+ */
+ if (Tcl_ReadChars(chan, objPtr, 1, 0) < 0) {
+ Tcl_Close(interp, chan);
+ Tcl_AppendResult(interp, "couldn't read file \"",
+ Tcl_GetString(pathPtr), "\": ", Tcl_PosixError(interp), NULL);
+ goto end;
+ }
+ string = Tcl_GetString(objPtr);
+ /*
+ * If first character is not a BOM, append the remaining characters,
+ * otherwise replace them [Bug 3466099].
+ */
+ if (Tcl_ReadChars(chan, objPtr, -1,
+ memcmp(string, "\xef\xbf\xbe", 3)) < 0) {
Tcl_Close(interp, chan);
Tcl_AppendResult(interp, "couldn't read file \"",
Tcl_GetString(pathPtr), "\": ", Tcl_PosixError(interp), NULL);