]> go.fuhry.dev Git - fsnotify.git/commitdiff
Fix deadlock on BSD
authorCaleb Spare <cespare@gmail.com>
Thu, 21 Nov 2013 13:02:37 +0000 (05:02 -0800)
committerCaleb Spare <cespare@gmail.com>
Thu, 21 Nov 2013 13:02:37 +0000 (05:02 -0800)
The removeWatch routine could return without releasing the lock on
w.bufmut. This change unlocks the mutex before checking for errors.

fsnotify_bsd.go

index 9f7dbbf2653a91c001d09c5e59605c08354102ec..416382d2dfbbd72a5161a7ab4f07a9eb39e0613d 100644 (file)
@@ -245,12 +245,12 @@ func (w *Watcher) removeWatch(path string) error {
        watchEntry := &w.kbuf[0]
        syscall.SetKevent(watchEntry, watchfd, syscall.EVFILT_VNODE, syscall.EV_DELETE)
        success, errno := syscall.Kevent(w.kq, w.kbuf[:], nil, nil)
+       w.bufmut.Unlock()
        if success == -1 {
                return os.NewSyscallError("kevent_rm_watch", errno)
        } else if (watchEntry.Flags & syscall.EV_ERROR) == syscall.EV_ERROR {
                return errors.New("kevent rm error")
        }
-       w.bufmut.Unlock()
        syscall.Close(watchfd)
        w.wmut.Lock()
        delete(w.watches, path)