From fd3b76f8383e7efffe22100d59f2d3d4c365dff8 Mon Sep 17 00:00:00 2001
From: Jonathan Wilkes <jon.w.wilkes@gmail.com>
Date: Tue, 21 Mar 2017 20:27:19 -0400
Subject: [PATCH] fix #289: invalid read with iemguis due to partially port of
 the new loadbang interface.

---
 pd/src/g_bang.c   | 7 ++++---
 pd/src/g_editor.c | 2 +-
 pd/src/g_numbox.c | 6 +++---
 pd/src/g_radio.c  | 7 ++++---
 pd/src/g_slider.c | 6 +++---
 pd/src/g_toggle.c | 6 +++---
 pd/src/m_binbuf.c | 3 ++-
 pd/src/x_misc.c   | 2 +-
 8 files changed, 21 insertions(+), 18 deletions(-)

diff --git a/pd/src/g_bang.c b/pd/src/g_bang.c
index b7debd7d9..bedbb664d 100644
--- a/pd/src/g_bang.c
+++ b/pd/src/g_bang.c
@@ -390,9 +390,9 @@ static void bng_list(t_bng *x, t_symbol *s, int ac, t_atom *av){bng_bang2(x);}
 static void bng_anything(t_bng *x, t_symbol *s, int argc, t_atom *argv)
 {bng_bang2(x);}
 
-static void bng_loadbang(t_bng *x)
+static void bng_loadbang(t_bng *x, t_floatarg action)
 {
-    if(!sys_noloadbang && x->x_gui.x_loadinit)
+    if (action == LB_LOAD && x->x_gui.x_loadinit)
     {
         bng_set(x);
         bng_bout(x,0);
@@ -528,7 +528,8 @@ void g_bang_setup(void)
                     A_FLOAT, A_FLOAT, A_FLOAT, A_FLOAT, A_FLOAT, 0);
     class_addmethod(bng_class, (t_method)bng_dialog, gensym("dialog"),
                     A_GIMME, 0);
-    class_addmethod(bng_class, (t_method)bng_loadbang, gensym("loadbang"), 0);
+    class_addmethod(bng_class, (t_method)bng_loadbang, gensym("loadbang"),
+        A_DEFFLOAT, 0);
     class_addmethod(bng_class, (t_method)bng_size, gensym("size"), A_GIMME, 0);
     iemgui_class_addmethods(bng_class);
     class_addmethod(bng_class, (t_method)bng_flashtime, gensym("flashtime"),
diff --git a/pd/src/g_editor.c b/pd/src/g_editor.c
index 0dc859651..3fdf9473b 100644
--- a/pd/src/g_editor.c
+++ b/pd/src/g_editor.c
@@ -6116,7 +6116,7 @@ static t_canvas *paste_canvas;
 
 static void glist_donewloadbangs(t_glist *x)
 {
-    if (x->gl_editor)
+    if (!sys_noloadbang && x->gl_editor)
     {
         t_selection *sel;
         for (sel = x->gl_editor->e_selection; sel; sel = sel->sel_next)
diff --git a/pd/src/g_numbox.c b/pd/src/g_numbox.c
index a46532bcc..9de4cf189 100644
--- a/pd/src/g_numbox.c
+++ b/pd/src/g_numbox.c
@@ -683,9 +683,9 @@ static void my_numbox_lin(t_my_numbox *x)
     x->x_lin0_log1 = 0;
 }
 
-static void my_numbox_loadbang(t_my_numbox *x)
+static void my_numbox_loadbang(t_my_numbox *x, t_floatarg action)
 {
-    if(!sys_noloadbang && x->x_gui.x_loadinit)
+    if (action == LB_LOAD && x->x_gui.x_loadinit)
     {
         sys_queuegui(x, x->x_gui.x_glist, my_numbox_draw_update);
         my_numbox_bang(x);
@@ -858,7 +858,7 @@ void g_numbox_setup(void)
     class_addmethod(my_numbox_class, (t_method)my_numbox_dialog,
         gensym("dialog"), A_GIMME, 0);
     class_addmethod(my_numbox_class, (t_method)my_numbox_loadbang,
-        gensym("loadbang"), 0);
+        gensym("loadbang"), A_DEFFLOAT, 0);
     class_addmethod(my_numbox_class, (t_method)my_numbox_set,
         gensym("set"), A_FLOAT, 0);
     class_addmethod(my_numbox_class, (t_method)my_numbox_size,
diff --git a/pd/src/g_radio.c b/pd/src/g_radio.c
index 6a7f2e0a6..eaf924e87 100644
--- a/pd/src/g_radio.c
+++ b/pd/src/g_radio.c
@@ -419,9 +419,9 @@ static int radio_newclick(t_gobj *z, struct _glist *glist, int xpix, int ypix,
     return (1);
 }
 
-static void radio_loadbang(t_radio *x)
+static void radio_loadbang(t_radio *x, t_floatarg action)
 {
-    if(!sys_noloadbang && x->x_gui.x_loadinit)
+    if(action == LB_LOAD && x->x_gui.x_loadinit)
     {
         radio_bang(x);
     }
@@ -529,7 +529,8 @@ void radio_addmethods(t_class *c)
 {
     class_addbang(c, radio_bang);
     class_addfloat(c, radio_float);
-    class_addmethod(c, (t_method)radio_loadbang,  gensym("loadbang"), 0);
+    class_addmethod(c, (t_method)radio_loadbang,  gensym("loadbang"),
+        A_DEFFLOAT, 0);
     class_addmethod(c, (t_method)radio_set,       gensym("set"), A_FLOAT, 0);
     class_addmethod(c, (t_method)radio_size,      gensym("size"), A_GIMME, 0);
     class_addmethod(c, (t_method)iemgui_init,      gensym("init"), A_FLOAT, 0);
diff --git a/pd/src/g_slider.c b/pd/src/g_slider.c
index cc061b6f3..e4849f5ac 100644
--- a/pd/src/g_slider.c
+++ b/pd/src/g_slider.c
@@ -483,9 +483,9 @@ static void slider_steady(t_slider *x, t_floatarg f)
     x->x_steady = (f==0.0)?0:1;
 }
 
-static void slider_loadbang(t_slider *x)
+static void slider_loadbang(t_slider *x, t_floatarg action)
 {
-    if(!sys_noloadbang && x->x_gui.x_loadinit)
+    if(action == LB_LOAD && x->x_gui.x_loadinit)
     {
         x->x_gui.x_draw(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_UPDATE);
         slider_bang(x);
@@ -597,7 +597,7 @@ static void slider_free(t_slider *x)
 
 void slider_addmethods(t_class *c) {
     class_addmethod(c, (t_method)slider_loadbang,
-        gensym("loadbang"), 0);
+        gensym("loadbang"), A_DEFFLOAT, 0);
     class_addmethod(c, (t_method)slider_set,
         gensym("set"), A_FLOAT, 0);
     class_addmethod(c, (t_method)slider_log, gensym("log"), 0);
diff --git a/pd/src/g_toggle.c b/pd/src/g_toggle.c
index 9292f1d08..d89c73852 100644
--- a/pd/src/g_toggle.c
+++ b/pd/src/g_toggle.c
@@ -328,9 +328,9 @@ static void toggle_fout(t_toggle *x, t_floatarg f)
     iemgui_out_float(&x->x_gui, 0, 0, x->x_on);
 }
 
-static void toggle_loadbang(t_toggle *x)
+static void toggle_loadbang(t_toggle *x, t_floatarg action)
 {
-    if(!sys_noloadbang && x->x_gui.x_loadinit)
+    if (action == LB_LOAD && x->x_gui.x_loadinit)
         toggle_fout(x, (t_float)x->x_on);
 }
 
@@ -440,7 +440,7 @@ void g_toggle_setup(void)
     class_addmethod(toggle_class, (t_method)toggle_dialog, gensym("dialog"),
                     A_GIMME, 0);
     class_addmethod(toggle_class, (t_method)toggle_loadbang, gensym("loadbang"),
-        0);
+        A_DEFFLOAT, 0);
     class_addmethod(toggle_class, (t_method)toggle_set, gensym("set"),
         A_FLOAT, 0);
     class_addmethod(toggle_class, (t_method)toggle_size, gensym("size"),
diff --git a/pd/src/m_binbuf.c b/pd/src/m_binbuf.c
index 69d5c3977..9d3582a8d 100644
--- a/pd/src/m_binbuf.c
+++ b/pd/src/m_binbuf.c
@@ -1697,7 +1697,8 @@ t_pd *glob_evalfile(t_pd *ignore, t_symbol *name, t_symbol *dir)
         x = s__X.s_thing;
         vmess(x, gensym("pop"), "i", 1);
     }
-    pd_doloadbang();
+    if (!sys_noloadbang)
+        pd_doloadbang();
     canvas_resume_dsp(dspstate);
     s__X.s_thing = boundx;
     return x;
diff --git a/pd/src/x_misc.c b/pd/src/x_misc.c
index 75ce3c30f..27d489e2a 100644
--- a/pd/src/x_misc.c
+++ b/pd/src/x_misc.c
@@ -117,7 +117,7 @@ static void loadbang_click(t_loadbang *x,
 
 static void loadbang_loadbang(t_loadbang *x, t_floatarg action)
 {
-    if (!sys_noloadbang && action == LB_LOAD)
+    if (action == LB_LOAD)
         outlet_bang(x->x_obj.ob_outlet);
 }
 
-- 
GitLab