On Fri, May 11, 2012 at 04:52:33PM +0100, Dave Mitchell wrote:
> On Fri, May 11, 2012 at 04:22:18PM +0100, Tim Bunce wrote:
> > Dave, I'd be grateful if you could take a look at this since it
> > seems to involve our recent changes and standard perl modules.
> 
> I can reproduce. Am looking into it.

now fixed with the attached patch.
Basically creating a thread from within another thread would cause a
crash, because mg_ptr wasn't being updated during CV duplication: this
field contains a pointer back to the CV to allow mg_dup to access it;
after duplication it still pointed back to the original, so duping a dup
caused the crash.

-- 
Any [programming] language that doesn't occasionally surprise the
novice will pay for it by continually surprising the expert.
   -- Larry Wall
Index: DBI.xs
===================================================================
--- DBI.xs      (revision 15303)
+++ DBI.xs      (working copy)
@@ -283,6 +283,7 @@
     CV *ncv = (CV*)ptr_table_fetch(PL_ptr_table, (cv));
 
     (void)param; /* avoid 'unused variable' warning */
+    mg->mg_ptr = (char *)ncv;
     ima = (dbi_ima_t*) CvXSUBANY(cv).any_ptr;
     Newx(nima, 1, dbi_ima_t);
     *nima = *ima; /* structure copy */
Index: t/35thrclone.t
===================================================================
--- t/35thrclone.t      (revision 15303)
+++ t/35thrclone.t      (working copy)
@@ -52,6 +52,11 @@
         cmp_ok($dbh->{Driver}->{Kids}, '==', 1, '... the Driver has one Kid')
                unless $DBI::PurePerl && ok(1);
     }
+
+    # RT #77137: a thread created from a thread was crashing the
+    # interpreter
+
+    threads->new(sub {})->join();
 }
 
 # load up the threads

Reply via email to