Linux 4.4.263
Greg Kroah-Hartman
maintainerI'm announcing the release of the 4.4.263 kernel.
All users of the 4.4 kernel series must upgrade.
The updated 4.4.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-4.4.y
and can be browsed at the normal kernel.org git web browser:
https://git.kernel.org/?p=linux/kernel/git/stable/linux-stable.git;a=summary
thanks,
greg k-h
------------
Makefile | 2 arch/x86/kernel/apic/io_apic.c | 10 ++++ drivers/pci/hotplug/rpadlpar_sysfs.c | 14 ++---- drivers/platform/chrome/cros_ec_dev.c | 4 + drivers/platform/chrome/cros_ec_proto.c | 4 - drivers/scsi/lpfc/lpfc_debugfs.c | 4 - drivers/usb/gadget/composite.c | 4 - drivers/usb/gadget/configfs.c | 16 ++++--- drivers/usb/gadget/usbstring.c | 4 - fs/btrfs/ctree.c | 2 fs/ext4/block_validity.c | 71 ++++++++++++++------------------ fs/ext4/ext4.h | 6 +- fs/ext4/extents.c | 16 ++----- fs/ext4/indirect.c | 6 -- fs/ext4/inode.c | 13 ++--- fs/ext4/mballoc.c | 4 - fs/ext4/namei.c | 29 ++++++++++++- fs/ext4/super.c | 5 +- include/linux/mfd/cros_ec.h | 6 +- include/uapi/linux/usb/ch9.h | 3 + kernel/irq/manage.c | 4 + net/sunrpc/svc_xprt.c | 4 - 22 files changed, 138 insertions(+), 93 deletions(-)
Dan Carpenter (1):
scsi: lpfc: Fix some error codes in debugfs
Filipe Manana (1):
btrfs: fix race when cloning extent buffer during rewind of an old root
Greg Kroah-Hartman (1):
Linux 4.4.263
Gwendal Grignou (1):
platform/chrome: cros_ec_dev - Fix security issue
Jan Kara (3):
ext4: handle error of ext4_setup_system_zone() on remount
ext4: don't allow overlapping system zones
ext4: check journal inode extents more carefully
Jim Lin (1):
usb: gadget: configfs: Fix KASAN use-after-free
Joe Korty (1):
NFSD: Repair misuse of sv_lock in 5.10.16-rt30.
Macpaul Lin (1):
USB: replace hardcode maximum usb string length by definition
Shijie Luo (1):
ext4: fix potential error in ext4_do_update_inode
Thomas Gleixner (2):
x86/ioapic: Ignore IRQ2 again
genirq: Disable interrupts for force threaded handlers
Tyrel Datwyler (1):
PCI: rpadlpar: Fix potential drc_name corruption in store functions
zhangyi (F) (1):
ext4: find old entry again if failed to rename whiteout
Greg Kroah-Hartman
maintainerMakefile +1 -1
@@ -1,6 +1,6 @@ VERSION = 4 PATCHLEVEL = 4 -SUBLEVEL = 262 +SUBLEVEL = 263 EXTRAVERSION = NAME = Blurry Fish Butt
arch/x86/kernel/apic/io_apic.c +10 -0
@@ -1040,6 +1040,16 @@ static int mp_map_pin_to_irq(u32 gsi, int idx, int ioapic, int pin,if (idx >=0 &&test_bit (mp_irqs[idx].srcbus, mp_bus_not_pci)) { irq = mp_irqs[idx].srcbusirq; legacy =mp_is_legacy_irq (irq); +/* +* IRQ2 is unusable for historical reasons on systems which +* have a legacy PIC. See the comment vs. IRQ2 further down. +* +* If this gets removed at some point then the related code +* in lapic_assign_system_vectors() needs to be adjusted as +* well. +*/ +if (legacy && irq ==PIC_CASCADE_IR ) +return -EINVAL ; }mutex_lock (&ioapic_mutex);
drivers/pci/hotplug/rpadlpar_sysfs.c +6 -8
@@ -39,12 +39,11 @@ static ssize_t add_slot_store(struct kobject *kobj, struct kobj_attribute *attr,if (nbytes >=MAX_DRC_NAME_LEN )return 0 ; -memcpy (drc_name, buf, nbytes); +strscpy (drc_name, buf, nbytes +1 ); end =strchr (drc_name,'\n' ); -if (!end) - end = &drc_name[nbytes]; - *end ='\0' ; +if (end) + *end ='\0' ; rc =dlpar_add_slot (drc_name);if (rc)
@@ -70,12 +69,11 @@ static ssize_t remove_slot_store(struct kobject *kobj,if (nbytes >=MAX_DRC_NAME_LEN )return 0 ; -memcpy (drc_name, buf, nbytes); +strscpy (drc_name, buf, nbytes +1 ); end =strchr (drc_name,'\n' ); -if (!end) - end = &drc_name[nbytes]; - *end ='\0' ; +if (end) + *end ='\0' ; rc =dlpar_remove_slot (drc_name);if (rc)
drivers/platform/chrome/cros_ec_dev.c +4 -0
@@ -137,6 +137,10 @@ static long ec_device_ioctl_xcmd(struct cros_ec_dev *ec, void __user *arg)if (copy_from_user (&u_cmd, arg,sizeof (u_cmd)))return -EFAULT ; +if ((u_cmd.outsize >EC_MAX_MSG_BYTES ) || + (u_cmd.insize >EC_MAX_MSG_BYTES )) +return -EINVAL ; + s_cmd =kmalloc (sizeof (*s_cmd) +max (u_cmd.outsize, u_cmd.insize),GFP_KERNEL );if (!s_cmd)
drivers/platform/chrome/cros_ec_proto.c +2 -2
@@ -311,8 +311,8 @@ int cros_ec_query_all(struct cros_ec_device *ec_dev) ec_dev->max_response =EC_PROTO2_MAX_PARAM_SIZE ; ec_dev->max_passthru =0 ; ec_dev->pkt_xfer =NULL ; - ec_dev->din_size =EC_MSG_BYTES ; - ec_dev->dout_size =EC_MSG_BYTES ; + ec_dev->din_size =EC_PROTO2_MSG_BYTES ; + ec_dev->dout_size =EC_PROTO2_MSG_BYTES ; }else {/* * It's possible for a test to occur too early when
drivers/scsi/lpfc/lpfc_debugfs.c +2 -2
@@ -1061,7 +1061,7 @@ lpfc_debugfs_dif_err_write(struct file *file, const char __user *buf,memset (dstbuf,0 ,32 ); size = (nbytes <32 ) ? nbytes :32 ;if (copy_from_user (dstbuf, buf, size)) -return 0 ; +return -EFAULT ;if (dent == phba->debug_InjErrLBA) {if ((buf[0 ] =='o' ) && (buf[1 ] =='f' ) && (buf[2 ] =='f' ))
@@ -1069,7 +1069,7 @@ lpfc_debugfs_dif_err_write(struct file *file, const char __user *buf, }if ((tmp ==0 ) && (kstrtoull (dstbuf,0 , &tmp))) -return 0 ; +return -EINVAL ;if (dent == phba->debug_writeGuard) phba->lpfc_injerr_wgrd_cnt = (uint32_t )tmp;
drivers/usb/gadget/composite.c +2 -2
@@ -933,7 +933,7 @@ static void collect_langs(struct usb_gadget_strings **sp, __le16 *buf)while (*sp) { s = *sp; language =cpu_to_le16 (s->language); -for (tmp = buf; *tmp && tmp < &buf[126 ]; tmp++) { +for (tmp = buf; *tmp && tmp < &buf[USB_MAX_STRING_LEN ]; tmp++) {if (*tmp == language) goto repeat; }
@@ -1008,7 +1008,7 @@ static int get_string(struct usb_composite_dev *cdev,collect_langs (sp, s->wData); } -for (len =0 ; len <=126 && s->wData[len]; len++) +for (len =0 ; len <=USB_MAX_STRING_LEN && s->wData[len]; len++)continue ;if (!len)return -EINVAL ;
drivers/usb/gadget/configfs.c +11 -5
@@ -111,21 +111,27 @@ struct gadget_config_name {struct list_head list; }; +#define USB_MAX_STRING_WITH_NULL_LEN (USB_MAX_STRING_LEN+1) +static int usb_string_copy (const char *s,char **s_copy) {int ret;char *str;char *copy = *s_copy; ret =strlen (s); -if (ret >126 ) +if (ret >USB_MAX_STRING_LEN )return -EOVERFLOW ; - str =kstrdup (s,GFP_KERNEL ); -if (!str) -return -ENOMEM ; +if (copy) { + str = copy; + }else { + str =kmalloc (USB_MAX_STRING_WITH_NULL_LEN ,GFP_KERNEL ); +if (!str) +return -ENOMEM ; + } +strcpy (str, s);if (str[ret -1 ] =='\n' ) str[ret -1 ] ='\0' ; -kfree (copy); *s_copy = str;return 0 ; }
drivers/usb/gadget/usbstring.c +2 -2
@@ -59,9 +59,9 @@ usb_gadget_get_string (struct usb_gadget_strings *table, int id, u8 *buf)return -EINVAL ;/* string descriptors have length, tag, then UTF16-LE text */ - len =min ((size_t )126 ,strlen (s->s)); + len =min ((size_t )USB_MAX_STRING_LEN ,strlen (s->s)); len =utf8s_to_utf16s (s->s, len,UTF16_LITTLE_ENDIAN , - (wchar_t *) &buf[2 ],126 ); + (wchar_t *) &buf[2 ],USB_MAX_STRING_LEN );if (len <0 )return -EINVAL ; buf [0 ] = (len +1 ) *2 ;
fs/btrfs/ctree.c +2 -0
@@ -1431,7 +1431,9 @@ get_old_root(struct btrfs_root *root, u64 time_seq)btrfs_warn (root->fs_info,"failed to read tree block %llu from get_old_root" , logical); }else { +btrfs_tree_read_lock (old); eb =btrfs_clone_extent_buffer (old); +btrfs_tree_read_unlock (old);free_extent_buffer (old); } }else if (old_root) {
fs/ext4/block_validity.c +33 -38
141 lines not on this page · raw message
fs/ext4/ext4.h +3 -3
@@ -3134,9 +3134,9 @@ extern void ext4_release_system_zone(struct super_block *sb);extern int ext4_setup_system_zone (struct super_block *sb);extern int __init ext4_init_system_zone (void );extern void ext4_exit_system_zone (void ); -extern int ext4_data_block_valid (struct ext4_sb_info *sbi, -ext4_fsblk_t start_blk, -unsigned int count); +extern int ext4_inode_block_valid (struct inode *inode, +ext4_fsblk_t start_blk, +unsigned int count);extern int ext4_check_blockref (const char *,unsigned int ,struct inode *,__le32 *,unsigned int );
fs/ext4/extents.c +6 -10
@@ -384,7 +384,7 @@ static int ext4_valid_extent(struct inode *inode, struct ext4_extent *ext)*/ if (lblock + len <= lblock)return 0 ; -return ext4_data_block_valid (EXT4_SB (inode->i_sb), block, len); +return ext4_inode_block_valid (inode, block, len); } static int ext4_valid_extent_idx(struct inode *inode,
@@ -392,7 +392,7 @@ static int ext4_valid_extent_idx(struct inode *inode, {ext4_fsblk_t block =ext4_idx_pblock (ext_idx); -return ext4_data_block_valid (EXT4_SB (inode->i_sb), block,1 ); +return ext4_inode_block_valid (inode, block,1 ); } static int ext4_valid_extent_entries(struct inode *inode,
@@ -549,14 +549,10 @@ __read_extent_tree_block(const char *function, unsigned int line, }if (buffer_verified (bh) && !(flags &EXT4_EX_FORCE_CACHE ))return bh; -if (!ext4_has_feature_journal (inode->i_sb) || - (inode->i_ino != -le32_to_cpu (EXT4_SB (inode->i_sb)->s_es->s_journal_inum))) { - err =__ext4_ext_check (function, line, inode, -ext_block_hdr (bh), depth, pblk); -if (err) - goto errout; - } + err =__ext4_ext_check (function, line, inode, +ext_block_hdr (bh), depth, pblk); +if (err) + goto errout;set_buffer_verified (bh);/* * If this is a leaf block, cache all of its entries
fs/ext4/indirect.c +2 -4
@@ -946,8 +946,7 @@ static int ext4_clear_blocks(handle_t *handle, struct inode *inode,else if (ext4_should_journal_data (inode)) flags |=EXT4_FREE_BLOCKS_FORGET ; -if (!ext4_data_block_valid (EXT4_SB (inode->i_sb), block_to_free, - count)) { +if (!ext4_inode_block_valid (inode, block_to_free, count)) {EXT4_ERROR_INODE (inode,"attempt to clear invalid " "blocks %llu len %lu" , (unsigned long long ) block_to_free, count);
@@ -1109,8 +1108,7 @@ static void ext4_free_branches(handle_t *handle, struct inode *inode,if (!nr)continue ;/* A hole */ -if (!ext4_data_block_valid (EXT4_SB (inode->i_sb), - nr,1 )) { +if (!ext4_inode_block_valid (inode, nr,1 )) { EXT4_ERROR_INODE(inode, "invalid indirect mapped " "block %lu (level %d)",
fs/ext4/inode.c +6 -7
@@ -381,8 +381,7 @@ static int __check_block_validity(struct inode *inode, const char *func, (inode->i_ino == le32_to_cpu(EXT4_SB(inode->i_sb)->s_es->s_journal_inum)))return 0 ; -if (!ext4_data_block_valid (EXT4_SB (inode->i_sb), map->m_pblk, - map->m_len)) { +if (!ext4_inode_block_valid (inode, map->m_pblk, map->m_len)) { ext4_error_inode(inode, func, line, map->m_pblk, "lblock %lu mapped to illegal pblock %llu " "(length %d)", (unsigned long) map->m_lblk,
@@ -4437,7 +4436,7 @@ struct inode *__ext4_iget(struct super_block *sb, unsigned long ino, ret =0 ;if (ei->i_file_acl && - !ext4_data_block_valid (EXT4_SB (sb), ei->i_file_acl,1 )) { + !ext4_inode_block_valid (inode, ei->i_file_acl,1 )) {ext4_error_inode (inode, function, line,0 ,"iget: bad extended attribute block %llu" , ei->i_file_acl);
@@ -4627,7 +4626,7 @@ static int ext4_do_update_inode(handle_t *handle,struct ext4_inode_info *ei =EXT4_I (inode);struct buffer_head *bh = iloc->bh;struct super_block *sb = inode->i_sb; -int err =0 , rc, block; +int err =0 , block;int need_datasync =0 , set_large_file =0 ;uid_t i_uid;gid_t i_gid;
@@ -4727,9 +4726,9 @@ static int ext4_do_update_inode(handle_t *handle, bh->b_data);BUFFER_TRACE (bh,"call ext4_handle_dirty_metadata" ); - rc =ext4_handle_dirty_metadata (handle,NULL , bh); -if (!err) - err = rc; + err =ext4_handle_dirty_metadata (handle,NULL , bh); +if (err) + goto out_brelse;ext4_clear_inode_state (inode,EXT4_STATE_NEW );if (set_large_file) {BUFFER_TRACE (EXT4_SB (sb)->s_sbh,"get write access" );
fs/ext4/mballoc.c +2 -2
@@ -2960,7 +2960,7 @@ ext4_mb_mark_diskspace_used(struct ext4_allocation_context *ac, block =ext4_grp_offs_to_block (sb, &ac->ac_b_ex); len =EXT4_C2B (sbi, ac->ac_b_ex.fe_len); -if (!ext4_data_block_valid (sbi, block, len)) { +if (!ext4_inode_block_valid (ac->ac_inode, block, len)) {ext4_error (sb,"Allocating blocks %llu-%llu which overlap " "fs metadata" , block, block+len);/* File system mounted not to panic on error
@@ -4718,7 +4718,7 @@ void ext4_free_blocks(handle_t *handle, struct inode *inode, sbi =EXT4_SB (sb);if (!(flags &EXT4_FREE_BLOCKS_VALIDATED ) && - !ext4_data_block_valid (sbi, block, count)) { + !ext4_inode_block_valid (inode, block, count)) {ext4_error (sb,"Freeing blocks not in datazone - " "block = %llu, count = %lu" , block, count); goto error_return;
fs/ext4/namei.c +27 -2
@@ -3375,6 +3375,31 @@ static int ext4_setent(handle_t *handle, struct ext4_renament *ent,return 0 ; } +static void ext4_resetent (handle_t *handle,struct ext4_renament *ent, +unsigned ino,unsigned file_type) +{ +struct ext4_renament old = *ent; +int retval =0 ; + +/* +* old->de could have moved from under us during make indexed dir, +* so the old->de may no longer valid and need to find it again +* before reset old inode info. +*/ + old.bh =ext4_find_entry (old.dir, &old.dentry->d_name, &old.de,NULL ); +if (IS_ERR (old.bh)) + retval =PTR_ERR (old.bh); +if (!old.bh) + retval = -ENOENT ; +if (retval) { +ext4_std_error (old.dir->i_sb, retval); +return ; + } + +ext4_setent (handle, &old, ino, file_type); +brelse (old.bh); +} +static int ext4_find_delete_entry (handle_t *handle,struct inode *dir,const struct qstr *d_name) {
@@ -3674,8 +3699,8 @@ static int ext4_rename(struct inode *old_dir, struct dentry *old_dentry, end_rename:if (whiteout) {if (retval) { -ext4_setent (handle, &old, - old.inode->i_ino, old_file_type); +ext4_resetent (handle, &old, + old.inode->i_ino, old_file_type);drop_nlink (whiteout); }unlock_new_inode (whiteout);
fs/ext4/super.c +4 -1
@@ -4968,7 +4968,10 @@ static int ext4_remount(struct super_block *sb, int *flags, char *data)ext4_register_li_request (sb, first_not_zeroed); } -ext4_setup_system_zone (sb); + err =ext4_setup_system_zone (sb); +if (err) + goto restore_opts; +if (sbi->s_journal ==NULL && !(old_sb_flags &MS_RDONLY ))ext4_commit_super (sb,1 );
include/linux/mfd/cros_ec.h +4 -2
@@ -50,9 +50,11 @@ enum {EC_MSG_TX_TRAILER_BYTES ,EC_MSG_RX_PROTO_BYTES =3 , -/* Max length of messages */ -EC_MSG_BYTES =EC_PROTO2_MAX_PARAM_SIZE + +/* Max length of messages for proto 2*/ +EC_PROTO2_MSG_BYTES =EC_PROTO2_MAX_PARAM_SIZE +EC_MSG_TX_PROTO_BYTES , + + EC_MAX_MSG_BYTES = 64 * 1024, };/*
include/uapi/linux/usb/ch9.h +3 -0
@@ -333,6 +333,9 @@ struct usb_config_descriptor {/*-------------------------------------------------------------------------*/ +/* USB String descriptors can contain at most 126 characters. */ +#define USB_MAX_STRING_LEN 126 +/* USB_DT_STRING: String descriptor */ struct usb_string_descriptor {__u8 bLength;
kernel/irq/manage.c +4 -0
@@ -872,11 +872,15 @@ irq_forced_thread_fn(struct irq_desc *desc, struct irqaction *action)irqreturn_t ret;local_bh_disable (); +if (!IS_ENABLED (CONFIG_PREEMPT_RT_BASE )) +local_irq_disable (); ret = action->thread_fn (action->irq, action->dev_id);if (ret ==IRQ_HANDLED )atomic_inc (&desc->threads_handled);irq_finalize_oneshot (desc, action); +if (!IS_ENABLED (CONFIG_PREEMPT_RT_BASE )) +local_irq_enable ();local_bh_enable ();return ret; }
net/sunrpc/svc_xprt.c +2 -2
@@ -1011,7 +1011,7 @@ static int svc_close_list(struct svc_serv *serv, struct list_head *xprt_list, ststruct svc_xprt *xprt;int ret =0 ; -spin_lock (&serv->sv_lock); +spin_lock_bh (&serv->sv_lock);list_for_each_entry (xprt, xprt_list, xpt_list) {if (xprt->xpt_net != net)continue ;
@@ -1019,7 +1019,7 @@ static int svc_close_list(struct svc_serv *serv, struct list_head *xprt_list, stset_bit (XPT_CLOSE , &xprt->xpt_flags);svc_xprt_enqueue (xprt); } -spin_unlock (&serv->sv_lock); +spin_unlock_bh (&serv->sv_lock);return ret; }