changeset 350:c927f461f731

Prevent resizes bigger than 2GBytes
author charles <charles>
date Wed, 10 Feb 2010 03:54:08 +0000
parents 9b5336e51f28
children c640f5d8f33e
files yaffs_fs.c
diffstat 1 files changed, 11 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/yaffs_fs.c
+++ b/yaffs_fs.c
@@ -32,7 +32,7 @@
  */
 
 const char *yaffs_fs_c_version =
-    "$Id: yaffs_fs.c,v 1.92 2010-01-19 21:16:30 charles Exp $";
+    "$Id: yaffs_fs.c,v 1.93 2010-02-10 03:54:08 charles Exp $";
 extern const char *yaffs_guts_c_version;
 
 #include <linux/version.h>
@@ -1662,14 +1662,20 @@ static int yaffs_rename(struct inode *ol
 static int yaffs_setattr(struct dentry *dentry, struct iattr *attr)
 {
 	struct inode *inode = dentry->d_inode;
-	int error;
+	int error = 0;
 	yaffs_Device *dev;
 
 	T(YAFFS_TRACE_OS,
 		("yaffs_setattr of object %d\n",
 		yaffs_InodeToObject(inode)->objectId));
 
-	error = inode_change_ok(inode, attr);
+	/* Fail if a requested resize >= 2GB */		
+	if (attr->ia_valid & ATTR_SIZE &&
+		(attr->ia_size >> 31))
+		error = -EINVAL;
+
+	if (error == 0)
+		error = inode_change_ok(inode, attr);
 	if (error == 0) {
 		int result;
 		if (!error){
@@ -1692,8 +1698,9 @@ static int yaffs_setattr(struct dentry *
 		yaffs_GrossUnlock(dev);
 
 	}
+
 	T(YAFFS_TRACE_OS,
-		("yaffs_setattr done\n"));
+		("yaffs_setattr done returning %d\n",error));
 
 	return error;
 }