summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--generic/tclCmdMZ.c16
2 files changed, 18 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog
index ce4e1aa..98c8360 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,10 @@
2010-02-27 Donal K. Fellows <dkf@users.sf.net>
+ * generic/tclCmdMZ.c (StringFirstCmd, StringLastCmd): [Bug 2960021]:
+ Only search for the needle in the haystack when the needle isn't
+ larger than the haystack. Prevents an odd crash from sometimes
+ happening when things get mixed up (a common programming error).
+
* generic/tclMain.c (Tcl_Main): [Bug 801429]: Factor out the holding
of the client-installed main loop function into thread-specific data.
diff --git a/generic/tclCmdMZ.c b/generic/tclCmdMZ.c
index 5ec25b3..af97570 100644
--- a/generic/tclCmdMZ.c
+++ b/generic/tclCmdMZ.c
@@ -15,7 +15,7 @@
* See the file "license.terms" for information on usage and redistribution of
* this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tclCmdMZ.c,v 1.201 2010/02/24 10:45:04 dkf Exp $
+ * RCS: @(#) $Id: tclCmdMZ.c,v 1.202 2010/02/27 19:02:26 dkf Exp $
*/
#include "tclInt.h"
@@ -1208,7 +1208,12 @@ StringFirstCmd(
}
}
- if (needleLen > 0) {
+ /*
+ * If the length of the needle is more than the length of the haystack, it
+ * cannot be contained in there so we can avoid searching. [Bug 2960021]
+ */
+
+ if (needleLen > 0 && needleLen <= haystackLen) {
register Tcl_UniChar *p, *end;
end = haystackStr + haystackLen - needleLen + 1;
@@ -1313,7 +1318,12 @@ StringLastCmd(
p = haystackStr + haystackLen - needleLen;
}
- if (needleLen > 0) {
+ /*
+ * If the length of the needle is more than the length of the haystack, it
+ * cannot be contained in there so we can avoid searching. [Bug 2960021]
+ */
+
+ if (needleLen > 0 && needleLen <= haystackLen) {
for (; p >= haystackStr; p--) {
/*
* Scan backwards to find the first character.