zsh-workers
 help / color / mirror / code / Atom feed
* Segfault with "private" parameters inside "always" block
@ 2022-06-09 21:03 Bart Schaefer
  2022-06-09 22:04 ` [PATCH] " Bart Schaefer
  0 siblings, 1 reply; 2+ messages in thread
From: Bart Schaefer @ 2022-06-09 21:03 UTC (permalink / raw)
  To: Zsh hackers list

zsh/param/private assumes the heap created in startparamscope() is the
only active heap until endparamscope(), but "always" blocks allocate
and free another layer of heap, which invalidates the memory "private"
uses for the parameter GSU structures.

I haven't figured out what to do about this, yet.  The GSUs can't just
be static, because different special params use different callbacks
for get/set/unset.


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

* [PATCH] Re: Segfault with "private" parameters inside "always" block
  2022-06-09 21:03 Segfault with "private" parameters inside "always" block Bart Schaefer
@ 2022-06-09 22:04 ` Bart Schaefer
  0 siblings, 0 replies; 2+ messages in thread
From: Bart Schaefer @ 2022-06-09 22:04 UTC (permalink / raw)
  To: Zsh hackers list

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

On Thu, Jun 9, 2022 at 2:03 PM Bart Schaefer <schaefer@brasslantern.com> wrote:
>
> zsh/param/private assumes the heap created in startparamscope() is the
> only active heap until endparamscope(), but "always" blocks allocate
> and free another layer of heap, which invalidates the memory "private"
> uses for the parameter GSU structures.

That was a lot simpler/more straightforward than I expected.

[-- Attachment #2: private_mem.txt --]
[-- Type: text/plain, Size: 1491 bytes --]

diff --git a/Src/Modules/param_private.c b/Src/Modules/param_private.c
index c53839152..065fa63d2 100644
--- a/Src/Modules/param_private.c
+++ b/Src/Modules/param_private.c
@@ -92,7 +92,7 @@ makeprivate(HashNode hn, UNUSED(int flags))
 	    makeprivate_error = 1;
 	    return;
 	}
-	struct gsu_closure *gsu = zhalloc(sizeof(struct gsu_closure));
+	struct gsu_closure *gsu = zalloc(sizeof(struct gsu_closure));
 	switch (PM_TYPE(pm->node.flags)) {
 	case PM_SCALAR:
 	    gsu->g = (void *)(pm->gsu.s);
@@ -269,6 +269,8 @@ pps_unsetfn(Param pm, int explicit)
 	gsu->unsetfn(pm, explicit);
     if (explicit)
 	pm->gsu.s = (GsuScalar)c;
+    else
+	zfree(c, sizeof(struct gsu_closure));
 }
 
 /**/
@@ -306,6 +308,8 @@ ppi_unsetfn(Param pm, int explicit)
 	gsu->unsetfn(pm, explicit);
     if (explicit)
 	pm->gsu.i = (GsuInteger)c;
+    else
+	zfree(c, sizeof(struct gsu_closure));
 }
 
 /**/
@@ -343,6 +347,8 @@ ppf_unsetfn(Param pm, int explicit)
 	gsu->unsetfn(pm, explicit);
     if (explicit)
 	pm->gsu.f = (GsuFloat)c;
+    else
+	zfree(c, sizeof(struct gsu_closure));
 }
 
 /**/
@@ -381,6 +387,8 @@ ppa_unsetfn(Param pm, int explicit)
 	gsu->unsetfn(pm, explicit);
     if (explicit)
 	pm->gsu.a = (GsuArray)c;
+    else
+	zfree(c, sizeof(struct gsu_closure));
 }
 
 static HashTable emptytable;
@@ -420,6 +428,8 @@ pph_unsetfn(Param pm, int explicit)
 	gsu->unsetfn(pm, explicit);
     if (explicit)
 	pm->gsu.h = (GsuHash)c;
+    else
+	zfree(c, sizeof(struct gsu_closure));
 }
 
 /*

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

end of thread, other threads:[~2022-06-09 22:04 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-06-09 21:03 Segfault with "private" parameters inside "always" block Bart Schaefer
2022-06-09 22:04 ` [PATCH] " Bart Schaefer

Code repositories for project(s) associated with this 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).