summaryrefslogtreecommitdiffstats
path: root/source3
diff options
context:
space:
mode:
authorNoel Power <noel.power@suse.com>2014-11-04 16:52:49 +0100
committerDavid Disseldorp <ddiss@samba.org>2014-11-04 20:51:02 +0100
commit6faef4d213e76077bdbaf83cf07f0261c11dc757 (patch)
tree4377702f8bb6fa8a8f02f8758c7387a38bb9e80d /source3
parent7467f6e72cba214eeca75c34e9d9fba354c7ef31 (diff)
downloadsamba-6faef4d213e76077bdbaf83cf07f0261c11dc757.tar.gz
samba-6faef4d213e76077bdbaf83cf07f0261c11dc757.tar.xz
samba-6faef4d213e76077bdbaf83cf07f0261c11dc757.zip
btrfs: don't leak opened directory handle
Closing a directory handle file descriptor via close() is undefined, according to: http://pubs.opengroup.org/onlinepubs/9699919799/functions/dirfd.html Signed-off-by: Noel Power <noel.power@suse.com> Reviewed-by: David Disseldorp <ddiss@samba.org> Reviewed-by: Jeremy Allison <jra@samba.org> Autobuild-User(master): David Disseldorp <ddiss@samba.org> Autobuild-Date(master): Tue Nov 4 20:51:02 CET 2014 on sn-devel-104
Diffstat (limited to 'source3')
-rw-r--r--source3/modules/vfs_btrfs.c22
1 files changed, 16 insertions, 6 deletions
diff --git a/source3/modules/vfs_btrfs.c b/source3/modules/vfs_btrfs.c
index c1e17b301e..51442391ce 100644
--- a/source3/modules/vfs_btrfs.c
+++ b/source3/modules/vfs_btrfs.c
@@ -245,23 +245,29 @@ static NTSTATUS btrfs_get_compression(struct vfs_handle_struct *handle,
int fd;
bool opened = false;
NTSTATUS status;
+ DIR *dir = NULL;
if ((fsp != NULL) && (fsp->fh->fd != -1)) {
fd = fsp->fh->fd;
} else if (smb_fname != NULL) {
if (S_ISDIR(smb_fname->st.st_ex_mode)) {
- DIR *dir = opendir(smb_fname->base_name);
+ dir = opendir(smb_fname->base_name);
if (dir == NULL) {
return NT_STATUS_UNSUCCESSFUL;
}
+ opened = true;
fd = dirfd(dir);
+ if (fd < 0) {
+ status = NT_STATUS_UNSUCCESSFUL;
+ goto err_close;
+ }
} else {
fd = open(smb_fname->base_name, O_RDONLY);
+ if (fd < 0) {
+ return NT_STATUS_UNSUCCESSFUL;
+ }
+ opened = true;
}
- if (fd < 0) {
- return NT_STATUS_UNSUCCESSFUL;
- }
- opened = true;
} else {
return NT_STATUS_INVALID_PARAMETER;
}
@@ -281,7 +287,11 @@ static NTSTATUS btrfs_get_compression(struct vfs_handle_struct *handle,
status = NT_STATUS_OK;
err_close:
if (opened) {
- close(fd);
+ if (dir != NULL) {
+ closedir(dir);
+ } else {
+ close(fd);
+ }
}
return status;