diff options
author | David Disseldorp <ddiss@suse.de> | 2011-01-26 14:32:01 -0800 |
---|---|---|
committer | Jeremy Allison <jra@samba.org> | 2011-01-27 00:59:56 +0100 |
commit | eb55338ccdc000feac92118553c5ce59bed87fa8 (patch) | |
tree | 1e7cd26602e90569c5f41c1ba3a50c426c181a42 | |
parent | efde1d870b6a8c2d5461d9ae6cab5d3f2cbffb83 (diff) | |
download | samba-eb55338ccdc000feac92118553c5ce59bed87fa8.tar.gz samba-eb55338ccdc000feac92118553c5ce59bed87fa8.tar.bz2 samba-eb55338ccdc000feac92118553c5ce59bed87fa8.zip |
Looking into printer driver issues, I ran across some peculiarities in
copy_file():
- Firstly, if the source file is zero bytes, NT_STATUS_DISK_FULL is
returned.
- Secondly, the conditional lseek is confusing. It fires when
OPENX_FILE_EXISTS_OPEN is set and I can't see why the lseek is
necessary in this case.
- Finally, the lseek error path also results in NT_STATUS_DISK_FULL.
Proposed fix for first and third point below.
Autobuild-User: Jeremy Allison <jra@samba.org>
Autobuild-Date: Thu Jan 27 00:59:56 CET 2011 on sn-devel-104
-rw-r--r-- | source3/smbd/reply.c | 19 |
1 files changed, 11 insertions, 8 deletions
diff --git a/source3/smbd/reply.c b/source3/smbd/reply.c index 4d3be85a85..f7265e010d 100644 --- a/source3/smbd/reply.c +++ b/source3/smbd/reply.c @@ -6789,20 +6789,23 @@ NTSTATUS copy_file(TALLOC_CTX *ctx, goto out; } - if ((ofun&3) == 1) { - if(SMB_VFS_LSEEK(fsp2,0,SEEK_END) == -1) { - DEBUG(0,("copy_file: error - vfs lseek returned error %s\n", strerror(errno) )); - /* - * Stop the copy from occurring. - */ - ret = -1; - smb_fname_src->st.st_ex_size = 0; + if (ofun & OPENX_FILE_EXISTS_OPEN) { + ret = SMB_VFS_LSEEK(fsp2, 0, SEEK_END); + if (ret == -1) { + DEBUG(0, ("error - vfs lseek returned error %s\n", + strerror(errno))); + status = map_nt_error_from_unix(errno); + close_file(NULL, fsp1, ERROR_CLOSE); + close_file(NULL, fsp2, ERROR_CLOSE); + goto out; } } /* Do the actual copy. */ if (smb_fname_src->st.st_ex_size) { ret = vfs_transfer_file(fsp1, fsp2, smb_fname_src->st.st_ex_size); + } else { + ret = 0; } close_file(NULL, fsp1, NORMAL_CLOSE); |