zsh-workers
 help / color / mirror / code / Atom feed
* Bug Report: Variable becomes unset without reason
@ 2019-08-08 16:08 Aryn Starr
  2019-08-14  9:37 ` Stephane Chazelas
  0 siblings, 1 reply; 5+ messages in thread
From: Aryn Starr @ 2019-08-08 16:08 UTC (permalink / raw)
  To: zsh-workers

[-- Attachment #1: Type: text/plain, Size: 242 bytes --]

I have included the file that reproduces the bug with `zsh -f` and the result of running it in https://gist.github.com/NightMachinary/32689e786a3b7f5865a042d49b884b57 <https://gist.github.com/NightMachinary/32689e786a3b7f5865a042d49b884b57>. 

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Bug Report: Variable becomes unset without reason
  2019-08-08 16:08 Bug Report: Variable becomes unset without reason Aryn Starr
@ 2019-08-14  9:37 ` Stephane Chazelas
  2019-08-14 12:17   ` Aryn Starr
  2019-08-14 14:04   ` Peter Stephenson
  0 siblings, 2 replies; 5+ messages in thread
From: Stephane Chazelas @ 2019-08-14  9:37 UTC (permalink / raw)
  To: Aryn Starr; +Cc: zsh-workers

2019-08-08 20:38:05 +0430, Aryn Starr:
> I have included the file that reproduces the bug with `zsh -f` and the result of running it in https://gist.github.com/NightMachinary/32689e786a3b7f5865a042d49b884b57 <https://gist.github.com/NightMachinary/32689e786a3b7f5865a042d49b884b57>. 

  Please try and make sure your bug reports are self-contained.
  The zsh ML has been around for decades and along with its
  archives will probably be around for several more decades, but
  we can't tell much about github (that link may become invalid
  at any time).

  We should also not have to fire up a web browser to figure out
  what the bug is about.

Now, that being said, as discussed on U&L it looks like a bug
indeed and a shorter reproducer is:

$ zsh -xc 'v=1; f() { local v; v=2 true; }; f; typeset -p v'
+zsh:1> v=1
+zsh:1> f
+f:0> local v
+f:0> v=2 +f:0> true
+zsh:1> typeset -p v
zsh:typeset:1: no such variable: v

Most likely, that's the "v=2 true" (where "true" is a builtin) that ends up
unsetting the "v" from the global scope.

-- 
Stephane

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Bug Report: Variable becomes unset without reason
  2019-08-14  9:37 ` Stephane Chazelas
@ 2019-08-14 12:17   ` Aryn Starr
  2019-08-14 14:04   ` Peter Stephenson
  1 sibling, 0 replies; 5+ messages in thread
From: Aryn Starr @ 2019-08-14 12:17 UTC (permalink / raw)
  To: Stephane Chazelas; +Cc: zsh-workers

[-- Attachment #1: Type: text/plain, Size: 1577 bytes --]

I’ll keep that in mind. I’m very new to mailing lists, and I haven’t found any resource on properly using mailing lists, unfortunately. 
And yes, if we use an external program (or even just `command true`), the bug won’t appear. Though it does with function calls, too:
zsh -c 'v=1; ff() command true ; f() { local v; v=2 ff; }; f; typeset -p v'

> On Aug 14, 2019, at 2:07 PM, Stephane Chazelas <stephane.chazelas@gmail.com> wrote:
> 
> 2019-08-08 20:38:05 +0430, Aryn Starr:
>> I have included the file that reproduces the bug with `zsh -f` and the result of running it in https://gist.github.com/NightMachinary/32689e786a3b7f5865a042d49b884b57 <https://gist.github.com/NightMachinary/32689e786a3b7f5865a042d49b884b57>. 
> 
>  Please try and make sure your bug reports are self-contained.
>  The zsh ML has been around for decades and along with its
>  archives will probably be around for several more decades, but
>  we can't tell much about github (that link may become invalid
>  at any time).
> 
>  We should also not have to fire up a web browser to figure out
>  what the bug is about.
> 
> Now, that being said, as discussed on U&L it looks like a bug
> indeed and a shorter reproducer is:
> 
> $ zsh -xc 'v=1; f() { local v; v=2 true; }; f; typeset -p v'
> +zsh:1> v=1
> +zsh:1> f
> +f:0> local v
> +f:0> v=2 +f:0> true
> +zsh:1> typeset -p v
> zsh:typeset:1: no such variable: v
> 
> Most likely, that's the "v=2 true" (where "true" is a builtin) that ends up
> unsetting the "v" from the global scope.
> 
> -- 
> Stephane

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Bug Report: Variable becomes unset without reason
  2019-08-14  9:37 ` Stephane Chazelas
  2019-08-14 12:17   ` Aryn Starr
@ 2019-08-14 14:04   ` Peter Stephenson
  2019-08-14 15:12     ` Mikael Magnusson
  1 sibling, 1 reply; 5+ messages in thread
From: Peter Stephenson @ 2019-08-14 14:04 UTC (permalink / raw)
  To: zsh-workers

On Wed, 2019-08-14 at 10:37 +0100, Stephane Chazelas wrote:
> 2019-08-08 20:38:05 +0430, Aryn Starr:
> Now, that being said, as discussed on U&L it looks like a bug
> indeed and a shorter reproducer is:
> 
> $ zsh -xc 'v=1; f() { local v; v=2 true; }; f; typeset -p v'
> +zsh:1> v=1
> +zsh:1> f
> +f:0> local v
> +f:0> v=2 +f:0> true
> +zsh:1> typeset -p v
> zsh:typeset:1: no such variable: v
> 
> Most likely, that's the "v=2 true" (where "true" is a builtin) that ends up
> unsetting the "v" from the global scope.

Yes, the saved version of "v" that we restore after the builtin is
missing the pointer back to the version of v in the enclosing scope.  So
it's not only not shown as set, it will leak memory.

This simply preserves that pointer in the copy, but this assumes we've
correctly blocked off the old parameter from being altered inside the
function scope --- if we haven't that preserved old pointer is going to
get us into trouble.  However, if we haven't that's already a bug, so
this shouldn't make things worse.

pws

diff --git a/Src/params.c b/Src/params.c
index 1499e3a40..a253a9d8e 100644
--- a/Src/params.c
+++ b/Src/params.c
@@ -1124,8 +1124,10 @@ copyparam(Param tpm, Param pm, int fakecopy)
     tpm->base = pm->base;
     tpm->width = pm->width;
     tpm->level = pm->level;
-    if (!fakecopy)
+    if (!fakecopy) {
+	tpm->old = pm->old;
 	tpm->node.flags &= ~PM_SPECIAL;
+    }
     switch (PM_TYPE(pm->node.flags)) {
     case PM_SCALAR:
 	tpm->u.str = ztrdup(pm->gsu.s->getfn(pm));
diff --git a/Test/D04parameter.ztst b/Test/D04parameter.ztst
index 194c3e287..b6e85a9fe 100644
--- a/Test/D04parameter.ztst
+++ b/Test/D04parameter.ztst
@@ -2522,3 +2522,15 @@ F:behavior, see http://austingroupbugs.net/view.php?id=888
 >trailing/slashes
 >removed
 >are/removed
+
+ foo=global-value
+ fn() {
+    local foo=function-value
+    foo=export-value true
+    print $foo
+ }
+ fn
+ print $foo
+0:Global variables are not trashed by "foo=bar builtin" (regression test)
+>function-value
+>global-value


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Bug Report: Variable becomes unset without reason
  2019-08-14 14:04   ` Peter Stephenson
@ 2019-08-14 15:12     ` Mikael Magnusson
  0 siblings, 0 replies; 5+ messages in thread
From: Mikael Magnusson @ 2019-08-14 15:12 UTC (permalink / raw)
  To: Peter Stephenson; +Cc: zsh-workers

On 8/14/19, Peter Stephenson <p.stephenson@samsung.com> wrote:
> On Wed, 2019-08-14 at 10:37 +0100, Stephane Chazelas wrote:
>> 2019-08-08 20:38:05 +0430, Aryn Starr:
>> Now, that being said, as discussed on U&L it looks like a bug
>> indeed and a shorter reproducer is:
>>
>> $ zsh -xc 'v=1; f() { local v; v=2 true; }; f; typeset -p v'
>> +zsh:1> v=1
>> +zsh:1> f
>> +f:0> local v
>> +f:0> v=2 +f:0> true
>> +zsh:1> typeset -p v
>> zsh:typeset:1: no such variable: v
>>
>> Most likely, that's the "v=2 true" (where "true" is a builtin) that ends
>> up
>> unsetting the "v" from the global scope.
>
> Yes, the saved version of "v" that we restore after the builtin is
> missing the pointer back to the version of v in the enclosing scope.  So
> it's not only not shown as set, it will leak memory.
>
> This simply preserves that pointer in the copy, but this assumes we've
> correctly blocked off the old parameter from being altered inside the
> function scope --- if we haven't that preserved old pointer is going to
> get us into trouble.  However, if we haven't that's already a bug, so
> this shouldn't make things worse.

This got me thinking about related stuff. I guess these results are
expected, maybe even at best unspecified?
% foo=initial; foo=bar printf -v foo hello; echo $foo
initial
% set hi; argv= set hello; echo $1
hi
% set a b c; argv= shift; echo $@
a b c
% a=1; a=5 typeset a=3 b=7; echo $a$b
17

-- 
Mikael Magnusson

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2019-08-14 15:13 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-08-08 16:08 Bug Report: Variable becomes unset without reason Aryn Starr
2019-08-14  9:37 ` Stephane Chazelas
2019-08-14 12:17   ` Aryn Starr
2019-08-14 14:04   ` Peter Stephenson
2019-08-14 15:12     ` Mikael Magnusson

Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/zsh/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).