diff options
| author | Noel Power <noel.power@suse.com> | 2014-11-04 16:52:49 +0100 |
|---|---|---|
| committer | David Disseldorp <ddiss@samba.org> | 2014-11-04 20:51:02 +0100 |
| commit | 6faef4d213e76077bdbaf83cf07f0261c11dc757 (patch) | |
| tree | 4377702f8bb6fa8a8f02f8758c7387a38bb9e80d /source3 | |
| parent | 7467f6e72cba214eeca75c34e9d9fba354c7ef31 (diff) | |
| download | samba-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.c | 22 |
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; |
