Attachment "1122671-tcl.patch" to
ticket [1122671fff]
added by
hobbs
2005-02-16 07:34:16.
Index: generic/tclEncoding.c
===================================================================
RCS file: /cvsroot/tcl/tcl/generic/tclEncoding.c,v
retrieving revision 1.16.2.6
diff -u -r1.16.2.6 tclEncoding.c
--- generic/tclEncoding.c 12 Nov 2004 23:42:00 -0000 1.16.2.6
+++ generic/tclEncoding.c 16 Feb 2005 00:29:55 -0000
@@ -2122,10 +2122,10 @@
* correspond to the bytes stored in the
* output buffer. */
{
- CONST char *srcStart, *srcEnd, *srcClose;
- Tcl_UniChar *wDst, *wDstStart, *wDstEnd;
+ CONST char *srcStart, *srcEnd, *srcClose, *dstStart, *dstEnd;
int result, numChars;
-
+ Tcl_UniChar ch;
+
srcStart = src;
srcEnd = src + srcLen;
srcClose = srcEnd;
@@ -2133,9 +2133,8 @@
srcClose -= TCL_UTF_MAX;
}
- wDst = (Tcl_UniChar *) dst;
- wDstStart = (Tcl_UniChar *) dst;
- wDstEnd = (Tcl_UniChar *) (dst + dstLen - sizeof(Tcl_UniChar));
+ dstStart = dst;
+ dstEnd = dst + dstLen;
result = TCL_OK;
for (numChars = 0; src < srcEnd; numChars++) {
@@ -2148,15 +2147,26 @@
result = TCL_CONVERT_MULTIBYTE;
break;
}
- if (wDst > wDstEnd) {
+ if (dst > dstEnd) {
result = TCL_CONVERT_NOSPACE;
break;
}
- src += TclUtfToUniChar(src, wDst);
- wDst++;
+ src += TclUtfToUniChar(src, &ch);
+ /*
+ * Need to handle this in a way that won't cause misalignment
+ * by casting dst to a Tcl_UniChar. [Bug 1122671]
+ * XXX: This hard-codes the assumed size of Tcl_UniChar as 2.
+ */
+#ifdef WORDS_BIGENDIAN
+ *dst++ = (ch >> 8);
+ *dst++ = (ch & 0xFF);
+#else
+ *dst++ = (ch & 0xFF);
+ *dst++ = (ch >> 8);
+#endif
}
*srcReadPtr = src - srcStart;
- *dstWrotePtr = (char *) wDst - (char *) wDstStart;
+ *dstWrotePtr = dst - dstStart;
*dstCharsPtr = numChars;
return result;
}