From d6cfcc7befced088f860f82816a54cdbb7a590ee Mon Sep 17 00:00:00 2001
From: Jonathan Wilkes <jon.w.wilkes@gmail.com>
Date: Fri, 11 Aug 2017 22:51:30 -0400
Subject: [PATCH] fix invalid reads in iemmatrix

---
 externals/iem/iemmatrix/src/mtx_bessel.c              | 4 ++--
 externals/iem/iemmatrix/src/mtx_eig.c                 | 2 +-
 externals/iem/iemmatrix/src/mtx_ei~.c                 | 7 +++++++
 externals/iem/iemmatrix/src/mtx_spherical_harmonics.c | 2 +-
 externals/iem/iemmatrix/src/mtx_spherical_radial.c    | 4 ++--
 5 files changed, 13 insertions(+), 6 deletions(-)

diff --git a/externals/iem/iemmatrix/src/mtx_bessel.c b/externals/iem/iemmatrix/src/mtx_bessel.c
index 458100cc1..8d61c367d 100644
--- a/externals/iem/iemmatrix/src/mtx_bessel.c
+++ b/externals/iem/iemmatrix/src/mtx_bessel.c
@@ -83,7 +83,7 @@ static void *newMTXBessel (t_symbol *s, int argc, t_atom *argv)
   x->h_re = 0; 
   x->h_im = 0; 
   x->l=0;
-  fsym=atom_getsymbol(argv);
+  fsym= argc ? atom_getsymbol(argv) : &s_;
   if (fsym->s_name!=0)
      whichfunction=fsym->s_name[0];
   switch (whichfunction) {
@@ -96,7 +96,7 @@ static void *newMTXBessel (t_symbol *s, int argc, t_atom *argv)
      case 'Y':
         x->list_h_im_out = outlet_new (&x->x_obj, gensym("matrix"));
   }
-  nmax=(int) atom_getfloat(argv+1);
+  nmax= argc > 1 ? (int) atom_getfloat(argv+1) : 0;
   if (nmax<0)
      nmax=0;
   x->nmax=nmax;
diff --git a/externals/iem/iemmatrix/src/mtx_eig.c b/externals/iem/iemmatrix/src/mtx_eig.c
index 1ab90c96f..e9474f0aa 100644
--- a/externals/iem/iemmatrix/src/mtx_eig.c
+++ b/externals/iem/iemmatrix/src/mtx_eig.c
@@ -114,7 +114,7 @@ static void *newMTXEig (t_symbol *s, int argc, t_atom *argv)
   
   x->list_l_out_re = outlet_new (&x->x_obj, gensym("list"));
   x->list_l_out_im = outlet_new (&x->x_obj, gensym("list"));
-  if (atom_getsymbol(argv)==gensym("v")) {
+  if (argc && atom_getsymbol(argv)==gensym("v")) {
      x->withevs=1;
      x->list_q_out_re = outlet_new (&x->x_obj, gensym("matrix"));
      x->list_q_out_im = outlet_new (&x->x_obj, gensym("matrix"));
diff --git a/externals/iem/iemmatrix/src/mtx_ei~.c b/externals/iem/iemmatrix/src/mtx_ei~.c
index e461bf269..5f8f7f22b 100755
--- a/externals/iem/iemmatrix/src/mtx_ei~.c
+++ b/externals/iem/iemmatrix/src/mtx_ei~.c
@@ -22,6 +22,7 @@ void *newMtxEITilde(t_symbol *s, int argc, t_atom *argv)
 {
    int sd=1;
    int sg=1;
+   t_atom sane_defaults[1];
    mtx_ei_tilde *x = (mtx_ei_tilde*) pd_new(mtx_ei_tilde_class);
    x->sig_in_left=0;
    x->sig_in_right=0;
@@ -32,6 +33,12 @@ void *newMtxEITilde(t_symbol *s, int argc, t_atom *argv)
    inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal);
    x->message_outlet=(t_outlet*)outlet_new(&x->x_obj,&s_list);
 
+   /* Prevent an invalid read */
+   if (!argc) {
+      SETFLOAT(sane_defaults, 0.);
+      argv = sane_defaults; 
+      argc = 1;
+   }
    if (argc > 2) {
       sd = atom_getint(argv++);
       sg = argc-1;
diff --git a/externals/iem/iemmatrix/src/mtx_spherical_harmonics.c b/externals/iem/iemmatrix/src/mtx_spherical_harmonics.c
index 8ecc9a4b9..72b22bb30 100644
--- a/externals/iem/iemmatrix/src/mtx_spherical_harmonics.c
+++ b/externals/iem/iemmatrix/src/mtx_spherical_harmonics.c
@@ -83,7 +83,7 @@ static void *newMTXSh (t_symbol *s, int argc, t_atom *argv)
   x->theta = 0; 
   x->ws = 0; 
   x->l=0;
-  nmax=(int) atom_getfloat(argv);
+  nmax= argc ? (int) atom_getfloat(argv) : 0;
   if (nmax<0)
      nmax=0;
   x->nmax=nmax;
diff --git a/externals/iem/iemmatrix/src/mtx_spherical_radial.c b/externals/iem/iemmatrix/src/mtx_spherical_radial.c
index 9f3fd6d66..703914e10 100644
--- a/externals/iem/iemmatrix/src/mtx_spherical_radial.c
+++ b/externals/iem/iemmatrix/src/mtx_spherical_radial.c
@@ -80,7 +80,7 @@ static void *newMTXSph (t_symbol *s, int argc, t_atom *argv)
   x->h_re = 0; 
   x->h_im = 0; 
   x->l=0;
-  fsym=atom_getsymbol(argv);
+  fsym= argc ? atom_getsymbol(argv) : &s_;
   if (fsym->s_name!=0)
      whichfunction=fsym->s_name[0];
   switch (whichfunction) {
@@ -93,7 +93,7 @@ static void *newMTXSph (t_symbol *s, int argc, t_atom *argv)
      case 'y':
         x->list_h_im_out = outlet_new (&x->x_obj, gensym("matrix"));
   }
-  nmax=(int) atom_getfloat(argv+1);
+  nmax= argc > 1 ? (int) atom_getfloat(argv+1) : 0;
   if (nmax<0)
      nmax=0;
   x->nmax=nmax;
-- 
GitLab