From a7688da0ec4653235b34fc97237c06415a55275e Mon Sep 17 00:00:00 2001
From: Jonathan Wilkes <jon.w.wilkes@gmail.com>
Date: Wed, 22 Jul 2020 12:31:00 -0400
Subject: [PATCH] port from Vanilla: protect class accessors from NULL pointers
 Vanilla commit 94d59de44ea23aa084596d1ba2050d3883511ec3

---
 pd/src/m_class.c | 105 +++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 105 insertions(+)

diff --git a/pd/src/m_class.c b/pd/src/m_class.c
index a9d296369..f59edbb30 100644
--- a/pd/src/m_class.c
+++ b/pd/src/m_class.c
@@ -439,6 +439,11 @@ void class_addmethod(t_class *c, t_method fn, t_symbol *sel,
     t_atomtype argtype = arg1;
     int nargs;
     
+    if (!c)
+    {
+        bug("class_addmethod");
+        return;
+    }
     va_start(ap, arg1);
         /* "signal" method specifies that we take audio signals but
         that we don't want automatic float to signal conversion.  This
@@ -527,61 +532,121 @@ phooey:
     /* Instead of these, see the "class_addfloat", etc.,  macros in m_pd.h */
 void class_addbang(t_class *c, t_method fn)
 {
+    if (!c)
+    {
+        bug("class_addbang");
+        return;
+    }
     c->c_bangmethod = (t_bangmethod)fn;
 }
 
 void class_addpointer(t_class *c, t_method fn)
 {
+    if (!c)
+    {
+        bug("class_addpointer");
+        return;
+    }
     c->c_pointermethod = (t_pointermethod)fn;
 }
 
 void class_doaddfloat(t_class *c, t_method fn)
 {
+    if (!c)
+    {
+        bug("class_doaddfloat");
+        return;
+    }
     c->c_floatmethod = (t_floatmethod)fn;
 }
 
 void class_addsymbol(t_class *c, t_method fn)
 {
+    if (!c)
+    {
+        bug("class_addsymbol");
+        return;
+    }
     c->c_symbolmethod = (t_symbolmethod)fn;
 }
 
 void class_addblob(t_class *c, t_method fn) /* MP 20061226 blob type */
 {
+    if (!c)
+    {
+        bug("class_addblob");
+        return;
+    }
     c->c_blobmethod = (t_blobmethod)fn;
 }
 
 void class_addlist(t_class *c, t_method fn)
 {
+    if (!c)
+    {
+        bug("class_addlist");
+        return;
+    }
     c->c_listmethod = (t_listmethod)fn;
 }
 
 void class_addanything(t_class *c, t_method fn)
 {
+    if (!c)
+    {
+        bug("class_addanything");
+        return;
+    }
     c->c_anymethod = (t_anymethod)fn;
 }
 
 void class_setwidget(t_class *c, t_widgetbehavior *w)
 {
+    if (!c)
+    {
+        bug("class_setwidget");
+        return;
+    }
     c->c_wb = w;
 }
 
 void class_setparentwidget(t_class *c, t_parentwidgetbehavior *pw)
 {
+    if (!c)
+    {
+        bug("class_setparentwidget");
+        return;
+    }
     c->c_pwb = pw;
 }
 
 char *class_getname(t_class *c)
 {
+    if (!c)
+    {
+        bug("class_getname");
+        return 0;
+    }
     return (c->c_name->s_name);
 }
 
 char *class_gethelpname(t_class *c)
 {
+    if (!c)
+    {
+        bug("class_gethelpname");
+        return 0;
+    }
     return (c->c_helpname->s_name);
 }
 
 void class_sethelpsymbol(t_class *c, t_symbol *s)
 {
+    if (!c)
+    {
+        bug("class_sethelpsymbol");
+        return;
+    }
     c->c_helpname = s;
 }
 
@@ -592,11 +657,21 @@ t_parentwidgetbehavior *pd_getparentwidget(t_pd *x)
 
 void class_setdrawcommand(t_class *c)
 {
+    if (!c)
+    {
+        bug("class_setdrawcommand");
+        return;
+    }
     c->c_drawcommand = 1;
 }
 
 int class_isdrawcommand(t_class *c)
 {
+    if (!c)
+    {
+        bug("class_isdrawcommand");
+        return 0;
+    }
     return (c->c_drawcommand);
 }
 
@@ -612,6 +687,11 @@ static void pd_floatforsignal(t_pd *x, t_float f)
 
 void class_domainsignalin(t_class *c, int onset)
 {
+    if (!c)
+    {
+        bug("class_domainsignalin");
+        return;
+    }
     if (onset <= 0) onset = -1;
     else
     {
@@ -629,6 +709,11 @@ void class_set_extern_dir(t_symbol *s)
 
 char *class_gethelpdir(t_class *c)
 {
+    if (!c)
+    {
+        bug("class_gethelpdir");
+        return 0;
+    }
     return (c->c_externdir->s_name);
 }
 
@@ -639,21 +724,41 @@ static void class_nosavefn(t_gobj *z, t_binbuf *b)
 
 void class_setsavefn(t_class *c, t_savefn f)
 {
+    if (!c)
+    {
+        bug("class_setsavefn");
+        return;
+    }
     c->c_savefn = f;
 }
 
 t_savefn class_getsavefn(t_class *c)
 {
+    if (!c)
+    {
+        bug("class_getsavefn");
+        return 0;
+    }
     return (c->c_savefn);
 }
 
 void class_setpropertiesfn(t_class *c, t_propertiesfn f)
 {
+    if (!c)
+    {
+        bug("class_setpropertiesfn");
+        return;
+    }
     c->c_propertiesfn = f;
 }
 
 t_propertiesfn class_getpropertiesfn(t_class *c)
 {
+    if (!c)
+    {
+        bug("class_getpropertiesfn");
+        return 0;
+    }
     return (c->c_propertiesfn);
 }
 
-- 
GitLab