]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
Added fixes to return correct error codes on space allocation fail.
authorJeremy Allison <jra@samba.org>
Tue, 7 Aug 2001 01:19:32 +0000 (01:19 +0000)
committerJeremy Allison <jra@samba.org>
Tue, 7 Aug 2001 01:19:32 +0000 (01:19 +0000)
Jeremy.

source/smbd/reply.c
source/smbd/trans2.c

index a956261a78a67f53e62fd8f40e826a499ddf5cfd..d31c83da9bc826322b1dc9f716f64331043bac51 100644 (file)
@@ -2442,8 +2442,32 @@ int reply_writeunlock(connection_struct *conn, char *inbuf,char *outbuf, int siz
 }
 
 /****************************************************************************
-  reply to a write
+ Return correct error for space allocation fail.
 ****************************************************************************/
+
+int allocate_space_error(char *inbuf,char *outbuf, int errno_val)
+{
+       errno = errno_val;
+       if (!(global_client_caps & CAP_STATUS32))
+               return (UNIXERROR(ERRHRD,ERRdiskfull));
+
+       /* Use more specific WNT/W2K error codes. */
+#ifdef EDQUOT
+       if (errno_val == ENOSPC || errno_val == EDQUOT) {
+#else
+       if (errno_val == ENOSPC) {
+#endif
+               SSVAL(outbuf,smb_flg2,SVAL(outbuf, smb_flg2) | FLAGS2_32_BIT_ERROR_CODES);
+               return(ERROR(0,errno == ENOSPC ? NT_STATUS_DISK_FULL : NT_STATUS_QUOTA_EXCEEDED));
+       }
+
+       return (UNIXERROR(ERRHRD,ERRdiskfull));
+}
+
+/****************************************************************************
+ Reply to a write.
+****************************************************************************/
+
 int reply_write(connection_struct *conn, char *inbuf,char *outbuf,int size,int dum_buffsize)
 {
   size_t numtowrite;
@@ -2479,6 +2503,11 @@ int reply_write(connection_struct *conn, char *inbuf,char *outbuf,int size,int d
   if(numtowrite == 0) {
       /* This is actually an allocate call, not set EOF. JRA */
       nwritten = vfs_allocate_file_space(fsp, (SMB_OFF_T)startpos);
+      if (nwritten < 0) {
+        int ret = allocate_space_error(inbuf, outbuf, errno);
+        END_PROFILE(SMBwrite);
+               return ret;
+      }
   } else
     nwritten = write_file(fsp,data,startpos,numtowrite);
   
index bb7ca6e0f840e5ea09ea342acb79aa41a891c107..26b376ec2dbf59bbf8cf4fcda47f99d1f618e5bb 100644 (file)
@@ -1928,7 +1928,7 @@ static int call_trans2setfilepathinfo(connection_struct *conn,
       }
 
       if (ret == -1)
-        return(UNIXERROR(ERRHRD,ERRdiskfull));
+               return allocate_space_error(inbuf, outbuf, errno);
 
       sbuf.st_size = size;
       break;