Author: dchagin
Date: Sun Mar 27 06:21:05 2016
New Revision: 297302
URL: https://svnweb.freebsd.org/changeset/base/297302

Log:
  MFC r297063:
     Whitespaces, style(9) fixes. No functional changes.
  
  MFC r297070:
    Return EOVERFLOW in case when actual statfs values are large enough and
    not fit into 32 bit fileds of a Linux struct statfs.
  
  MFC r297072:
  
    Check bsd_to_linux_statfs() return value.

Modified:
  stable/10/sys/compat/linux/linux_stats.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sys/compat/linux/linux_stats.c
==============================================================================
--- stable/10/sys/compat/linux/linux_stats.c    Sun Mar 27 06:17:19 2016        
(r297301)
+++ stable/10/sys/compat/linux/linux_stats.c    Sun Mar 27 06:21:05 2016        
(r297302)
@@ -256,7 +256,7 @@ static int
 stat_copyout(struct stat *buf, void *ubuf)
 {
        struct l_stat lbuf;
-       
+
        bzero(&lbuf, sizeof(lbuf));
        lbuf.st_dev = buf->st_dev;
        lbuf.st_ino = buf->st_ino;
@@ -302,7 +302,7 @@ linux_stat(struct thread *td, struct lin
                return (error);
        }
        LFREEPATH(path);
-       return(stat_copyout(&buf, args->up));
+       return (stat_copyout(&buf, args->up));
 }
 
 int
@@ -324,7 +324,7 @@ linux_lstat(struct thread *td, struct li
                return (error);
        }
        LFREEPATH(path);
-       return(stat_copyout(&buf, args->up));
+       return (stat_copyout(&buf, args->up));
 }
 #endif /* __i386__ || (__amd64__ && COMPAT_LINUX32) */
 
@@ -380,10 +380,22 @@ bsd_to_linux_ftype(const char *fstypenam
        return (0L);
 }
 
-static void
+static int
 bsd_to_linux_statfs(struct statfs *bsd_statfs, struct l_statfs *linux_statfs)
 {
+#if defined(__i386__) || (defined(__amd64__) && defined(COMPAT_LINUX32))
+       uint64_t tmp;
 
+#define        LINUX_HIBITS    0xffffffff00000000ULL
+
+       tmp = bsd_statfs->f_blocks | bsd_statfs->f_bfree | bsd_statfs->f_files |
+           bsd_statfs->f_bsize;
+       if ((bsd_statfs->f_bavail != -1 && (bsd_statfs->f_bavail & 
LINUX_HIBITS)) ||
+           (bsd_statfs->f_ffree != -1 && (bsd_statfs->f_ffree & LINUX_HIBITS)) 
||
+           (tmp & LINUX_HIBITS))
+               return (EOVERFLOW);
+#undef LINUX_HIBITS
+#endif
        linux_statfs->f_type = bsd_to_linux_ftype(bsd_statfs->f_fstypename);
        linux_statfs->f_bsize = bsd_statfs->f_bsize;
        linux_statfs->f_blocks = bsd_statfs->f_blocks;
@@ -394,6 +406,8 @@ bsd_to_linux_statfs(struct statfs *bsd_s
        linux_statfs->f_fsid.val[0] = bsd_statfs->f_fsid.val[0];
        linux_statfs->f_fsid.val[1] = bsd_statfs->f_fsid.val[1];
        linux_statfs->f_namelen = MAXNAMLEN;
+
+       return (0);
 }
 
 int
@@ -414,8 +428,10 @@ linux_statfs(struct thread *td, struct l
        LFREEPATH(path);
        if (error)
                return (error);
-       bsd_to_linux_statfs(&bsd_statfs, &linux_statfs);
-       return copyout(&linux_statfs, args->buf, sizeof(linux_statfs));
+       error = bsd_to_linux_statfs(&bsd_statfs, &linux_statfs);
+       if (error)
+               return (error);
+       return (copyout(&linux_statfs, args->buf, sizeof(linux_statfs)));
 }
 
 #if defined(__i386__) || (defined(__amd64__) && defined(COMPAT_LINUX32))
@@ -457,7 +473,7 @@ linux_statfs64(struct thread *td, struct
        if (error)
                return (error);
        bsd_to_linux_statfs64(&bsd_statfs, &linux_statfs);
-       return copyout(&linux_statfs, args->buf, sizeof(linux_statfs));
+       return (copyout(&linux_statfs, args->buf, sizeof(linux_statfs)));
 }
 
 int
@@ -495,9 +511,11 @@ linux_fstatfs(struct thread *td, struct 
 #endif
        error = kern_fstatfs(td, args->fd, &bsd_statfs);
        if (error)
-               return error;
-       bsd_to_linux_statfs(&bsd_statfs, &linux_statfs);
-       return copyout(&linux_statfs, args->buf, sizeof(linux_statfs));
+               return (error);
+       error = bsd_to_linux_statfs(&bsd_statfs, &linux_statfs);
+       if (error)
+               return (error);
+       return (copyout(&linux_statfs, args->buf, sizeof(linux_statfs)));
 }
 
 struct l_ustat
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-stable-10
To unsubscribe, send any mail to "[email protected]"

Reply via email to