diff options
| author | nijtmans@users.sourceforge.net <jan.nijtmans> | 2012-02-29 21:34:46 (GMT) |
|---|---|---|
| committer | nijtmans@users.sourceforge.net <jan.nijtmans> | 2012-02-29 21:34:46 (GMT) |
| commit | 27f2997b0bae6113da9da3d21bef2ce8b4b048e3 (patch) | |
| tree | 429c25c751c106db85c75db6345c91296dc73692 /generic/tclIOUtil.c | |
| parent | a3026fb9f743af0c43df65c3539e9946014b55eb (diff) | |
| parent | 70f56a10da5105939c1273932fede3f5e34784c1 (diff) | |
| download | tcl-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.c | 17 |
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); |
