From d772b35143b627689fe1b40e6b5ba3cd6cfcab7c Mon Sep 17 00:00:00 2001 From: Shobhit Agarwal Date: Thu, 23 Feb 2017 16:26:35 -0800 Subject: [PATCH] pkg/lock: Close the file descriptor on unsuccessful locking NewLock() opens a new file descriptor to lock on but if file is already locked, Try*Lock() methods return error without closing the corresponding file descriptor. --- pkg/lock/file.go | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/pkg/lock/file.go b/pkg/lock/file.go index 78b59d2da6..589ff0c253 100644 --- a/pkg/lock/file.go +++ b/pkg/lock/file.go @@ -62,6 +62,7 @@ func TryExclusiveLock(path string, lockType LockType) (*FileLock, error) { } err = l.TryExclusiveLock() if err != nil { + l.Close() return nil, err } return l, err @@ -79,10 +80,12 @@ func (l *FileLock) ExclusiveLock() error { // It will block if an exclusive lock is already held on the file/directory. func ExclusiveLock(path string, lockType LockType) (*FileLock, error) { l, err := NewLock(path, lockType) - if err == nil { - err = l.ExclusiveLock() + if err != nil { + return nil, err } + err = l.ExclusiveLock() if err != nil { + l.Close() return nil, err } return l, nil @@ -109,6 +112,7 @@ func TrySharedLock(path string, lockType LockType) (*FileLock, error) { } err = l.TrySharedLock() if err != nil { + l.Close() return nil, err } return l, nil @@ -131,6 +135,7 @@ func SharedLock(path string, lockType LockType) (*FileLock, error) { } err = l.SharedLock() if err != nil { + l.Close() return nil, err } return l, nil @@ -179,10 +184,12 @@ func NewLock(path string, lockType LockType) (*FileLock, error) { var stat syscall.Stat_t err = syscall.Fstat(lfd, &stat) if err != nil { + l.Close() return nil, err } // Check if the file is a regular file if lockType == RegFile && !(stat.Mode&syscall.S_IFMT == syscall.S_IFREG) { + l.Close() return nil, ErrNotRegular }