> On 4/7/2020 3:05 AM, Konovalov, Vadim wrote:
> > As a workaround, you can define
> this environment variable in Perl, then error goes away:
> >
> > vad@bonita:~$ perl
> -MTcl -we '$ENV{FOO}="x";my $i=new Tcl;$i->Eval("set env(FOO) bar");print
> qq/ok\n/'
> > ok
>
> I have not yet given this a try, but does this mean having to
> first set the exact environment variable Tcl sets, or is it
> that *any*
> environment variable needs to be set first from Perl?
Any environment variable needs to be set first from Perl - this will avoid
allocating its name in
>
> > Tcl uses "ckalloc"
> function to allocate strings for name of environment variable "FOO" (or a
> value?)
> > This 'ckalloc' is their helper function, which chains memory into
> link, so to free it after all.
> >
> > IMO If they just use "malloc" the problem
> will go away.
> > I haven't verified this assumption, but 85%-sure of it ??
>
> Because I compiled with -DPURIFY I've already verified this won't
> make a
> difference.
Are you stating that if I change in function "TclSetEnv" here ckalloc to malloc
and ckfree to free:
if (index == -1) {
#ifndef USE_PUTENV
/*
* We need to handle the case where the environment may be changed
* outside our control. ourEnvironSize is only valid if the current
* environment is the one we allocated. [Bug 979640]
*/
if ((env.ourEnviron != environ) || (length+2 > env.ourEnvironSize)) {
char **newEnviron = ckalloc((length + 5) * sizeof(char *));
memcpy(newEnviron, environ, length * sizeof(char *));
if ((env.ourEnvironSize != 0) && (env.ourEnviron != NULL)) {
ckfree(env.ourEnviron);
}
environ = env.ourEnviron = newEnviron;
env.ourEnvironSize = length + 5;
}
index = length;
environ[index + 1] = NULL;
#endif /* USE_PUTENV */
oldValue = NULL;
nameLength = strlen(name);
BTW what if you'll rebuild with USE_PUTENV?
>
> Without manually defining TCL_MEM_DEBUG, ckalloc() is Tcl_Alloc(),
> and Tcl_Alloc() uses TclpAlloc() directly.
> Defining PURIFY undefines
> USE_TCLALLOC, making TclpAlloc()
> use malloc() directly.
>
> This is evident in the valgrind stack trace I posted 2020-03-17.
That's cool