Author: ae
Date: Mon Jan 11 18:11:06 2016
New Revision: 293679
URL: https://svnweb.freebsd.org/changeset/base/293679

Log:
  Change the type of newsize argument in the smbfs_smb_setfsize() function
  from int to int64.
  MSDN says that SMB_SET_FILE_END_OF_FILE_INFO uses signed 64-bit integer
  to specify offset, but since smbfs_smb_setfsize() has used plain int,
  a value was truncated in case when offset was larger than 2G.
        https://msdn.microsoft.com/en-us/library/ff469975.aspx
  
  In particular, now `truncate -s 10G` will work correctly on the mounted
  SMB share.
  
  Reported and tested by:       Eugene Grosbein <eugen at grosbein dot net>
  MFC after:    1 week

Modified:
  head/sys/fs/smbfs/smbfs_smb.c
  head/sys/fs/smbfs/smbfs_subr.h
  head/sys/fs/smbfs/smbfs_vnops.c

Modified: head/sys/fs/smbfs/smbfs_smb.c
==============================================================================
--- head/sys/fs/smbfs/smbfs_smb.c       Mon Jan 11 17:57:49 2016        
(r293678)
+++ head/sys/fs/smbfs/smbfs_smb.c       Mon Jan 11 18:11:06 2016        
(r293679)
@@ -333,18 +333,18 @@ smbfs_smb_flush(struct smbnode *np, stru
 }
 
 int
-smbfs_smb_setfsize(struct smbnode *np, int newsize, struct smb_cred *scred)
+smbfs_smb_setfsize(struct smbnode *np, int64_t newsize, struct smb_cred *scred)
 {
        struct smb_share *ssp = np->n_mount->sm_share;
        struct smb_rq *rqp;
        struct mbchain *mbp;
        int error;
 
-       if (!smbfs_smb_seteof(np, (int64_t) newsize, scred)) {
+       if (!smbfs_smb_seteof(np, newsize, scred)) {
                np->n_flag |= NFLUSHWIRE;
                return (0);
        }
-
+       /* XXX: We should use SMB_COM_WRITE_ANDX to support large offsets */
        error = smb_rq_alloc(SSTOCP(ssp), SMB_COM_WRITE, scred, &rqp);
        if (error)
                return (error);
@@ -352,7 +352,7 @@ smbfs_smb_setfsize(struct smbnode *np, i
        smb_rq_wstart(rqp);
        mb_put_mem(mbp, (caddr_t)&np->n_fid, 2, MB_MSYSTEM);
        mb_put_uint16le(mbp, 0);
-       mb_put_uint32le(mbp, newsize);
+       mb_put_uint32le(mbp, (uint32_t)newsize);
        mb_put_uint16le(mbp, 0);
        smb_rq_wend(rqp);
        smb_rq_bstart(rqp);

Modified: head/sys/fs/smbfs/smbfs_subr.h
==============================================================================
--- head/sys/fs/smbfs/smbfs_subr.h      Mon Jan 11 17:57:49 2016        
(r293678)
+++ head/sys/fs/smbfs/smbfs_subr.h      Mon Jan 11 18:11:06 2016        
(r293679)
@@ -128,7 +128,8 @@ int  smbfs_smb_lock(struct smbnode *np, 
        off_t start, off_t end, struct smb_cred *scred);
 int  smbfs_smb_statfs(struct smb_share *ssp, struct statfs *sbp,
        struct smb_cred *scred);
-int  smbfs_smb_setfsize(struct smbnode *np, int newsize, struct smb_cred 
*scred);
+int  smbfs_smb_setfsize(struct smbnode *np, int64_t newsize,
+       struct smb_cred *scred);
 
 int  smbfs_smb_query_info(struct smbnode *np, const char *name, int len,
        struct smbfattr *fap, struct smb_cred *scred);

Modified: head/sys/fs/smbfs/smbfs_vnops.c
==============================================================================
--- head/sys/fs/smbfs/smbfs_vnops.c     Mon Jan 11 17:57:49 2016        
(r293678)
+++ head/sys/fs/smbfs/smbfs_vnops.c     Mon Jan 11 18:11:06 2016        
(r293679)
@@ -358,7 +358,8 @@ smbfs_setattr(ap)
                                doclose = 1;
                }
                if (error == 0)
-                       error = smbfs_smb_setfsize(np, vap->va_size, scred);
+                       error = smbfs_smb_setfsize(np,
+                           (int64_t)vap->va_size, scred);
                if (doclose)
                        smbfs_smb_close(ssp, np->n_fid, NULL, scred);
                if (error) {
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to