diff options
author | наб <nabijaczleweli@nabijaczleweli.xyz> | 2021-04-11 19:27:43 +0200 |
---|---|---|
committer | Brian Behlendorf <behlendorf1@llnl.gov> | 2021-05-19 20:00:08 -0700 |
commit | 774c7f3720d04f7c21b11f692b25dba80187538e (patch) | |
tree | e602f8867797ff1e99ae377e9655fd176028cc99 | |
parent | 2b68f21d0fc847d013a7e44ecaf17701823b06aa (diff) |
libshare: nfs: don't leak nfs_lock_fd when lock fails
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: George Wilson <gwilson@delphix.com>
Signed-off-by: Ahelenia Ziemiańska <nabijaczleweli@nabijaczleweli.xyz>
Closes #11886
-rw-r--r-- | lib/libshare/os/freebsd/nfs.c | 13 | ||||
-rw-r--r-- | lib/libshare/os/linux/nfs.c | 13 |
2 files changed, 18 insertions, 8 deletions
diff --git a/lib/libshare/os/freebsd/nfs.c b/lib/libshare/os/freebsd/nfs.c index 5951b9eaf..9cd7dfa95 100644 --- a/lib/libshare/os/freebsd/nfs.c +++ b/lib/libshare/os/freebsd/nfs.c @@ -65,17 +65,22 @@ static int nfs_lock_fd = -1; static int nfs_exports_lock(void) { + int err; + nfs_lock_fd = open(ZFS_EXPORTS_LOCK, O_RDWR | O_CREAT, 0600); if (nfs_lock_fd == -1) { + err = errno; fprintf(stderr, "failed to lock %s: %s\n", - ZFS_EXPORTS_LOCK, strerror(errno)); - return (errno); + ZFS_EXPORTS_LOCK, strerror(err)); + return (err); } if (flock(nfs_lock_fd, LOCK_EX) != 0) { + err = errno; fprintf(stderr, "failed to lock %s: %s\n", - ZFS_EXPORTS_LOCK, strerror(errno)); - return (errno); + ZFS_EXPORTS_LOCK, strerror(err)); + (void) close(nfs_lock_fd); + return (err); } return (0); } diff --git a/lib/libshare/os/linux/nfs.c b/lib/libshare/os/linux/nfs.c index 1efa321b7..d5b463b4a 100644 --- a/lib/libshare/os/linux/nfs.c +++ b/lib/libshare/os/linux/nfs.c @@ -65,17 +65,22 @@ static int nfs_lock_fd = -1; static int nfs_exports_lock(void) { + int err; + nfs_lock_fd = open(ZFS_EXPORTS_LOCK, O_RDWR | O_CREAT, 0600); if (nfs_lock_fd == -1) { + err = errno; fprintf(stderr, "failed to lock %s: %s\n", - ZFS_EXPORTS_LOCK, strerror(errno)); - return (errno); + ZFS_EXPORTS_LOCK, strerror(err)); + return (err); } if (flock(nfs_lock_fd, LOCK_EX) != 0) { + err = errno; fprintf(stderr, "failed to lock %s: %s\n", - ZFS_EXPORTS_LOCK, strerror(errno)); - return (errno); + ZFS_EXPORTS_LOCK, strerror(err)); + (void) close(nfs_lock_fd); + return (err); } return (0); } |