diff options
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | generic/tclBinary.c | 7 |
2 files changed, 12 insertions, 1 deletions
@@ -1,3 +1,9 @@ +2007-04-24 Kevin B. Kenny <kennykb@acm.org> + + * generic/tclBinary.c: Addressed several code paths where the + error return from the 'binary format' command leaked the result + buffer. + 2007-04-24 Jeff Hobbs <jeffh@ActiveState.com> *** 8.5a6 TAGGED FOR RELEASE *** diff --git a/generic/tclBinary.c b/generic/tclBinary.c index 485383a..0512739 100644 --- a/generic/tclBinary.c +++ b/generic/tclBinary.c @@ -10,7 +10,7 @@ * See the file "license.terms" for information on usage and redistribution of * this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclBinary.c,v 1.34 2007/03/19 21:00:53 dgp Exp $ + * RCS: @(#) $Id: tclBinary.c,v 1.35 2007/04/24 17:18:11 kennykb Exp $ */ #include "tclInt.h" @@ -829,6 +829,7 @@ Tcl_BinaryObjCmd( value |= 1; } else if (str[offset] != '0') { errorValue = str; + Tcl_DecrRefCount(resultPtr); goto badValue; } if (((offset + 1) % 8) == 0) { @@ -843,6 +844,7 @@ Tcl_BinaryObjCmd( value |= 128; } else if (str[offset] != '0') { errorValue = str; + Tcl_DecrRefCount(resultPtr); goto badValue; } if (!((offset + 1) % 8)) { @@ -886,6 +888,7 @@ Tcl_BinaryObjCmd( value <<= 4; if (!isxdigit(UCHAR(str[offset]))) { /* INTL: digit */ errorValue = str; + Tcl_DecrRefCount(resultPtr); goto badValue; } c = str[offset] - '0'; @@ -907,6 +910,7 @@ Tcl_BinaryObjCmd( if (!isxdigit(UCHAR(str[offset]))) { /* INTL: digit */ errorValue = str; + Tcl_DecrRefCount(resultPtr); goto badValue; } c = str[offset] - '0'; @@ -975,6 +979,7 @@ Tcl_BinaryObjCmd( arg++; for (i = 0; i < count; i++) { if (FormatNumber(interp, cmd, listv[i], &cursor)!=TCL_OK) { + Tcl_DecrRefCount(resultPtr); return TCL_ERROR; } } |