summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>2008-12-25 12:13:12 -0800
committerJeremy Allison <jra@samba.org>2008-12-25 12:13:12 -0800
commit5184baa9591640c7fac4574bad6c15f5c7302a87 (patch)
tree970c773018e1a38972551e37aa70e9bb21232393
parent45db33e73262d8e195a46fb96405dfb3dc43d6bc (diff)
downloadsamba-5184baa9591640c7fac4574bad6c15f5c7302a87.tar.gz
samba-5184baa9591640c7fac4574bad6c15f5c7302a87.tar.bz2
samba-5184baa9591640c7fac4574bad6c15f5c7302a87.zip
Fix bug #5990 - strict allocate should be checked before ftruncate
reported by and based on a patch by Yasuma Takeda <yasuma@osstech.co.jp>. Jeremy.
-rw-r--r--source3/modules/vfs_default.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/source3/modules/vfs_default.c b/source3/modules/vfs_default.c
index 8fa8f6ae06..d7f3922974 100644
--- a/source3/modules/vfs_default.c
+++ b/source3/modules/vfs_default.c
@@ -740,6 +740,20 @@ static int strict_allocate_ftruncate(vfs_handle_struct *handle, files_struct *fs
if (st.st_size > len)
return sys_ftruncate(fsp->fh->fd, len);
+ /* available disk space is enough or not? */
+ if (lp_strict_allocate(SNUM(fsp->conn))){
+ uint64_t space_avail;
+ uint64_t bsize,dfree,dsize;
+
+ space_avail = get_dfree_info(conn,fsp->fsp_name,false,&bsize,&dfree,&dsize);
+ /* space_avail is 1k blocks */
+ if (space_avail == (SMB_BIG_UINT)-1 ||
+ ((SMB_BIG_UINT)space_to_write/1024 > space_avail) ) {
+ errno = ENOSPC;
+ return -1;
+ }
+ }
+
/* Write out the real space on disk. */
if (SMB_VFS_LSEEK(fsp, st.st_size, SEEK_SET) != st.st_size)
return -1;