diff options
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | generic/tclBasic.c | 6 | ||||
-rw-r--r-- | generic/tclCmdMZ.c | 2 | ||||
-rw-r--r-- | generic/tclCompExpr.c | 4 | ||||
-rw-r--r-- | generic/tclCompile.c | 4 | ||||
-rw-r--r-- | generic/tclUtil.c | 29 |
6 files changed, 29 insertions, 22 deletions
@@ -1,5 +1,11 @@ 2011-03-06 Don Porter <dgp@users.sourceforge.net> + * generic/tclBasic.c: More replacements of Tcl_UtfBackslash() calls + * generic/tclCmdMZ.c: with TclParseBackslash() where possible. + * generic/tclCompExpr.c: + * generic/tclCompile.c: + * generic/tclUtil.c: + * generic/tclUtil.c (TclFindElement): Guard escape sequence scans to not overrun the string end. [Bug 3192636] diff --git a/generic/tclBasic.c b/generic/tclBasic.c index 60cd23a..1c72e1b 100644 --- a/generic/tclBasic.c +++ b/generic/tclBasic.c @@ -3647,8 +3647,8 @@ EvalTokensStandard(interp, tokenPtr, count, line, clNextOuter, outerScript) break; case TCL_TOKEN_BS: - length = Tcl_UtfBackslash(tokenPtr->start, (int *) NULL, - buffer); + length = TclParseBackslash(tokenPtr->start, tokenPtr->size, + (int *) NULL, buffer); p = buffer; #ifdef TCL_TIP280 /* @@ -4510,7 +4510,7 @@ TclAdvanceContinuations (line,clNextPtrPtr,loc) /* * Track the invisible continuation lines embedded in a script, if * any. Here they are just spaces (already). They were removed by - * EvalTokensStandard() via Tcl_UtfBackslash(). + * EvalTokensStandard() via TclParseBackslash(). * * *clNextPtrPtr <=> We have continuation lines to track. * **clNextPtrPtr >= 0 <=> We are not beyond the last possible location. diff --git a/generic/tclCmdMZ.c b/generic/tclCmdMZ.c index fe8366c..ccf3bc6 100644 --- a/generic/tclCmdMZ.c +++ b/generic/tclCmdMZ.c @@ -2597,7 +2597,7 @@ Tcl_SubstObj(interp, objPtr, flags) Tcl_AppendToObj(resultObj, old, p-old); } Tcl_AppendToObj(resultObj, buf, - Tcl_UtfBackslash(p, &count, buf)); + TclParseBackslash(p, length, &count, buf)); p += count; length -= count; old = p; } else { diff --git a/generic/tclCompExpr.c b/generic/tclCompExpr.c index a03b005..68533c5 100644 --- a/generic/tclCompExpr.c +++ b/generic/tclCompExpr.c @@ -387,8 +387,8 @@ CompileSubExpr(exprTokenPtr, infoPtr, envPtr) break; case TCL_TOKEN_BS: - length = Tcl_UtfBackslash(tokenPtr->start, (int *) NULL, - buffer); + length = TclParseBackslash(tokenPtr->start, tokenPtr->size, + (int *) NULL, buffer); if (length > 0) { objIndex = TclRegisterNewLiteral(envPtr, buffer, length); } else { diff --git a/generic/tclCompile.c b/generic/tclCompile.c index 0678790..660a1f2 100644 --- a/generic/tclCompile.c +++ b/generic/tclCompile.c @@ -1571,8 +1571,8 @@ TclCompileTokens(interp, tokenPtr, count, envPtr) break; case TCL_TOKEN_BS: - length = Tcl_UtfBackslash(tokenPtr->start, (int *) NULL, - buffer); + length = TclParseBackslash(tokenPtr->start, tokenPtr->size, + (int *) NULL, buffer); Tcl_DStringAppend(&textBuffer, buffer, length); #ifdef TCL_TIP280 diff --git a/generic/tclUtil.c b/generic/tclUtil.c index 0dd4748..19332c8 100644 --- a/generic/tclUtil.c +++ b/generic/tclUtil.c @@ -341,11 +341,10 @@ TclFindElement(interp, list, listLength, elementPtr, nextPtr, sizePtr, * Copy a string and eliminate any backslashes that aren't in braces. * * Results: - * Count characters get copied from src to dst. Along the way, if - * backslash sequences are found outside braces, the backslashes are - * eliminated in the copy. After scanning count chars from source, a - * null character is placed at the end of dst. Returns the number - * of characters that got copied. + * Count bytes get copied from src to dst. Along the way, backslash + * sequences are substituted in the copy. After scanning count bytes + * from src, a null character is placed at the end of dst. Returns + * the number of bytes that got written to dst. * * Side effects: * None. @@ -355,26 +354,28 @@ TclFindElement(interp, list, listLength, elementPtr, nextPtr, sizePtr, int TclCopyAndCollapse(count, src, dst) - int count; /* Number of characters to copy from src. */ + int count; /* Number of bytes to copy from src. */ CONST char *src; /* Copy from here... */ char *dst; /* ... to here. */ { - register char c; - int numRead; int newCount = 0; - int backslashCount; - for (c = *src; count > 0; src++, c = *src, count--) { + while (count > 0) { + char c = *src; if (c == '\\') { - backslashCount = Tcl_UtfBackslash(src, &numRead, dst); + int numRead; + int backslashCount = TclParseBackslash(src, count, &numRead, dst); + dst += backslashCount; newCount += backslashCount; - src += numRead-1; - count -= numRead-1; + src += numRead; + count -= numRead; } else { *dst = c; dst++; newCount++; + src++; + count--; } } *dst = 0; @@ -643,7 +644,7 @@ Tcl_ScanCountedElement(string, length, flagPtr) } else { int size; - Tcl_UtfBackslash(p, &size, NULL); + TclParseBackslash(p, lastChar - p, &size, NULL); p += size-1; flags |= USE_BRACES; } |