Don't rollback when TxnScopeGuard dtor is run twice ghpr/rejected/inspiring_3d56e026
Nick Wellnhofer [Wed, 22 Oct 2014 21:12:39 +0000 (23:12 +0200)]
Modules like Plack::Middleware::StackTrace save a reference to the
guard object when a (nested) rollback exception is thrown during
destruction resulting in the destructor being called twice. Inactivate
the guard after the first rollback.

lib/DBIx/Class/Storage/TxnScopeGuard.pm

index 7cb3737..9d10265 100644 (file)
@@ -106,6 +106,12 @@ sub DESTROY {
     }
   }
 
+  # Modules like Plack::Middleware::StackTrace save a reference to the
+  # guard object when a (nested) rollback exception is thrown resulting
+  # in the destructor being called twice. Inactivating the guard protects
+  # against trying to rollback a second time.
+  $self->{inactivated} = 1;
+
   $@ = $exception;
 }