Loading fs/cifs/CHANGES +6 −0 Original line number Diff line number Diff line Version 1.58 ------------ Guard against buffer overruns in various UCS-2 to UTF-8 string conversions when the UTF-8 string is composed of unusually long (more than 4 byte) converted characters. Version 1.57 ------------ Improve support for multiple security contexts to the same server. We Loading fs/cifs/cifsfs.h +1 −1 Original line number Diff line number Diff line Loading @@ -100,5 +100,5 @@ extern long cifs_ioctl(struct file *filep, unsigned int cmd, unsigned long arg); extern const struct export_operations cifs_export_ops; #endif /* EXPERIMENTAL */ #define CIFS_VERSION "1.57" #define CIFS_VERSION "1.58" #endif /* _CIFSFS_H */ fs/cifs/inode.c +15 −6 Original line number Diff line number Diff line Loading @@ -962,13 +962,21 @@ cifs_rename_pending_delete(char *full_path, struct dentry *dentry, int xid) goto out_close; } /* * If dentry->d_inode is null (usually meaning the cached dentry * is a negative dentry) then we would attempt a standard SMB delete, but * if that fails we can not attempt the fall back mechanisms on EACESS * but will return the EACESS to the caller. Note that the VFS does not call * unlink on negative dentries currently. */ int cifs_unlink(struct inode *dir, struct dentry *dentry) { int rc = 0; int xid; char *full_path = NULL; struct inode *inode = dentry->d_inode; struct cifsInodeInfo *cifsInode = CIFS_I(inode); struct cifsInodeInfo *cifs_inode; struct super_block *sb = dir->i_sb; struct cifs_sb_info *cifs_sb = CIFS_SB(sb); struct cifsTconInfo *tcon = cifs_sb->tcon; Loading Loading @@ -1012,7 +1020,7 @@ int cifs_unlink(struct inode *dir, struct dentry *dentry) rc = cifs_rename_pending_delete(full_path, dentry, xid); if (rc == 0) drop_nlink(inode); } else if (rc == -EACCES && dosattr == 0) { } else if ((rc == -EACCES) && (dosattr == 0) && inode) { attrs = kzalloc(sizeof(*attrs), GFP_KERNEL); if (attrs == NULL) { rc = -ENOMEM; Loading @@ -1020,7 +1028,8 @@ int cifs_unlink(struct inode *dir, struct dentry *dentry) } /* try to reset dos attributes */ origattr = cifsInode->cifsAttrs; cifs_inode = CIFS_I(inode); origattr = cifs_inode->cifsAttrs; if (origattr == 0) origattr |= ATTR_NORMAL; dosattr = origattr & ~ATTR_READONLY; Loading @@ -1041,13 +1050,13 @@ int cifs_unlink(struct inode *dir, struct dentry *dentry) out_reval: if (inode) { cifsInode = CIFS_I(inode); cifsInode->time = 0; /* will force revalidate to get info cifs_inode = CIFS_I(inode); cifs_inode->time = 0; /* will force revalidate to get info when needed */ inode->i_ctime = current_fs_time(sb); } dir->i_ctime = dir->i_mtime = current_fs_time(sb); cifsInode = CIFS_I(dir); cifs_inode = CIFS_I(dir); CIFS_I(dir)->time = 0; /* force revalidate of dir as well */ kfree(full_path); Loading Loading
fs/cifs/CHANGES +6 −0 Original line number Diff line number Diff line Version 1.58 ------------ Guard against buffer overruns in various UCS-2 to UTF-8 string conversions when the UTF-8 string is composed of unusually long (more than 4 byte) converted characters. Version 1.57 ------------ Improve support for multiple security contexts to the same server. We Loading
fs/cifs/cifsfs.h +1 −1 Original line number Diff line number Diff line Loading @@ -100,5 +100,5 @@ extern long cifs_ioctl(struct file *filep, unsigned int cmd, unsigned long arg); extern const struct export_operations cifs_export_ops; #endif /* EXPERIMENTAL */ #define CIFS_VERSION "1.57" #define CIFS_VERSION "1.58" #endif /* _CIFSFS_H */
fs/cifs/inode.c +15 −6 Original line number Diff line number Diff line Loading @@ -962,13 +962,21 @@ cifs_rename_pending_delete(char *full_path, struct dentry *dentry, int xid) goto out_close; } /* * If dentry->d_inode is null (usually meaning the cached dentry * is a negative dentry) then we would attempt a standard SMB delete, but * if that fails we can not attempt the fall back mechanisms on EACESS * but will return the EACESS to the caller. Note that the VFS does not call * unlink on negative dentries currently. */ int cifs_unlink(struct inode *dir, struct dentry *dentry) { int rc = 0; int xid; char *full_path = NULL; struct inode *inode = dentry->d_inode; struct cifsInodeInfo *cifsInode = CIFS_I(inode); struct cifsInodeInfo *cifs_inode; struct super_block *sb = dir->i_sb; struct cifs_sb_info *cifs_sb = CIFS_SB(sb); struct cifsTconInfo *tcon = cifs_sb->tcon; Loading Loading @@ -1012,7 +1020,7 @@ int cifs_unlink(struct inode *dir, struct dentry *dentry) rc = cifs_rename_pending_delete(full_path, dentry, xid); if (rc == 0) drop_nlink(inode); } else if (rc == -EACCES && dosattr == 0) { } else if ((rc == -EACCES) && (dosattr == 0) && inode) { attrs = kzalloc(sizeof(*attrs), GFP_KERNEL); if (attrs == NULL) { rc = -ENOMEM; Loading @@ -1020,7 +1028,8 @@ int cifs_unlink(struct inode *dir, struct dentry *dentry) } /* try to reset dos attributes */ origattr = cifsInode->cifsAttrs; cifs_inode = CIFS_I(inode); origattr = cifs_inode->cifsAttrs; if (origattr == 0) origattr |= ATTR_NORMAL; dosattr = origattr & ~ATTR_READONLY; Loading @@ -1041,13 +1050,13 @@ int cifs_unlink(struct inode *dir, struct dentry *dentry) out_reval: if (inode) { cifsInode = CIFS_I(inode); cifsInode->time = 0; /* will force revalidate to get info cifs_inode = CIFS_I(inode); cifs_inode->time = 0; /* will force revalidate to get info when needed */ inode->i_ctime = current_fs_time(sb); } dir->i_ctime = dir->i_mtime = current_fs_time(sb); cifsInode = CIFS_I(dir); cifs_inode = CIFS_I(dir); CIFS_I(dir)->time = 0; /* force revalidate of dir as well */ kfree(full_path); Loading