diff mbox

[committed] Fix issue with string options and nested gcc_jit_contexts

Message ID 1419020460-39674-1-git-send-email-dmalcolm@redhat.com
State New
Headers show

Commit Message

David Malcolm Dec. 19, 2014, 8:21 p.m. UTC
The change to dynamically-allocated string options in r218617
introduced an issue with nested contexts, which were simply taking a
copy of the string pointer, rather than owning their own buffer.

Visible as various read-after-free errors when running
test-nested-contexts.c under valgrind, where a child context's dtor
would free the string option, but which would then be reused by a new
sibling context.

Fix it by creating new buffers for string options for child contexts.

Committed to trunk as r218972.

With this, jit.sum has:
  # of expected passes		4888

gcc/jit/ChangeLog:
	* jit-recording.c (gcc::jit::recording::context::context): When
	copying string options from a parent context, take a copy of the
	underlying buffers, rather than simply copying the pointer.
---
 gcc/jit/jit-recording.c | 13 ++++++++-----
 1 file changed, 8 insertions(+), 5 deletions(-)
diff mbox

Patch

diff --git a/gcc/jit/jit-recording.c b/gcc/jit/jit-recording.c
index e52021d..d2b3a10 100644
--- a/gcc/jit/jit-recording.c
+++ b/gcc/jit/jit-recording.c
@@ -198,11 +198,14 @@  recording::context::context (context *parent_ctxt)
 
   if (parent_ctxt)
     {
-      /* Inherit options from parent.
-	 Note that the first memcpy means copying pointers to strings.  */
-      memcpy (m_str_options,
-	      parent_ctxt->m_str_options,
-	      sizeof (m_str_options));
+      /* Inherit options from parent.  */
+      for (unsigned i = 0;
+	   i < sizeof (m_str_options) / sizeof (m_str_options[0]);
+	   i++)
+	{
+	  const char *parent_opt = parent_ctxt->m_str_options[i];
+	  m_str_options[i] = parent_opt ? xstrdup (parent_opt) : NULL;
+	}
       memcpy (m_int_options,
 	      parent_ctxt->m_int_options,
 	      sizeof (m_int_options));