From 23c9d32d7d82b2cbf1e1d484d7a78c9ff067b63a Mon Sep 17 00:00:00 2001
From: Jonathan Wilkes <jon.w.wilkes@gmail.com>
Date: Sun, 23 Oct 2016 12:22:48 -0400
Subject: [PATCH] fix crasher with scalar dialog handling of vector data

---
 pd/nw/dialog_data.html |  2 +-
 pd/src/g_readwrite.c   | 13 +++++++++++--
 2 files changed, 12 insertions(+), 3 deletions(-)

diff --git a/pd/nw/dialog_data.html b/pd/nw/dialog_data.html
index 626930215..9f7b1ba5a 100644
--- a/pd/nw/dialog_data.html
+++ b/pd/nw/dialog_data.html
@@ -62,7 +62,7 @@ function apply() {
     data_string += ";\n";
     // now tack on any vector data we may have
     if (vector_textarea) {
-        data_string += vector_textarea.textContent;
+        data_string += vector_textarea.value;
         // strip off the trailing semicolon. Otherwise Pd will crash...
         data_string = data_string.slice(0, -1);
     }
diff --git a/pd/src/g_readwrite.c b/pd/src/g_readwrite.c
index 8258f3076..1b39cc6d5 100644
--- a/pd/src/g_readwrite.c
+++ b/pd/src/g_readwrite.c
@@ -341,8 +341,17 @@ void canvas_dataproperties(t_canvas *x, t_scalar *sc, t_binbuf *b)
         && (template = template_findbyname(((t_scalar *)newone)->sc_template)))
     {
             /* copy new one to old one and delete new one */
-        memcpy(&((t_scalar *)oldone)->sc_vec, &((t_scalar *)newone)->sc_vec,
-            template->t_n * sizeof(t_word));
+        int i;
+        /* swap out the sc_vec field. That way we'll keep the one from
+           the new scalar, and the old one will get freed by word_free (which
+           gets called from pd_free below)
+        */
+        for (i = 0; i < template->t_n; i++)
+        {
+            t_word w = ((t_scalar *)newone)->sc_vec[i];
+            ((t_scalar *)newone)->sc_vec[i] = ((t_scalar *)oldone)->sc_vec[i];
+            ((t_scalar *)oldone)->sc_vec[i] = w;
+        }
         pd_free(&newone->g_pd);
         if (glist_isvisible(x))
         {
-- 
GitLab