]> git.vpit.fr Git - perl/modules/Test-Valgrind.git/commitdiff
Handle segfaults during suppressions generation gracefully
authorVincent Pit <perl@profvince.com>
Thu, 12 Nov 2015 12:19:02 +0000 (10:19 -0200)
committerVincent Pit <perl@profvince.com>
Thu, 12 Nov 2015 15:47:18 +0000 (13:47 -0200)
lib/Test/Valgrind/Action/Suppressions.pm
lib/Test/Valgrind/Parser.pm
lib/Test/Valgrind/Parser/Suppressions/Text.pm
lib/Test/Valgrind/Parser/XML/Twig.pm
lib/Test/Valgrind/Session.pm

index c100771b9fea0f335277a446bd5cb94a620fa961..6c34860b4c907628d4fd4b4a92d9b07635fb2aa5 100644 (file)
@@ -155,7 +155,8 @@ sub finish {
  open my $fh, '>', $target
                         or $self->_croak("open(\$fh, '>', \$self->target): $!");
 
- my (%seen, $id);
+ my $id = 0;
+ my %seen;
  for (sort { $a->data cmp $b->data }
        grep !$seen{$_->data}++, @{$self->{supps}}) {
   print $fh "{\n"
index 1101715db99c42a2f0591cfd2bb58dce44a89d98..8e89953c5ebb15cd6e3a738dfcb3e4cbcd8648c6 100644 (file)
@@ -55,9 +55,10 @@ sub args { }
 
 =head2 C<parse>
 
-    $tvp->parse($session, $fh);
+    my $aborted = $tvp->parse($session, $fh);
 
-Parse the output of the C<valgrind> process attached to the session C<$session> received through the filehandle C<$fh>.
+Parses the output of the C<valgrind> process attached to the session C<$session> received through the filehandle C<$fh>.
+Returns true when the output indicates that C<valgrind> has aborted.
 
 This method must be implemented when subclassing.
 
index 7692e834f87628ca077c60b5200b4fe35cce342e..7710e524d40722abec62c097955db45b6c4b7534 100644 (file)
@@ -45,7 +45,13 @@ sub parse {
  while (<$fh>) {
   s/^\s*#\s//;        # Strip comments
 
-  next if /^==/;      # Valgrind info line
+  if (/^==/) {        # Valgrind info line
+   if (/Signal 11 being dropped from thread/) {
+    # This might loop endlessly
+    return 1;
+   }
+   next;
+  }
 
   s/^\s*//;           # Strip leading spaces
   s/<[^>]+>//;        # Strip tags
@@ -103,6 +109,8 @@ sub parse {
   kind => 'Suppression',
   data => $_,
  )) for @supps, @extra;
+
+ return 0;
 }
 
 =head1 SEE ALSO
index 59801dea393516dacc45bc9e16b036cb669f8c4b..c58cf103ce5603cdc4c9edef36ce046024a4fe47 100644 (file)
@@ -86,7 +86,7 @@ sub parse {
 
  $self->protocol_version(undef);
 
- return;
+ return 0;
 }
 
 sub finish {
index da71b7876d92ebac3d9e493936fa60b2beb6d22b..b0069df7fdf1c2534218f2b644d42a75a8add912 100644 (file)
@@ -345,7 +345,9 @@ sub run {
 
  close $vwtr or $self->_croak("close(\$vwtr): $!");
 
- $self->parser->parse($self, $vrdr);
+ my $aborted = $self->parser->parse($self, $vrdr);
+
+ kill -(POSIX::SIGKILL()) => $pid if $aborted;
 
  $self->{exit_code} = (waitpid($pid, 0) == $pid) ? $? >> 8 : 255;