From 65647f90907d69eb1d0c0f3489b9bbec9c5c7135 Mon Sep 17 00:00:00 2001
From: Albert Graef <aggraef@gmail.com>
Date: Mon, 21 Sep 2020 11:50:29 +0200
Subject: [PATCH] Fix up the dummy canvas environment in
 abstracthandler_callback.

Instead of casting a magic number to a pointer, which is a sure recipe
for disaster, provide a properly initialized dummy t_canvasenvironment*
pointing to static storage.
---
 pd/src/g_canvas.c | 13 +++++++++++++
 pd/src/g_canvas.h |  2 ++
 pd/src/g_editor.c |  2 +-
 3 files changed, 16 insertions(+), 1 deletion(-)

diff --git a/pd/src/g_canvas.c b/pd/src/g_canvas.c
index 8cabb3506..0937ce8e4 100644
--- a/pd/src/g_canvas.c
+++ b/pd/src/g_canvas.c
@@ -43,6 +43,19 @@ struct _canvasenvironment
     t_namelist *ce_path;   /* search path */
 };
 
+t_canvasenvironment *dummy_canvas_env(const char *dir)
+{
+ static t_canvasenvironment dummy_env = {
+   .ce_dir = NULL,
+   .ce_argc = 0,
+   .ce_argv = NULL,
+   .ce_dollarzero = 0,
+   .ce_path = NULL
+ };
+ dummy_env.ce_dir = gensym(dir);
+ return &dummy_env;
+}
+
 #define GLIST_DEFCANVASWIDTH 450
 #define GLIST_DEFCANVASHEIGHT 300
 
diff --git a/pd/src/g_canvas.h b/pd/src/g_canvas.h
index 44ee4e4ab..9a56e360c 100644
--- a/pd/src/g_canvas.h
+++ b/pd/src/g_canvas.h
@@ -76,6 +76,8 @@ EXTERN_STRUCT _tscalar;
 EXTERN_STRUCT _canvasenvironment;
 #define t_canvasenvironment struct _canvasenvironment 
 
+extern t_canvasenvironment *dummy_canvas_env(const char *dir);
+
 EXTERN_STRUCT _fielddesc;
 #define t_fielddesc struct _fielddesc
 
diff --git a/pd/src/g_editor.c b/pd/src/g_editor.c
index 50f8d035c..bc78a63dd 100644
--- a/pd/src/g_editor.c
+++ b/pd/src/g_editor.c
@@ -2360,7 +2360,7 @@ static void abstracthandler_callback(t_abstracthandler *x, t_symbol *s)
     /* save the subpatch into a separated pd file */
     t_atom at[3];
     SETSYMBOL(at, gensym(filename)); SETSYMBOL(at+1, gensym(dir)); SETFLOAT(at+2, 0.f);
-    x->tarjet->gl_env = 0xF1A6; /* gl_env is set to non-zero in order to save the subcanvas as a root canvas */
+    x->tarjet->gl_env = dummy_canvas_env(dir); /* gl_env is set to non-zero in order to save the subcanvas as a root canvas */
     typedmess(&x->tarjet->gl_pd, gensym("savetofile"), 3, at);
     x->tarjet->gl_env = 0;
 
-- 
GitLab