--- linux-2.5.3-pre4.o/fs/reiserfs/file.c Thu Jan 24 12:25:16 2002 +++ linux-2.5.3-pre4/fs/reiserfs/file.c Thu Jan 24 12:25:52 2002 @@ -102,6 +102,12 @@ return -EFBIG ; } + if ((((attr->ia_valid & ATTR_UID) && (attr->ia_uid & ~0xffff)) || + ((attr->ia_valid & ATTR_GID) && (attr->ia_gid & ~0xffff))) && + (get_inode_sd_version (inode) == STAT_DATA_V1)) + /* stat data of format v3.5 has 16 bit uid and gid */ + return -EINVAL; + error = inode_change_ok(inode, attr) ; if (!error) inode_setattr(inode, attr) ; --- linux-2.5.3-pre4.o/fs/reiserfs/inode.c Thu Jan 24 12:25:16 2002 +++ linux-2.5.3-pre4/fs/reiserfs/inode.c Thu Jan 24 12:25:52 2002 @@ -217,7 +217,7 @@ // files which were created in the earlier version can not be longer, // than 2 gb // -int file_capable (struct inode * inode, long block) +static int file_capable (struct inode * inode, long block) { if (get_inode_item_key_version (inode) != KEY_FORMAT_3_5 || // it is new file. block < (1 << (31 - inode->i_sb->s_blocksize_bits))) // old file, but 'block' is inside of 2gb @@ -1528,9 +1528,16 @@ REISERFS_I(inode)->i_trans_id = 0; REISERFS_I(inode)->i_trans_index = 0; - if (old_format_only (sb)) + if (old_format_only (sb)) { + if (inode->i_uid & ~0xffff || inode->i_gid & ~0xffff) { + pathrelse (&path_to_key); + /* i_uid or i_gid is too big to be stored in stat data v3.5 */ + iput (inode); + *err = -EINVAL; + return NULL; + } inode2sd_v1 (&sd, inode); - else + } else inode2sd (&sd, inode); // these do not go to on-disk stat data .