From edce4263d79bad62b9c06d66bab9ac954cafb6df Mon Sep 17 00:00:00 2001 From: "jan.nijtmans" Date: Mon, 26 Jan 2015 20:47:23 +0000 Subject: Fix [df08482b042a16007f256bfbaaacfbe0def01074|df08482b04]: Double defined INFINITY in regguts.h --- generic/regcomp.c | 14 +++++++------- generic/regexec.c | 4 ++-- generic/regguts.h | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/generic/regcomp.c b/generic/regcomp.c index 8880318..77f2f20 100644 --- a/generic/regcomp.c +++ b/generic/regcomp.c @@ -996,13 +996,13 @@ parseqatom( switch (v->nexttype) { case '*': m = 0; - n = INFINITY; + n = DUPINF; qprefer = (v->nextvalue) ? LONGER : SHORTER; NEXT(); break; case '+': m = 1; - n = INFINITY; + n = DUPINF; qprefer = (v->nextvalue) ? LONGER : SHORTER; NEXT(); break; @@ -1019,7 +1019,7 @@ parseqatom( if (SEE(DIGIT)) { n = scannum(v); } else { - n = INFINITY; + n = DUPINF; } if (m > n) { ERR(REG_BADBR); @@ -1217,8 +1217,8 @@ parseqatom( */ dupnfa(v->nfa, atom->begin, atom->end, s, atom->begin); - assert(m >= 1 && m != INFINITY && n >= 1); - repeat(v, s, atom->begin, m-1, (n == INFINITY) ? n : n-1); + assert(m >= 1 && m != DUPINF && n >= 1); + repeat(v, s, atom->begin, m-1, (n == DUPINF) ? n : n-1); f = COMBINE(qprefer, atom->flags); t = subre(v, '.', f, s, atom->end); /* prefix and atom */ NOERR(); @@ -1323,7 +1323,7 @@ repeat( #define SOME 2 #define INF 3 #define PAIR(x, y) ((x)*4 + (y)) -#define REDUCE(x) ( ((x) == INFINITY) ? INF : (((x) > 1) ? SOME : (x)) ) +#define REDUCE(x) ( ((x) == DUPINF) ? INF : (((x) > 1) ? SOME : (x)) ) const int rm = REDUCE(m); const int rn = REDUCE(n); struct state *s, *s2; @@ -2108,7 +2108,7 @@ stdump( } if (t->min != 1 || t->max != 1) { fprintf(f, " {%d,", t->min); - if (t->max != INFINITY) { + if (t->max != DUPINF) { fprintf(f, "%d", t->max); } fprintf(f, "}"); diff --git a/generic/regexec.c b/generic/regexec.c index 205fcc2..f3be137 100644 --- a/generic/regexec.c +++ b/generic/regexec.c @@ -1117,7 +1117,7 @@ cbrdissect( */ i = 0; - for (p = begin; p <= stop && (i < max || max == INFINITY); p += len) { + for (p = begin; p <= stop && (i < max || max == DUPINF); p += len) { if ((*v->g->compare)(paren, p, len) != 0) { break; } @@ -1132,7 +1132,7 @@ cbrdissect( if (p != end) { /* didn't consume all of it */ return REG_NOMATCH; } - if (min <= i && (i <= max || max == INFINITY)) { + if (min <= i && (i <= max || max == DUPINF)) { return REG_OKAY; } return REG_NOMATCH; /* out of range */ diff --git a/generic/regguts.h b/generic/regguts.h index 42654eb..ac625d5 100644 --- a/generic/regguts.h +++ b/generic/regguts.h @@ -116,7 +116,7 @@ #define xxx 1 #define DUPMAX _POSIX2_RE_DUP_MAX -#define INFINITY (DUPMAX+1) +#define DUPINF (DUPMAX+1) #define REMAGIC 0xfed7 /* magic number for main struct */ -- cgit v0.12 From 36c44d8572394858bf7e0956c4b8e1eecc333eb6 Mon Sep 17 00:00:00 2001 From: dgp Date: Thu, 29 Jan 2015 17:37:59 +0000 Subject: Protect against extension variable resolvers that fail to play by the post-Var Reform rules. --- generic/tclVar.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/generic/tclVar.c b/generic/tclVar.c index a6f6cf4..33071ae 100644 --- a/generic/tclVar.c +++ b/generic/tclVar.c @@ -3914,7 +3914,8 @@ Tcl_GetVariableFullName( } else if (iPtr->varFramePtr->procPtr) { int index = varPtr - iPtr->varFramePtr->compiledLocals; - if (index < iPtr->varFramePtr->numCompiledLocals) { + if (index >= 0 + && index < iPtr->varFramePtr->numCompiledLocals) { namePtr = localName(iPtr->varFramePtr, index); Tcl_AppendObjToObj(objPtr, namePtr); } -- cgit v0.12 From 9f39fc4286082e4e7a7b52711f7b37c8c6fddf7c Mon Sep 17 00:00:00 2001 From: dgp Date: Thu, 29 Jan 2015 18:34:50 +0000 Subject: Test for bug [08872796bc]. --- tests/io.test | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/tests/io.test b/tests/io.test index d533957..e4dc522 100644 --- a/tests/io.test +++ b/tests/io.test @@ -8419,6 +8419,25 @@ test io-73.3 {[5adc350683] [gets] after EOF} -setup { removeFile io-73.3 } -result {1 1 {more data} 0 {} 1} +test io-73.4 {[5adc350683] [read] after EOF} -setup { + set fn [makeFile {} io-73.4] + set rfd [open $fn r] + set wfd [open $fn a] + chan configure $wfd -buffering line + read $rfd +} -body { + set result [eof $rfd] + puts $wfd "more data" + lappend result [eof $rfd] + lappend result [read $rfd] + lappend result [eof $rfd] +} -cleanup { + close $wfd + close $rfd + removeFile io-73.4 +} -result {1 1 {more data +} 1} + # ### ### ### ######### ######### ######### # cleanup -- cgit v0.12 From b45286725aeaf89d746d3f7edc0f125a4c0950a3 Mon Sep 17 00:00:00 2001 From: dgp Date: Thu, 29 Jan 2015 18:39:11 +0000 Subject: Fix [08872796bc] --- generic/tclIO.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/generic/tclIO.c b/generic/tclIO.c index a9091af..86ec27a 100644 --- a/generic/tclIO.c +++ b/generic/tclIO.c @@ -5735,8 +5735,8 @@ DoReadChars( chanPtr = statePtr->topChanPtr; TclChannelPreserve((Tcl_Channel)chanPtr); - /* Must clear the BLOCKED flag here since we check before reading */ - ResetFlag(statePtr, CHANNEL_BLOCKED); + /* Must clear the BLOCKED|EOF flags here since we check before reading */ + ResetFlag(statePtr, CHANNEL_BLOCKED|CHANNEL_EOF); for (copied = 0; (unsigned) toRead > 0; ) { copiedNow = -1; if (statePtr->inQueueHead != NULL) { -- cgit v0.12