summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorнаб <nabijaczleweli@nabijaczleweli.xyz>2021-04-11 19:27:43 +0200
committerBrian Behlendorf <behlendorf1@llnl.gov>2021-05-19 20:00:08 -0700
commit774c7f3720d04f7c21b11f692b25dba80187538e (patch)
treee602f8867797ff1e99ae377e9655fd176028cc99
parent2b68f21d0fc847d013a7e44ecaf17701823b06aa (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.c13
-rw-r--r--lib/libshare/os/linux/nfs.c13
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);
}