diff options
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | generic/tclBasic.c | 4 | ||||
-rw-r--r-- | generic/tclCompCmdsSZ.c | 3 | ||||
-rw-r--r-- | generic/tclCompile.c | 6 | ||||
-rw-r--r-- | generic/tclObj.c | 2 | ||||
-rw-r--r-- | generic/tclParse.c | 4 | ||||
-rw-r--r-- | generic/tclUtil.c | 31 |
7 files changed, 33 insertions, 23 deletions
@@ -1,5 +1,11 @@ 2011-03-06 Don Porter <dgp@users.sourceforge.net> + * generic/tclBasic.c: More replacements of Tcl_UtfBackslash() calls + * generic/tclCompile.c: with TclParseBackslash() where possible. + * generic/tclCompCmdsSZ.c: + * generic/tclParse.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 b07a55d..5100dd9 100644 --- a/generic/tclBasic.c +++ b/generic/tclBasic.c @@ -4907,7 +4907,7 @@ TclEvalEx( int line, /* The line the script starts on. */ int *clNextOuter, /* Information about an outer context for */ const char *outerScript) /* continuation line data. This is set only in - * EvalTokensStandard(), to properly handle + * TclSubstTokens(), to properly handle * [...]-nested commands. The 'outerScript' * refers to the most-outer script containing * the embedded command, which is refered to @@ -5413,7 +5413,7 @@ TclAdvanceContinuations( /* * 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. + * TclSubstTokens via TclParseBackslash. * * *clNextPtrPtr <=> We have continuation lines to track. * **clNextPtrPtr >= 0 <=> We are not beyond the last possible location. diff --git a/generic/tclCompCmdsSZ.c b/generic/tclCompCmdsSZ.c index d0f9764..7398579 100644 --- a/generic/tclCompCmdsSZ.c +++ b/generic/tclCompCmdsSZ.c @@ -688,7 +688,8 @@ TclSubstCompile( count++; continue; case TCL_TOKEN_BS: - length = Tcl_UtfBackslash(tokenPtr->start, NULL, buf); + length = TclParseBackslash(tokenPtr->start, tokenPtr->size, + NULL, buf); literal = TclRegisterNewLiteral(envPtr, buf, length); TclEmitPush(literal, envPtr); count++; diff --git a/generic/tclCompile.c b/generic/tclCompile.c index 8005034..9dcafb4 100644 --- a/generic/tclCompile.c +++ b/generic/tclCompile.c @@ -1393,7 +1393,8 @@ TclWordKnownAtCompileTime( case TCL_TOKEN_BS: if (tempPtr != NULL) { char utfBuf[TCL_UTF_MAX]; - int length = Tcl_UtfBackslash(tokenPtr->start, NULL, utfBuf); + int length = TclParseBackslash(tokenPtr->start, + tokenPtr->size, NULL, utfBuf); Tcl_AppendToObj(tempPtr, utfBuf, length); } @@ -2031,7 +2032,8 @@ TclCompileTokens( break; case TCL_TOKEN_BS: - length = Tcl_UtfBackslash(tokenPtr->start, NULL, buffer); + length = TclParseBackslash(tokenPtr->start, tokenPtr->size, + NULL, buffer); Tcl_DStringAppend(&textBuffer, buffer, length); /* diff --git a/generic/tclObj.c b/generic/tclObj.c index 4742f9d..ad48ad1 100644 --- a/generic/tclObj.c +++ b/generic/tclObj.c @@ -79,7 +79,7 @@ typedef struct ObjData { typedef struct ThreadSpecificData { Tcl_HashTable *lineCLPtr; /* This table remembers for each Tcl_Obj * generated by a call to the function - * EvalTokensStandard() from a literal text + * TclSubstTokens() from a literal text * where bs+nl sequences occured in it, if * any. I.e. this table keeps track of * invisible and stripped continuation lines. diff --git a/generic/tclParse.c b/generic/tclParse.c index 149644d..705a141 100644 --- a/generic/tclParse.c +++ b/generic/tclParse.c @@ -2172,8 +2172,8 @@ TclSubstTokens( break; case TCL_TOKEN_BS: - appendByteLength = Tcl_UtfBackslash(tokenPtr->start, NULL, - utfCharBytes); + appendByteLength = TclParseBackslash(tokenPtr->start, + tokenPtr->size, NULL, utfCharBytes); append = utfCharBytes; /* diff --git a/generic/tclUtil.c b/generic/tclUtil.c index 3fd6271..7161fdd 100644 --- a/generic/tclUtil.c +++ b/generic/tclUtil.c @@ -326,14 +326,13 @@ TclFindElement( * * TclCopyAndCollapse -- * - * Copy a string and eliminate any backslashes that aren't in braces. + * Copy a string and substitute all backslash escape sequences * * 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. @@ -343,26 +342,28 @@ TclFindElement( int TclCopyAndCollapse( - int count, /* Number of characters to copy from src. */ + int count, /* Number of byte 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; @@ -742,7 +743,7 @@ Tcl_ScanCountedElement( } else { int size; - Tcl_UtfBackslash(p, &size, NULL); + TclParseBackslash(p, lastChar - p, &size, NULL); p += size-1; flags |= USE_BRACES; } |