ybelkadi updated this revision to Diff 32529.
ybelkadi added a comment.

Yes, the test passes, but as PR19246 reported intermittent failures, I thought 
I'd wait for the results of the tests run by the bots.

Here is an updated patch also enabling the test. Could you please commit it if 
it's accepted?


http://reviews.llvm.org/D12138

Files:
  source/Plugins/Process/Linux/NativeProcessLinux.cpp
  test/expression_command/call-restarts/TestCallThatRestarts.py

Index: test/expression_command/call-restarts/TestCallThatRestarts.py
===================================================================
--- test/expression_command/call-restarts/TestCallThatRestarts.py
+++ test/expression_command/call-restarts/TestCallThatRestarts.py
@@ -29,7 +29,6 @@
 
     @dwarf_test
     @skipIfFreeBSD # llvm.org/pr19246: intermittent failure
-    @expectedFailureLinux("llvm.org/pr19246")
     @skipIfDarwin # llvm.org/pr19246: intermittent failure
     @skipIfWindows # Test relies on signals, unsupported on Windows
     def test_with_dwarf(self):
Index: source/Plugins/Process/Linux/NativeProcessLinux.cpp
===================================================================
--- source/Plugins/Process/Linux/NativeProcessLinux.cpp
+++ source/Plugins/Process/Linux/NativeProcessLinux.cpp
@@ -554,7 +554,8 @@
         eDupStderrFailed,
         eChdirFailed,
         eExecFailed,
-        eSetGidFailed
+        eSetGidFailed,
+        eSetSigMaskFailed
     };
 
     // Child process.
@@ -629,6 +630,12 @@
             }
         }
 
+        // Clear the signal mask to prevent the child from being affected by
+        // any masking done by the parent.
+        sigset_t set;
+        if (sigemptyset(&set) != 0 || pthread_sigmask(SIG_SETMASK, &set, 
nullptr) != 0)
+            exit(eSetSigMaskFailed);
+
         // Execute.  We should never return...
         execve(argv[0],
                const_cast<char *const *>(argv),
@@ -686,6 +693,9 @@
             case eSetGidFailed:
                 error.SetErrorString("Child setgid failed.");
                 break;
+            case eSetSigMaskFailed:
+                error.SetErrorString("Child failed to set signal mask.");
+                break;
             default:
                 error.SetErrorString("Child returned unknown exit status.");
                 break;


Index: test/expression_command/call-restarts/TestCallThatRestarts.py
===================================================================
--- test/expression_command/call-restarts/TestCallThatRestarts.py
+++ test/expression_command/call-restarts/TestCallThatRestarts.py
@@ -29,7 +29,6 @@
 
     @dwarf_test
     @skipIfFreeBSD # llvm.org/pr19246: intermittent failure
-    @expectedFailureLinux("llvm.org/pr19246")
     @skipIfDarwin # llvm.org/pr19246: intermittent failure
     @skipIfWindows # Test relies on signals, unsupported on Windows
     def test_with_dwarf(self):
Index: source/Plugins/Process/Linux/NativeProcessLinux.cpp
===================================================================
--- source/Plugins/Process/Linux/NativeProcessLinux.cpp
+++ source/Plugins/Process/Linux/NativeProcessLinux.cpp
@@ -554,7 +554,8 @@
         eDupStderrFailed,
         eChdirFailed,
         eExecFailed,
-        eSetGidFailed
+        eSetGidFailed,
+        eSetSigMaskFailed
     };
 
     // Child process.
@@ -629,6 +630,12 @@
             }
         }
 
+        // Clear the signal mask to prevent the child from being affected by
+        // any masking done by the parent.
+        sigset_t set;
+        if (sigemptyset(&set) != 0 || pthread_sigmask(SIG_SETMASK, &set, nullptr) != 0)
+            exit(eSetSigMaskFailed);
+
         // Execute.  We should never return...
         execve(argv[0],
                const_cast<char *const *>(argv),
@@ -686,6 +693,9 @@
             case eSetGidFailed:
                 error.SetErrorString("Child setgid failed.");
                 break;
+            case eSetSigMaskFailed:
+                error.SetErrorString("Child failed to set signal mask.");
+                break;
             default:
                 error.SetErrorString("Child returned unknown exit status.");
                 break;
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to