[tor-commits] [sandboxed-tor-browser/master] Bug 20993: Handle the lock file better.

yawning at torproject.org yawning at torproject.org
Thu Dec 15 20:15:53 UTC 2016


commit f2ae16a227ad0a1baa301fdd6c38c8460e9396ff
Author: Yawning Angel <yawning at schwanenlied.me>
Date:   Thu Dec 15 20:14:18 2016 +0000

    Bug 20993: Handle the lock file better.
    
    Instead of relying on creating the lock file with O_EXCL, just use
    `flock()`, so that users don't need to manually remove the lock file if
    the app crashes.
---
 ChangeLog                                       |  1 +
 src/cmd/sandboxed-tor-browser/internal/ui/ui.go | 13 +++++++++++--
 2 files changed, 12 insertions(+), 2 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 5e3ee14..01e28d9 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,5 @@
 Changes in version 0.0.3 - UNRELEASED:
+ * Bug 20993: Handle the lock file better.
  * Bug 20970: Firefox crashes if the security slider is left at the default
    on certain pages.
  * Bug 20973: Silence Gdk warnings on systems with integrated png loader.
diff --git a/src/cmd/sandboxed-tor-browser/internal/ui/ui.go b/src/cmd/sandboxed-tor-browser/internal/ui/ui.go
index cd9a8c1..973024c 100644
--- a/src/cmd/sandboxed-tor-browser/internal/ui/ui.go
+++ b/src/cmd/sandboxed-tor-browser/internal/ui/ui.go
@@ -31,6 +31,7 @@ import (
 	"os/exec"
 	"path/filepath"
 	"strings"
+	"syscall"
 
 	"git.schwanenlied.me/yawning/grab.git"
 	"git.schwanenlied.me/yawning/hpkp.git"
@@ -328,7 +329,6 @@ type lockFile struct {
 
 func (l *lockFile) unlock() {
 	defer l.f.Close()
-	os.Remove(l.f.Name())
 }
 
 func newLockFile(c *Common) (*lockFile, error) {
@@ -338,9 +338,18 @@ func newLockFile(c *Common) (*lockFile, error) {
 	p := filepath.Join(c.Cfg.RuntimeDir, lockFileName)
 
 	var err error
-	if l.f, err = os.OpenFile(p, os.O_CREATE|os.O_EXCL, utils.FileMode); err != nil {
+	if l.f, err = os.OpenFile(p, os.O_CREATE, utils.FileMode); err != nil {
 		return nil, err
 	}
+
+	fd := int(l.f.Fd())
+	if err = syscall.Flock(fd, syscall.LOCK_EX|syscall.LOCK_NB); err != nil {
+		if err == syscall.EWOULDBLOCK {
+			return nil, fmt.Errorf("`sandboxed-tor-browser` is already running")
+		}
+		return nil, err
+	}
+
 	return l, nil
 }
 



More information about the tor-commits mailing list