[tor-commits] [meek/master] Be more careful about terminating Firefox.
dcf at torproject.org
dcf at torproject.org
Tue Apr 30 21:09:07 UTC 2019
commit 1b3a72f3c7208dd7c0471bb3e9077667091874c8
Author: David Fifield <david at bamsoftware.com>
Date: Thu Apr 18 23:15:49 2019 -0600
Be more careful about terminating Firefox.
First send it a SIGTERM; then kill it if that doesn't work. On Windows,
just kill it immediately without waiting.
---
meek-client-torbrowser/meek-client-torbrowser.go | 14 ++++++++++++-
meek-client-torbrowser/terminate_other.go | 25 ++++++++++++++++--------
meek-client-torbrowser/terminate_windows.go | 6 ++++++
3 files changed, 36 insertions(+), 9 deletions(-)
diff --git a/meek-client-torbrowser/meek-client-torbrowser.go b/meek-client-torbrowser/meek-client-torbrowser.go
index 0f295ff..1274327 100644
--- a/meek-client-torbrowser/meek-client-torbrowser.go
+++ b/meek-client-torbrowser/meek-client-torbrowser.go
@@ -434,7 +434,19 @@ func main() {
}
if firefoxCmd != nil {
- logKill(firefoxCmd.Process)
+ err := terminateCmd(firefoxCmd)
+ // We terminate Firefox with SIGTERM, so don't log an error
+ // if the exit status is "terminated by SIGTERM."
+ if err2, ok := err.(*exec.ExitError); ok {
+ if status, ok := err2.Sys().(syscall.WaitStatus); ok {
+ if status.Signaled() && status.Signal() == syscall.SIGTERM {
+ err = nil
+ }
+ }
+ }
+ if err != nil {
+ log.Printf("error terminating firefox: %v", err)
+ }
}
if meekClientCmd != nil {
err := terminatePTCmd(meekClientCmd)
diff --git a/meek-client-torbrowser/terminate_other.go b/meek-client-torbrowser/terminate_other.go
index d38e27b..19bf2b8 100644
--- a/meek-client-torbrowser/terminate_other.go
+++ b/meek-client-torbrowser/terminate_other.go
@@ -5,22 +5,20 @@
package main
import (
+ "os/exec"
"syscall"
"time"
)
-// Terminate a PT subprocess: first close its stdin and send it SIGTERM; then
-// kill it if that doesn't work.
-func terminatePTCmd(cmd *ptCmd) error {
- err := cmd.StdinCloser.Close()
- err2 := cmd.Process.Signal(syscall.SIGTERM)
- if err == nil {
- err = err2
- }
+// Terminate a subprocess: first send it SIGTERM; then kill it if that doesn't
+// work.
+func terminateCmd(cmd *exec.Cmd) error {
+ err := cmd.Process.Signal(syscall.SIGTERM)
ch := make(chan error, 1)
go func() {
ch <- cmd.Wait()
}()
+ var err2 error
select {
case <-time.After(terminateTimeout):
err2 = cmd.Process.Kill()
@@ -31,3 +29,14 @@ func terminatePTCmd(cmd *ptCmd) error {
}
return err
}
+
+// Terminate a PT subprocess: first close its stdin and send it SIGTERM; then
+// kill it if that doesn't work.
+func terminatePTCmd(cmd *ptCmd) error {
+ err := cmd.StdinCloser.Close()
+ err2 := terminateCmd(cmd.Cmd)
+ if err == nil {
+ err = err2
+ }
+ return err
+}
diff --git a/meek-client-torbrowser/terminate_windows.go b/meek-client-torbrowser/terminate_windows.go
index c00c44f..0bbdcab 100644
--- a/meek-client-torbrowser/terminate_windows.go
+++ b/meek-client-torbrowser/terminate_windows.go
@@ -6,9 +6,15 @@
package main
import (
+ "os/exec"
"time"
)
+// Terminate a subprocess: on Windows all we can do is kill it.
+func terminateCmd(cmd *exec.Cmd) error {
+ return cmd.Process.Kill()
+}
+
// Terminate a PT subprocess: first close its stdin; then kill it if that
// doesn't work.
func terminatePTCmd(cmd *ptCmd) error {
More information about the tor-commits
mailing list