Problem is this struct in generic/tclCmdMZ.c:
typedef struct {
    int flags;                  /* Operations for which Tcl command is
                                 * to be invoked. */
    size_t length;              /* Number of non-NULL chars. in command. */
    char command[4];            /* Space for Tcl command to invoke.  Actual
                                 * size will be as large as necessary to
                                 * hold command.  This field must be the
                                 * last in the structure, so that it can
                                 * be larger than 4 bytes. */
} TraceVarInfo;

it defines command with length 4, but in reality more bytes are allocated:
typedef struct {
    VarTrace trace;
    TraceVarInfo tvar;
} CompoundVarTrace;
[...]
                CompoundVarTrace *compTracePtr;
[...]
                compTracePtr = (CompoundVarTrace *) ckalloc((unsigned)
                        (sizeof(CompoundVarTrace) - sizeof(tvarPtr->command)
                                + length + 1));

but the strcpy() call doesn't know about that:
                tvarPtr = &(compTracePtr->tvar);
[...]
                strcpy(tvarPtr->command, command);

so strcpy_chk thinks that the destination buffers is 4 bytes long, but
it's called with larger source strings at runtime, e.g.
"::tk::EventMotifBindings".

One way to avoid this would be to declare command[] with the maximum
size a variable name can have, but I couldn't find this limit in the tcl
source code.

For now, I'm going to patch the build to pass -U_FORTIFY_SOURCE.

This doesn't happen in tcl8.5, and it's a false positive, not sure how
useful it is to chase this down.

-- 
You received this bug notification because you are a member of Ubuntu
Bugs, which is subscribed to Ubuntu.
https://bugs.launchpad.net/bugs/683546

Title:
  gitk crashes on start

-- 
ubuntu-bugs mailing list
[email protected]
https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs

Reply via email to